diff --git a/.editorconfig b/.editorconfig index 0b70460a..53780b34 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,9 +10,6 @@ insert_final_newline = true [*.rs] indent_size = 4 -[*.{zig,zon}] -indent_size = 4 - [Makefile] indent_style = tab indent_size = 8 diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30f..00000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/.gitattributes b/.gitattributes index acd15fd1..1d9b8cb4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,4 +3,5 @@ /lib/src/unicode/*.h linguist-vendored /lib/src/unicode/LICENSE linguist-vendored +/cli/src/generate/prepare_grammar/*.json -diff Cargo.lock -diff diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 6be29e24..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,15 +0,0 @@ -# These are supported funding model platforms - -github: tree-sitter -patreon: # Replace with a single Patreon username -open_collective: tree-sitter # Replace with a single Open Collective username -ko_fi: amaanq -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -polar: # Replace with a single Polar username -buy_me_a_coffee: # Replace with a single Buy Me a Coffee username -thanks_dev: # Replace with a single thanks.dev username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 88437c52..4138c3a9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: Bug Report description: Report a problem -type: Bug +labels: [bug] body: - type: textarea attributes: @@ -13,11 +13,9 @@ body: attributes: label: "Steps to reproduce" placeholder: | - ```sh git clone --depth=1 https://github.com/tree-sitter/tree-sitter-ruby cd tree-sitter-ruby tree-sitter generate - ``` validations: required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 05b37e6f..388f3675 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,6 @@ name: Feature request description: Request an enhancement -type: Feature +labels: [enhancement] body: - type: markdown attributes: diff --git a/.github/actions/cache/action.yml b/.github/actions/cache/action.yml index f04dda31..cc816682 100644 --- a/.github/actions/cache/action.yml +++ b/.github/actions/cache/action.yml @@ -1,25 +1,24 @@ -name: Cache - -description: This action caches fixtures - +name: 'Cache' +description: "This action caches fixtures" outputs: cache-hit: - description: Cache hit - value: ${{ steps.cache.outputs.cache-hit }} - + description: 'Cache hit' + value: ${{ steps.cache_output.outputs.cache-hit }} runs: - using: composite + using: "composite" steps: - uses: actions/cache@v4 - id: cache + id: cache_fixtures with: path: | test/fixtures/grammars target/release/tree-sitter-*.wasm key: fixtures-${{ join(matrix.*, '_') }}-${{ hashFiles( - 'crates/generate/src/**', - 'lib/src/parser.h', - 'lib/src/array.h', - 'lib/src/alloc.h', + 'cli/src/generate/**', + 'script/generate-fixtures*', 'test/fixtures/grammars/*/**/src/*.c', '.github/actions/cache/action.yml') }} + + - run: echo "cache-hit=${{ steps.cache_fixtures.outputs.cache-hit }}" >> $GITHUB_OUTPUT + shell: bash + id: cache_output diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c75a67e6..ccba319b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,8 +4,6 @@ updates: directory: "/" schedule: interval: "weekly" - cooldown: - default-days: 3 commit-message: prefix: "build(deps)" labels: @@ -14,16 +12,10 @@ updates: groups: cargo: patterns: ["*"] - ignore: - - dependency-name: "*" - update-types: ["version-update:semver-major", "version-update:semver-minor"] - - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" - cooldown: - default-days: 3 commit-message: prefix: "ci" labels: @@ -32,22 +24,3 @@ updates: groups: actions: patterns: ["*"] - - - package-ecosystem: "npm" - versioning-strategy: increase - directories: - - "/crates/npm" - - "/crates/eslint" - - "/lib/binding_web" - schedule: - interval: "weekly" - cooldown: - default-days: 3 - commit-message: - prefix: "build(deps)" - labels: - - "dependencies" - - "npm" - groups: - npm: - patterns: ["*"] diff --git a/.github/scripts/close_spam.js b/.github/scripts/close_spam.js deleted file mode 100644 index 41046964..00000000 --- a/.github/scripts/close_spam.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = async ({ github, context }) => { - let target = context.payload.issue; - if (target) { - await github.rest.issues.update({ - ...context.repo, - issue_number: target.number, - state: "closed", - state_reason: "not_planned", - title: "[spam]", - body: "", - type: null, - }); - } else { - target = context.payload.pull_request; - await github.rest.pulls.update({ - ...context.repo, - pull_number: target.number, - state: "closed", - title: "[spam]", - body: "", - }); - } - - await github.rest.issues.lock({ - ...context.repo, - issue_number: target.number, - lock_reason: "spam", - }); -}; diff --git a/.github/scripts/cross.sh b/.github/scripts/cross.sh new file mode 100755 index 00000000..a52f0873 --- /dev/null +++ b/.github/scripts/cross.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# set -x +set -e + +if [ "$BUILD_CMD" != "cross" ]; then + echo "cross.sh - is a helper to assist only in cross compiling environments" >&2 + echo "To use this tool set the BUILD_CMD env var to the \"cross\" value" >&2 + exit 111 +fi + +if [ -z "$CROSS_IMAGE" ]; then + echo "The CROSS_IMAGE env var should be provided" >&2 + exit 111 +fi + +docker run --rm -v /home/runner:/home/runner -w "$PWD" "$CROSS_IMAGE" "$@" diff --git a/.github/scripts/make.sh b/.github/scripts/make.sh new file mode 100755 index 00000000..79192541 --- /dev/null +++ b/.github/scripts/make.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# set -x +set -e + +if [ "$BUILD_CMD" == "cross" ]; then + if [ -z "$CC" ]; then + echo "make.sh: CC is not set" >&2 + exit 111 + fi + if [ -z "$AR" ]; then + echo "make.sh: AR is not set" >&2 + exit 111 + fi + + cross.sh make CC=$CC AR=$AR "$@" +else + make "$@" +fi diff --git a/.github/scripts/tree-sitter.sh b/.github/scripts/tree-sitter.sh new file mode 100755 index 00000000..0cac9153 --- /dev/null +++ b/.github/scripts/tree-sitter.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# set -x +set -e + +if [ -z "$ROOT" ]; then + echo "The ROOT env var should be set to absolute path of a repo root folder" >&2 + exit 111 +fi + +if [ -z "$TARGET" ]; then + echo "The TARGET env var should be equal to a \`cargo build --target \` command value" >&2 + exit 111 +fi + +tree_sitter="$ROOT"/target/"$TARGET"/release/tree-sitter + +if [ "$BUILD_CMD" == "cross" ]; then + if [ -z "$CROSS_RUNNER" ]; then + echo "The CROSS_RUNNER env var should be set to a CARGO_TARGET_*_RUNNER env var value" >&2 + echo "that is available in a docker image used by the cross tool under the hood" >&2 + exit 111 + fi + + cross.sh $CROSS_RUNNER "$tree_sitter" "$@" +else + "$tree_sitter" "$@" +fi diff --git a/.github/scripts/wasm_stdlib.js b/.github/scripts/wasm_stdlib.js deleted file mode 100644 index e1350094..00000000 --- a/.github/scripts/wasm_stdlib.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = async ({ github, context, core }) => { - if (context.eventName !== 'pull_request') return; - - const prNumber = context.payload.pull_request.number; - const owner = context.repo.owner; - const repo = context.repo.repo; - - const { data: files } = await github.rest.pulls.listFiles({ - owner, - repo, - pull_number: prNumber - }); - - const changedFiles = files.map(file => file.filename); - - const wasmStdLibSrc = 'crates/language/wasm/'; - const dirChanged = changedFiles.some(file => file.startsWith(wasmStdLibSrc)); - - if (!dirChanged) return; - - const wasmStdLibHeader = 'lib/src/wasm/wasm-stdlib.h'; - const requiredChanged = changedFiles.includes(wasmStdLibHeader); - - if (!requiredChanged) core.setFailed(`Changes detected in ${wasmStdLibSrc} but ${wasmStdLibHeader} was not modified.`); -}; diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 7caffa14..0c3ba6be 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -1,30 +1,27 @@ -name: Backport Pull Request - +name: backport on: pull_request_target: types: [closed, labeled] - -permissions: - contents: write - pull-requests: write - jobs: backport: + permissions: + contents: write + pull-requests: write + name: Backport Pull Request if: github.event.pull_request.merged runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - - name: Create app token - uses: actions/create-github-app-token@v2 + - uses: actions/create-github-app-token@v1 id: app-token with: app-id: ${{ vars.BACKPORT_APP }} private-key: ${{ secrets.BACKPORT_KEY }} - name: Create backport PR - uses: korthout/backport-action@v4 + id: backport + uses: korthout/backport-action@v3 with: pull_title: "${pull_title}" label_pattern: "^ci:backport ([^ ]+)$" diff --git a/.github/workflows/bindgen.yml b/.github/workflows/bindgen.yml deleted file mode 100644 index 1b0d20af..00000000 --- a/.github/workflows/bindgen.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Check Bindgen Output - -on: - pull_request: - paths: - - lib/include/tree_sitter/api.h - - lib/binding_rust/bindings.rs - push: - branches: [master] - paths: - - lib/include/tree_sitter/api.h - - lib/binding_rust/bindings.rs - -jobs: - check-bindgen: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up stable Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - - - name: Generate bindings - run: cargo xtask generate-bindings - - - name: Check if the bindgen output changed - run: git diff --exit-code lib/binding_rust/bindings.rs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5cde3db9..85624cbf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,14 @@ name: Build & Test +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: "-D warnings" + CROSS_DEBUG: 1 + on: workflow_call: inputs: - run-test: + run_test: default: true type: boolean @@ -16,296 +21,168 @@ jobs: fail-fast: false matrix: platform: - - linux-arm64 - - linux-arm - - linux-x64 - - linux-x86 - - linux-powerpc64 - - windows-arm64 - - windows-x64 - - windows-x86 - - macos-arm64 - - macos-x64 - - wasm32 + - linux-arm64 # + - linux-arm # + - linux-x64 # + - linux-x86 # + - linux-powerpc64 # + - windows-arm64 # + - windows-x64 # <-- No C library build - requires an additional adapted Makefile for `cl.exe` compiler + - windows-x86 # -- // -- + - macos-arm64 # + - macos-x64 # include: - # When adding a new `target`: - # 1. Define a new platform alias above - # 2. Add a new record to the matrix map in `crates/cli/npm/install.js` - - { platform: linux-arm64 , target: aarch64-unknown-linux-gnu , os: ubuntu-24.04-arm } - - { platform: linux-arm , target: armv7-unknown-linux-gnueabihf , os: ubuntu-24.04-arm } - - { platform: linux-x64 , target: x86_64-unknown-linux-gnu , os: ubuntu-24.04 } - - { platform: linux-x86 , target: i686-unknown-linux-gnu , os: ubuntu-24.04 } - - { platform: linux-powerpc64 , target: powerpc64-unknown-linux-gnu , os: ubuntu-24.04 } - - { platform: windows-arm64 , target: aarch64-pc-windows-msvc , os: windows-11-arm } - - { platform: windows-x64 , target: x86_64-pc-windows-msvc , os: windows-2025 } - - { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-2025 } - - { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-15 } - - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-15-intel } - - { platform: wasm32 , target: wasm32-unknown-unknown , os: ubuntu-24.04 } + # When adding a new `target`: + # 1. Define a new platform alias above + # 2. Add a new record to a matrix map in `cli/npm/install.js` + - { platform: linux-arm64 , target: aarch64-unknown-linux-gnu , os: ubuntu-latest , use-cross: true } + - { platform: linux-arm , target: arm-unknown-linux-gnueabi , os: ubuntu-latest , use-cross: true } + - { platform: linux-x64 , target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 , cli_features: wasm } #2272 + - { platform: linux-x86 , target: i686-unknown-linux-gnu , os: ubuntu-latest , use-cross: true } + - { platform: linux-powerpc64 , target: powerpc64-unknown-linux-gnu , os: ubuntu-latest , use-cross: true } + - { platform: windows-arm64 , target: aarch64-pc-windows-msvc , os: windows-latest } + - { platform: windows-x64 , target: x86_64-pc-windows-msvc , os: windows-latest , cli_features: wasm } + - { platform: windows-x86 , target: i686-pc-windows-msvc , os: windows-latest } + - { platform: macos-arm64 , target: aarch64-apple-darwin , os: macos-14 , cli_features: wasm } + - { platform: macos-x64 , target: x86_64-apple-darwin , os: macos-12 , cli_features: wasm } - # Extra features - - { platform: linux-arm64 , features: wasm } - - { platform: linux-x64 , features: wasm } - - { platform: macos-arm64 , features: wasm } - - { platform: macos-x64 , features: wasm } + # Cross compilers for C library + - { platform: linux-arm64 , cc: aarch64-linux-gnu-gcc , ar: aarch64-linux-gnu-ar } + - { platform: linux-arm , cc: arm-linux-gnueabi-gcc , ar: arm-linux-gnueabi-ar } + - { platform: linux-x86 , cc: i686-linux-gnu-gcc , ar: i686-linux-gnu-ar } + - { platform: linux-powerpc64 , cc: powerpc64-linux-gnu-gcc , ar: powerpc64-linux-gnu-ar } - # Cross-compilation - - { platform: linux-arm , cross: true } - - { platform: linux-x86 , cross: true } - - { platform: linux-powerpc64 , cross: true } + # See #2041 tree-sitter issue + - { platform: windows-x64 , rust-test-threads: 1 } + - { platform: windows-x86 , rust-test-threads: 1 } - # Compile-only - - { platform: wasm32 , no-run: true } + # CLI only build + - { platform: windows-arm64 , cli-only: true } env: - CARGO_TERM_COLOR: always - RUSTFLAGS: -D warnings + BUILD_CMD: cargo + EXE: ${{ contains(matrix.target, 'windows') && '.exe' || '' }} defaults: run: shell: bash steps: - - name: Checkout repository - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - - name: Set up cross-compilation - if: matrix.cross - run: | - for target in armv7-unknown-linux-gnueabihf i686-unknown-linux-gnu powerpc64-unknown-linux-gnu; do - camel_target=${target//-/_}; target_cc=${target/-unknown/} - printf 'CC_%s=%s\n' "$camel_target" "${target_cc/v7/}-gcc" - printf 'AR_%s=%s\n' "$camel_target" "${target_cc/v7/}-ar" - printf 'CARGO_TARGET_%s_LINKER=%s\n' "${camel_target^^}" "${target_cc/v7/}-gcc" - done >> $GITHUB_ENV - { - printf 'CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUNNER=qemu-arm -L /usr/arm-linux-gnueabihf\n' - printf 'CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_RUNNER=qemu-ppc64 -L /usr/powerpc64-linux-gnu\n' - } >> $GITHUB_ENV - - - name: Get emscripten version - if: contains(matrix.features, 'wasm') - run: printf 'EMSCRIPTEN_VERSION=%s\n' "$(> $GITHUB_ENV + - name: Read Emscripten version + run: echo "EMSCRIPTEN_VERSION=$(cat cli/loader/emscripten-version)" >> $GITHUB_ENV - name: Install Emscripten - if: contains(matrix.features, 'wasm') + if: ${{ !matrix.cli-only && !matrix.use-cross }} uses: mymindstorm/setup-emsdk@v14 with: version: ${{ env.EMSCRIPTEN_VERSION }} - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 + - run: rustup toolchain install stable --profile minimal + - run: rustup target add ${{ matrix.target }} + - uses: Swatinem/rust-cache@v2 + + - name: Install cross + if: ${{ matrix.use-cross }} + uses: taiki-e/install-action@v2 with: - target: ${{ matrix.target }} + tool: cross - - name: Install cross-compilation toolchain - if: matrix.cross + - name: Build custom cross image + if: ${{ matrix.use-cross && matrix.os == 'ubuntu-latest' }} run: | - sudo apt-get update -qy - if [[ $PLATFORM == linux-arm ]]; then - sudo apt-get install -qy {binutils,gcc}-arm-linux-gnueabihf qemu-user - elif [[ $PLATFORM == linux-x86 ]]; then - sudo apt-get install -qy {binutils,gcc}-i686-linux-gnu - elif [[ $PLATFORM == linux-powerpc64 ]]; then - sudo apt-get install -qy {binutils,gcc}-powerpc64-linux-gnu qemu-user + target="${{ matrix.target }}" + image=ghcr.io/cross-rs/$target:custom + echo "CROSS_IMAGE=$image" >> $GITHUB_ENV + + echo "[target.$target]" >> Cross.toml + echo "image = \"$image\"" >> Cross.toml + echo "CROSS_CONFIG=$PWD/Cross.toml" >> $GITHUB_ENV + + echo "FROM ghcr.io/cross-rs/$target:edge" >> Dockerfile + echo "RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -" >> Dockerfile + echo "RUN apt-get update && apt-get -y install nodejs" >> Dockerfile + docker build -t $image . + + - name: Setup env extras + env: + RUST_TEST_THREADS: ${{ matrix.rust-test-threads }} + USE_CROSS: ${{ matrix.use-cross }} + TARGET: ${{ matrix.target }} + CC: ${{ matrix.cc }} + AR: ${{ matrix.ar }} + run: | + PATH="$PWD/.github/scripts:$PATH" + echo "$PWD/.github/scripts" >> $GITHUB_PATH + + echo "TREE_SITTER=tree-sitter.sh" >> $GITHUB_ENV + echo "TARGET=$TARGET" >> $GITHUB_ENV + echo "ROOT=$PWD" >> $GITHUB_ENV + + [ -n "$RUST_TEST_THREADS" ] && \ + echo "RUST_TEST_THREADS=$RUST_TEST_THREADS" >> $GITHUB_ENV + + [ -n "$CC" ] && echo "CC=$CC" >> $GITHUB_ENV + [ -n "$AR" ] && echo "AR=$AR" >> $GITHUB_ENV + + if [ "$USE_CROSS" == "true" ]; then + echo "BUILD_CMD=cross" >> $GITHUB_ENV + runner=$(BUILD_CMD=cross cross.sh bash -c "env | sed -nr '/^CARGO_TARGET_.*_RUNNER=/s///p'") + [ -n "$runner" ] && echo "CROSS_RUNNER=$runner" >> $GITHUB_ENV fi - env: - PLATFORM: ${{ matrix.platform }} - - name: Install MinGW and Clang (Windows x64 MSYS2) - if: matrix.platform == 'windows-x64' - uses: msys2/setup-msys2@v2 - with: - update: true - install: | - mingw-w64-x86_64-toolchain - mingw-w64-x86_64-clang - mingw-w64-x86_64-make - mingw-w64-x86_64-cmake + - name: Build C library + if: ${{ !contains(matrix.os, 'windows') }} # Requires an additional adapted Makefile for `cl.exe` compiler + run: make.sh -j CFLAGS="-Werror" - # TODO: Remove RUSTFLAGS="--cap-lints allow" once we use a wasmtime release that addresses - # the `mismatched-lifetime-syntaxes` lint - - name: Build wasmtime library (Windows x64 MSYS2) - if: contains(matrix.features, 'wasm') && matrix.platform == 'windows-x64' - run: | - mkdir -p target - WASMTIME_VERSION=$(cargo metadata --format-version=1 --locked --features wasm | \ - jq -r '.packages[] | select(.name == "wasmtime-c-api-impl") | .version') - curl -LSs "$WASMTIME_REPO/archive/refs/tags/v${WASMTIME_VERSION}.tar.gz" | tar xzf - -C target - cd target/wasmtime-${WASMTIME_VERSION} - cmake -S crates/c-api -B target/c-api \ - -DCMAKE_INSTALL_PREFIX="$PWD/artifacts" \ - -DWASMTIME_DISABLE_ALL_FEATURES=ON \ - -DWASMTIME_FEATURE_CRANELIFT=ON \ - -DWASMTIME_TARGET='x86_64-pc-windows-gnu' - cmake --build target/c-api && cmake --install target/c-api - printf 'CMAKE_PREFIX_PATH=%s\n' "$PWD/artifacts" >> $GITHUB_ENV - env: - WASMTIME_REPO: https://github.com/bytecodealliance/wasmtime - RUSTFLAGS: ${{ env.RUSTFLAGS }} --cap-lints allow + - name: Build wasm library + if: ${{ !matrix.cli-only && !matrix.use-cross }} # No sense to build on the same Github runner hosts many times + run: script/build-wasm - - name: Build C library (Windows x64 MSYS2 CMake) - if: matrix.platform == 'windows-x64' - shell: msys2 {0} - run: | - cmake -G Ninja -S . -B build/static \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ - -DTREE_SITTER_FEATURE_WASM=$WASM \ - -DCMAKE_C_COMPILER=clang - cmake --build build/static + - run: $BUILD_CMD build --release --target=${{ matrix.target }} --features=${{ matrix.cli_features }} - cmake -G Ninja -S . -B build/shared \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ - -DTREE_SITTER_FEATURE_WASM=$WASM \ - -DCMAKE_C_COMPILER=clang - cmake --build build/shared - rm -rf \ - build/{static,shared} \ - "${CMAKE_PREFIX_PATH}/artifacts" \ - target/wasmtime-${WASMTIME_VERSION} - env: - WASM: ${{ contains(matrix.features, 'wasm') && 'ON' || 'OFF' }} + - run: script/fetch-fixtures - # TODO: Remove RUSTFLAGS="--cap-lints allow" once we use a wasmtime release that addresses - # the `mismatched-lifetime-syntaxes` lint - - name: Build wasmtime library - if: contains(matrix.features, 'wasm') - run: | - mkdir -p target - WASMTIME_VERSION=$(cargo metadata --format-version=1 --locked --features wasm | \ - jq -r '.packages[] | select(.name == "wasmtime-c-api-impl") | .version') - curl -LSs "$WASMTIME_REPO/archive/refs/tags/v${WASMTIME_VERSION}.tar.gz" | tar xzf - -C target - cd target/wasmtime-${WASMTIME_VERSION} - cmake -S crates/c-api -B target/c-api \ - -DCMAKE_INSTALL_PREFIX="$PWD/artifacts" \ - -DWASMTIME_DISABLE_ALL_FEATURES=ON \ - -DWASMTIME_FEATURE_CRANELIFT=ON \ - -DWASMTIME_TARGET='${{ matrix.target }}' - cmake --build target/c-api && cmake --install target/c-api - printf 'CMAKE_PREFIX_PATH=%s\n' "$PWD/artifacts" >> $GITHUB_ENV - env: - WASMTIME_REPO: https://github.com/bytecodealliance/wasmtime - RUSTFLAGS: ${{ env.RUSTFLAGS }} --cap-lints allow - - - name: Build C library (make) - if: runner.os != 'Windows' - run: | - if [[ $PLATFORM == linux-arm ]]; then - CC=arm-linux-gnueabihf-gcc; AR=arm-linux-gnueabihf-ar - elif [[ $PLATFORM == linux-x86 ]]; then - CC=i686-linux-gnu-gcc; AR=i686-linux-gnu-ar - elif [[ $PLATFORM == linux-powerpc64 ]]; then - CC=powerpc64-linux-gnu-gcc; AR=powerpc64-linux-gnu-ar - else - CC=gcc; AR=ar - fi - make -j CFLAGS="$CFLAGS" CC=$CC AR=$AR - env: - PLATFORM: ${{ matrix.platform }} - CFLAGS: -g -Werror -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types - - - name: Build C library (CMake) - if: "!matrix.cross" - run: | - cmake -S . -B build/static \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ - -DTREE_SITTER_FEATURE_WASM=$WASM - cmake --build build/static --verbose - - cmake -S . -B build/shared \ - -DBUILD_SHARED_LIBS=ON \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ - -DTREE_SITTER_FEATURE_WASM=$WASM - cmake --build build/shared --verbose - env: - CC: ${{ contains(matrix.platform, 'linux') && 'clang' || '' }} - WASM: ${{ contains(matrix.features, 'wasm') && 'ON' || 'OFF' }} - - - name: Build Wasm library - if: contains(matrix.features, 'wasm') - shell: bash - run: | - cd lib/binding_web - npm ci - CJS=true npm run build - CJS=true npm run build:debug - npm run build - npm run build:debug - - - name: Check no_std builds - if: inputs.run-test && !matrix.no-run - working-directory: lib - shell: bash - run: cargo check --no-default-features --target='${{ matrix.target }}' - - - name: Build target - run: cargo build --release --target='${{ matrix.target }}' --features='${{ matrix.features }}' $PACKAGE - env: - PACKAGE: ${{ matrix.platform == 'wasm32' && '-p tree-sitter' || '' }} - - - name: Cache fixtures + - uses: ./.github/actions/cache id: cache - if: inputs.run-test && !matrix.no-run - uses: ./.github/actions/cache - - - name: Fetch fixtures - if: inputs.run-test && !matrix.no-run - run: cargo run -p xtask --target='${{ matrix.target }}' -- fetch-fixtures - name: Generate fixtures - if: inputs.run-test && !matrix.no-run && steps.cache.outputs.cache-hit != 'true' - run: cargo run -p xtask --target='${{ matrix.target }}' -- generate-fixtures + if: ${{ !matrix.cli-only && inputs.run_test && steps.cache.outputs.cache-hit != 'true' }} # Can't natively run CLI on Github runner's host + run: script/generate-fixtures - - name: Generate Wasm fixtures - if: inputs.run-test && !matrix.no-run && contains(matrix.features, 'wasm') && steps.cache.outputs.cache-hit != 'true' - run: cargo run -p xtask --target='${{ matrix.target }}' -- generate-fixtures --wasm + - name: Generate WASM fixtures + if: ${{ !matrix.cli-only && !matrix.use-cross && inputs.run_test && steps.cache.outputs.cache-hit != 'true' }} # See comment for the "Build wasm library" step + run: script/generate-fixtures-wasm - name: Run main tests - if: inputs.run-test && !matrix.no-run - run: cargo test --target='${{ matrix.target }}' --features='${{ matrix.features }}' + if: ${{ !matrix.cli-only && inputs.run_test }} # Can't natively run CLI on Github runner's host + run: $BUILD_CMD test --target=${{ matrix.target }} --features=${{ matrix.cli_features }} - - name: Run Wasm tests - if: inputs.run-test && !matrix.no-run && contains(matrix.features, 'wasm') - run: cargo run -p xtask --target='${{ matrix.target }}' -- test-wasm + - name: Run wasm tests + if: ${{ !matrix.cli-only && !matrix.use-cross && inputs.run_test }} # See comment for the "Build wasm library" step + run: script/test-wasm + + - name: Run benchmarks + if: ${{ !matrix.cli-only && !matrix.use-cross && inputs.run_test }} # Cross-compiled benchmarks make no sense + run: $BUILD_CMD bench benchmark -p tree-sitter-cli --target=${{ matrix.target }} - name: Upload CLI artifact - if: "!matrix.no-run" - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v4 with: name: tree-sitter.${{ matrix.platform }} - path: target/${{ matrix.target }}/release/tree-sitter${{ contains(matrix.target, 'windows') && '.exe' || '' }} + path: target/${{ matrix.target }}/release/tree-sitter${{ env.EXE }} if-no-files-found: error retention-days: 7 - - name: Upload Wasm artifacts - if: matrix.platform == 'linux-x64' - uses: actions/upload-artifact@v6 + - name: Upload WASM artifacts + if: ${{ matrix.platform == 'linux-x64' }} + uses: actions/upload-artifact@v4 with: name: tree-sitter.wasm path: | - lib/binding_web/web-tree-sitter.js - lib/binding_web/web-tree-sitter.js.map - lib/binding_web/web-tree-sitter.cjs - lib/binding_web/web-tree-sitter.cjs.map - lib/binding_web/web-tree-sitter.wasm - lib/binding_web/web-tree-sitter.wasm.map - lib/binding_web/debug/web-tree-sitter.cjs - lib/binding_web/debug/web-tree-sitter.cjs.map - lib/binding_web/debug/web-tree-sitter.js - lib/binding_web/debug/web-tree-sitter.js.map - lib/binding_web/debug/web-tree-sitter.wasm - lib/binding_web/debug/web-tree-sitter.wasm.map - lib/binding_web/lib/*.c - lib/binding_web/lib/*.h - lib/binding_web/lib/*.ts - lib/binding_web/src/*.ts + lib/binding_web/tree-sitter.js + lib/binding_web/tree-sitter.wasm if-no-files-found: error retention-days: 7 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a60c93f4..de51faf5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,21 +1,9 @@ name: CI - on: pull_request: - paths-ignore: - - docs/** - - "**/README.md" - - CONTRIBUTING.md - - LICENSE - - cli/src/templates push: - branches: [master] - paths-ignore: - - docs/** - - "**/README.md" - - CONTRIBUTING.md - - LICENSE - - cli/src/templates + branches: + - 'master' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -25,25 +13,15 @@ jobs: checks: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up stable Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - components: clippy, rustfmt - - - name: Lint files - run: | - make lint - make lint-web + - uses: actions/checkout@v4 + - run: rustup toolchain install stable --profile minimal + - run: rustup toolchain install nightly --profile minimal + - run: rustup component add --toolchain nightly rustfmt + - uses: Swatinem/rust-cache@v2 + - run: make lint sanitize: uses: ./.github/workflows/sanitize.yml build: uses: ./.github/workflows/build.yml - - check-wasm-stdlib: - uses: ./.github/workflows/wasm_stdlib.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 0e4baebf..00000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Deploy Docs -on: - push: - branches: [master] - paths: [docs/**] - workflow_dispatch: - -jobs: - deploy-docs: - runs-on: ubuntu-latest - - permissions: - contents: write - pages: write - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - - - name: Install mdbook - env: - GH_TOKEN: ${{ github.token }} - run: | - jq_expr='.assets[] | select(.name | contains("x86_64-unknown-linux-gnu")) | .browser_download_url' - url=$(gh api repos/rust-lang/mdbook/releases/tags/v0.4.52 --jq "$jq_expr") - mkdir mdbook - curl -sSL "$url" | tar -xz -C mdbook - printf '%s/mdbook\n' "$PWD" >> "$GITHUB_PATH" - - - name: Install mdbook-admonish - run: cargo install mdbook-admonish - - - name: Build Book - run: mdbook build docs - - - name: Setup Pages - uses: actions/configure-pages@v5 - - - name: Upload artifact - uses: actions/upload-pages-artifact@v4 - with: - path: docs/book - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/nvim_ts.yml b/.github/workflows/nvim_ts.yml deleted file mode 100644 index 88e3371f..00000000 --- a/.github/workflows/nvim_ts.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: nvim-treesitter parser tests - -on: - pull_request: - paths: - - 'crates/cli/**' - - 'crates/config/**' - - 'crates/generate/**' - - 'crates/loader/**' - - '.github/workflows/nvim_ts.yml' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - check_compilation: - timeout-minutes: 30 - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - type: [generate, build] - name: ${{ matrix.os }} - ${{ matrix.type }} - runs-on: ${{ matrix.os }} - env: - NVIM: ${{ matrix.os == 'windows-latest' && 'nvim-win64\\bin\\nvim.exe' || 'nvim' }} - NVIM_TS_DIR: nvim-treesitter - steps: - - uses: actions/checkout@v6 - - - uses: actions/checkout@v6 - with: - repository: nvim-treesitter/nvim-treesitter - path: ${{ env.NVIM_TS_DIR }} - ref: main - - - if: runner.os != 'Windows' - run: echo ${{ github.workspace }}/target/release >> $GITHUB_PATH - - - if: runner.os == 'Windows' - run: echo ${{ github.workspace }}/target/release >> $env:GITHUB_PATH - - - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo build --release - - uses: ilammy/msvc-dev-cmd@v1 - - - name: Install and prepare Neovim - run: bash ./scripts/ci-install.sh - working-directory: ${{ env.NVIM_TS_DIR }} - - - if: matrix.type == 'generate' - name: Generate and compile parsers - run: $NVIM -l ./scripts/install-parsers.lua --generate --max-jobs=2 - working-directory: ${{ env.NVIM_TS_DIR }} - shell: bash - - - if: matrix.type == 'build' - name: Compile parsers - run: $NVIM -l ./scripts/install-parsers.lua --max-jobs=10 - working-directory: ${{ env.NVIM_TS_DIR }} - shell: bash - - - if: "!cancelled()" - name: Check query files - run: $NVIM -l ./scripts/check-queries.lua - working-directory: ${{ env.NVIM_TS_DIR }} - shell: bash diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4f6f9d47..cd25fd71 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,4 @@ name: Release - on: workflow_dispatch: push: @@ -10,22 +9,19 @@ jobs: build: uses: ./.github/workflows/build.yml with: - run-test: false + run_test: false release: - name: Release on GitHub + name: Release runs-on: ubuntu-latest needs: build permissions: - id-token: write - attestations: write contents: write steps: - - name: Checkout repository - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Download build artifacts - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v4 with: path: artifacts @@ -35,13 +31,9 @@ jobs: - name: Prepare release artifacts run: | - mkdir -p target web - mv artifacts/tree-sitter.wasm/* web/ - - tar -czf target/web-tree-sitter.tar.gz -C web . - + mkdir -p target + mv artifacts/tree-sitter.wasm/* target/ rm -r artifacts/tree-sitter.wasm - for platform in $(cd artifacts; ls | sed 's/^tree-sitter\.//'); do exe=$(ls artifacts/tree-sitter.$platform/tree-sitter*) gzip --stdout --name $exe > target/tree-sitter-$platform.gz @@ -49,81 +41,60 @@ jobs: rm -rf artifacts ls -l target/ - - name: Generate attestations - uses: actions/attest-build-provenance@v3 - with: - subject-path: | - target/tree-sitter-*.gz - target/web-tree-sitter.tar.gz - - name: Create release - run: |- - gh release create $GITHUB_REF_NAME \ - target/tree-sitter-*.gz \ - target/web-tree-sitter.tar.gz - env: - GH_TOKEN: ${{ github.token }} + uses: softprops/action-gh-release@v2 + with: + name: ${{ github.ref_name }} + tag_name: ${{ github.ref_name }} + fail_on_unmatched_files: true + files: | + target/tree-sitter-*.gz + target/tree-sitter.wasm + target/tree-sitter.js crates_io: - name: Publish packages to Crates.io + name: Publish CLI to Crates.io runs-on: ubuntu-latest - environment: crates - permissions: - id-token: write - contents: read needs: release steps: - - name: Checkout repository - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - - - name: Set up registry token - id: auth - uses: rust-lang/crates-io-auth-action@v1 + - name: Setup Rust + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true - name: Publish crates to Crates.io uses: katyo/publish-crates@v2 with: - registry-token: ${{ steps.auth.outputs.token }} + registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} npm: - name: Publish packages to npmjs.com + name: Publish lib to npmjs.com runs-on: ubuntu-latest - environment: npm - permissions: - id-token: write - contents: read needs: release strategy: fail-fast: false matrix: - directory: [crates/cli/npm, lib/binding_web] + directory: ["cli/npm", "lib/binding_web"] steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Node - uses: actions/setup-node@v6 - with: - node-version: 24 - registry-url: https://registry.npmjs.org - - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 + - uses: actions/checkout@v4 - name: Build wasm if: matrix.directory == 'lib/binding_web' + run: ./script/build-wasm + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 18 + registry-url: "https://registry.npmjs.org" + + - name: Publish lib to npmjs.com + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} run: | cd ${{ matrix.directory }} - npm ci - npm run build - npm run build:debug - CJS=true npm run build - CJS=true npm run build:debug - npm run build:dts - - - name: Publish to npmjs.com - working-directory: ${{ matrix.directory }} - run: npm publish + npm publish diff --git a/.github/workflows/response.yml b/.github/workflows/response.yml index 54dd2021..663ae6ad 100644 --- a/.github/workflows/response.yml +++ b/.github/workflows/response.yml @@ -1,47 +1,34 @@ -name: No response - +name: no_response on: schedule: - - cron: "30 1 * * *" # Run every day at 01:30 + - cron: '30 1 * * *' # Run every day at 01:30 workflow_dispatch: issue_comment: -permissions: - issues: write - pull-requests: write - jobs: close: - name: Close issues with no response if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write steps: - - name: Checkout script - uses: actions/checkout@v6 - with: - sparse-checkout: .github/scripts/close_unresponsive.js - sparse-checkout-cone-mode: false - - - name: Run script - uses: actions/github-script@v8 + - uses: actions/checkout@v4 + - uses: actions/github-script@v7 with: script: | const script = require('./.github/scripts/close_unresponsive.js') await script({github, context}) remove_label: - name: Remove response label if: github.event_name == 'issue_comment' runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write steps: - - name: Checkout script - uses: actions/checkout@v6 - with: - sparse-checkout: .github/scripts/remove_response_label.js - sparse-checkout-cone-mode: false - - - name: Run script - uses: actions/github-script@v8 + - uses: actions/checkout@v4 + - uses: actions/github-script@v7 with: script: | const script = require('./.github/scripts/remove_response_label.js') diff --git a/.github/workflows/reviewers_remove.yml b/.github/workflows/reviewers_remove.yml index 3a389ed4..b10d8c3d 100644 --- a/.github/workflows/reviewers_remove.yml +++ b/.github/workflows/reviewers_remove.yml @@ -1,24 +1,16 @@ -name: Remove Reviewers - +name: "reviewers: remove" on: pull_request_target: types: [converted_to_draft, closed] - -permissions: - pull-requests: write - jobs: remove-reviewers: runs-on: ubuntu-latest + permissions: + pull-requests: write steps: - - name: Checkout script - uses: actions/checkout@v6 - with: - sparse-checkout: .github/scripts/reviewers_remove.js - sparse-checkout-cone-mode: false - - - name: Run script - uses: actions/github-script@v8 + - uses: actions/checkout@v4 + - name: 'Remove reviewers' + uses: actions/github-script@v7 with: script: | const script = require('./.github/scripts/reviewers_remove.js') diff --git a/.github/workflows/sanitize.yml b/.github/workflows/sanitize.yml index 2f8851dc..72bdd079 100644 --- a/.github/workflows/sanitize.yml +++ b/.github/workflows/sanitize.yml @@ -8,44 +8,39 @@ on: workflow_call: jobs: - check-undefined-behaviour: + check_undefined_behaviour: + name: Sanitizer checks runs-on: ubuntu-latest timeout-minutes: 20 env: TREE_SITTER: ${{ github.workspace }}/target/release/tree-sitter steps: - - name: Checkout repository - uses: actions/checkout@v6 + - name: Checkout source code + uses: actions/checkout@v4 - - name: Install UBSAN library - run: sudo apt-get update -y && sudo apt-get install -y libubsan1 + - name: Install UBSAN library + run: sudo apt-get update -y && sudo apt-get install -y libubsan1 - - name: Set up Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 + - run: rustup toolchain install stable --profile minimal + - uses: Swatinem/rust-cache@v2 + - run: cargo build --release + - run: script/fetch-fixtures - - name: Build project - run: cargo build --release + - uses: ./.github/actions/cache + id: cache - - name: Cache fixtures - uses: ./.github/actions/cache - id: cache + - if: ${{ steps.cache.outputs.cache-hit != 'true' }} + run: script/generate-fixtures - - name: Fetch fixtures - run: cargo xtask fetch-fixtures + - name: Run main tests with undefined behaviour sanitizer (UBSAN) + env: + CFLAGS: -fsanitize=undefined + RUSTFLAGS: ${{ env.RUSTFLAGS }} -lubsan + run: cargo test -- --test-threads 1 - - name: Generate fixtures - if: ${{ steps.cache.outputs.cache-hit != 'true' }} - run: cargo xtask generate-fixtures - - - name: Run main tests with undefined behaviour sanitizer (UBSAN) - run: cargo test -- --test-threads 1 - env: - CFLAGS: -fsanitize=undefined - RUSTFLAGS: ${{ env.RUSTFLAGS }} -lubsan - - - name: Run main tests with address sanitizer (ASAN) - run: cargo test -- --test-threads 1 - env: - ASAN_OPTIONS: verify_asan_link_order=0 - CFLAGS: -fsanitize=address - RUSTFLAGS: ${{ env.RUSTFLAGS }} -lasan --cfg sanitizing + - name: Run main tests with address sanitizer (ASAN) + env: + ASAN_OPTIONS: verify_asan_link_order=0 + CFLAGS: -fsanitize=address + RUSTFLAGS: ${{ env.RUSTFLAGS }} -lasan --cfg sanitizing + run: cargo test -- --test-threads 1 diff --git a/.github/workflows/spam.yml b/.github/workflows/spam.yml deleted file mode 100644 index eb1d4a46..00000000 --- a/.github/workflows/spam.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Close as spam - -on: - issues: - types: [labeled] - pull_request_target: - types: [labeled] - -permissions: - issues: write - pull-requests: write - -jobs: - spam: - runs-on: ubuntu-latest - if: github.event.label.name == 'spam' - steps: - - name: Checkout script - uses: actions/checkout@v6 - with: - sparse-checkout: .github/scripts/close_spam.js - sparse-checkout-cone-mode: false - - - name: Run script - uses: actions/github-script@v8 - with: - script: | - const script = require('./.github/scripts/close_spam.js') - await script({github, context}) diff --git a/.github/workflows/wasm_exports.yml b/.github/workflows/wasm_exports.yml deleted file mode 100644 index af48cf8a..00000000 --- a/.github/workflows/wasm_exports.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Check Wasm Exports - -on: - pull_request: - paths: - - lib/include/tree_sitter/api.h - - lib/binding_web/** - - xtask/src/** - push: - branches: [master] - paths: - - lib/include/tree_sitter/api.h - - lib/binding_rust/bindings.rs - - CMakeLists.txt - -jobs: - check-wasm-exports: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up stable Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - toolchain: stable - - - name: Install wasm-objdump - run: sudo apt-get update -y && sudo apt-get install -y wabt - - - name: Build C library (make) - run: make -j CFLAGS="$CFLAGS" - env: - CFLAGS: -g -Werror -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types - - - name: Build Wasm Library - working-directory: lib/binding_web - run: npm ci && npm run build:debug - - - name: Check Wasm exports - run: cargo xtask check-wasm-exports diff --git a/.github/workflows/wasm_stdlib.yml b/.github/workflows/wasm_stdlib.yml deleted file mode 100644 index adec8411..00000000 --- a/.github/workflows/wasm_stdlib.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Check Wasm Stdlib build - -on: - workflow_call: - -jobs: - check: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Check directory changes - uses: actions/github-script@v8 - with: - script: | - const scriptPath = `${process.env.GITHUB_WORKSPACE}/.github/scripts/wasm_stdlib.js`; - const script = require(scriptPath); - return script({ github, context, core }); diff --git a/.gitignore b/.gitignore index ca47139e..25738984 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,10 @@ log*.html -.direnv .idea *.xcodeproj .vscode .cache .zig-cache -.direnv profile* fuzz-results @@ -14,6 +12,7 @@ test/fuzz/out test/fixtures/grammars/* !test/fixtures/grammars/.gitkeep +package-lock.json node_modules docs/assets/js/tree-sitter.js @@ -26,7 +25,6 @@ docs/assets/js/tree-sitter.js *.dylib *.so *.so.[0-9]* -*.dll *.o *.obj *.exp @@ -36,5 +34,3 @@ docs/assets/js/tree-sitter.js .build build zig-* - -/result diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index 15f15d9a..00000000 --- a/.zed/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "lsp": { - "rust-analyzer": { - "initialization_options": { - "cargo": { - "features": "all" - } - } - } - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..d015e433 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,470 @@ +# Changelog + +## [0.23.0] - 2024-08-26 + +### Breaking + +- Introduce tree-sitter-language crate for grammar crates to depend on () +- Revert interning of a sequence or choice of a single rule () +- **bindings**: Use capsules in python () +- **dsl**: Support other JS runtimes () + +### Features + +- Add `fuzz` subcommand () +- Allow external scanners to use the logger () +- **bindings**: Add query constants to python +- **bindings**: Add node, python, swift tests () +- **bindings**: Update npm scripts () +- **cli**: Bump unicode data to v15.1.0 +- **cli**: Add debug build flag () +- **cli**: Attach helpful context when `grammar.json` cannot be found () +- **cli**: Add `--show-fields` flag to `test` command () +- **lib**: Add `ts_query_end_byte_for_pattern` () +- **lib**: Support no_std +- **zig**: Update outdated path syntax () + +### Bug Fixes + +- Always reset to the first language when iterating over language attributes () +- Better error when a supertype rule is invalid () +- Intern a sequence or choice of a single element the same as the element itself +- Do not "absorb" rules that consist of a single terminal if the rule is hidden () +- **bindings**: Update go bindings () +- **cli**: Installation via authenticated proxy () +- **cli**: Dedup `preceding_auxiliary_symbols` () +- **dsl**: Improve error message when a rule function returns undefined () +- **generate**: Rename `cargo.toml` template () +- **go**: Update parser name in binding files, add to docs () +- **lib**: A null clock must have `tv_nsec` be 0 as well () +- **lib**: Restrict pattern_map optimization when a wildcard step has an immediate first child () +- **lib**: An empty root node should not precede an empty range () +- **lib**: Fix api header C++ interop () +- **make**: Fail properly on Windows () +- **rust**: Fetch `CARGO_MANIFEST_DIR` at runtime in build script () +- **rust**: Fix new clippy warnings () +- **test**: Multi-grammar corpus tests are now in the repo root () +- **wasm**: Update test + +### Performance + +- Hoist out common subexpressions in satisfies_text_predicates () + +### Documentation + +- Update changelog +- Remove duplicate pr # in changelog +- Add note for bullet +- Fix syntax highlighting unit testing example () +- Add tsserver annotation to example () +- Fix tree cursor documentation () +- Document rust library features () +- Clean up binding & parser lists () + +### Refactor + +- Remove ansi_term dependency () +- Remove difference dependency () +- **scripts**: Clean up bash scripts () + +### Testing + +- Modernize scanner files () + +### Build System and CI + +- **deps**: bump wasmtime, cc, and wasmparser ( +- **bindings**: Use language version in soname () +- **lib**: Include the minor in the soname +- **loader**: Make dependencies optional () +- **swift**: Declare header search path () +- **wasm**: Don't minify JS () +- **wasm**: Bump emscripten to 3.1.64 () +- **wasm**: Support big endian machines () +- **zig**: Git ignore updated Zig cache directory () + +### Other + +- Swap `sprintf()` for `snprintf()` () +- Add `.build` to gitignore () +- Reset language when resetting wasm store () +- Clone wasm store engine () +- **bindings**: Fix indent & line endings () + +## [0.22.6] — 2024-05-05 + +### Features + +- Improve handling of serialization buffer overflows () +- Reverse iteration through node parents () +- **cli**: Support `NO_COLOR` () +- **cli**: Add test listing and allow users to parse a specific test number () +- **grammar**: Add "inherits" field if available () + +### Bug Fixes + +- Correctly load field data from wasm languages +- Improve error message when the `tree-sitter` field is malformed +- Don't error out on package.json lookup errors if `--no-bindings` is passed () +- **cli**: Keep default cc flags in build +- **cli**: Properly account for multi-grammar repos when using docker to build a wasm parser () +- **generate**: Don't check arbitrarily named dirs +- **generate**: Take `AsRef` for the path parameter to avoid clones () +- **highlight**: Correct signature of `ts_highlighter_add_language` +- **lib**: Do not return field names for extras () +- **lib**: Advance the lookahead end byte by 4 when there's an invalid code point () +- **rust**: Update README example () +- **rust**: Use unix + wasi cfg instead of not windows for fd () +- **test**: Allow newlines in between test name and attribute +- **wasm**: Correct `childrenFromFieldXXX` method signatures () +- **xtask**: Always bump every crate in tandem +- **zig**: Make usable as a zig dependency () + +### Documentation + +- Mention build command variables +- Swap `\s` for `\\s` in query example +- **highlight**: Typo () + +### Refactor + +- **tests**: Migrate remaining `grammar.json` tests to `grammar.js` () + +### Build System and CI + +- Add nightly rustfmt to workflow for linting () +- Fix address sanitizer step () +- **deps**: Bump cc from 1.0.92 to 1.0.94 in the cargo group () +- **deps**: Bump the cargo group with 6 updates () +- **xtask**: Bump `build.zig.zon` version when bumping versions + +## [0.22.5] — 2024-04-14 + +### Bug Fixes + +- Avoid generating unused character set constants +- **cli**: Test parsing on windows () +- **rust**: Compilation on wasm32-wasi () + +## [0.22.4] — 2024-04-12 + +### Bug Fixes + +- Fix sorting of transitions within a lex state +- Include 2-character ranges in array-based state transitions + +### Build System and CI + +- Always bump at least the patch version in bump xtask + +## [0.22.3] — 2024-04-12 + +### Features + +- Add strncat to wasm stdlib +- Generate simpler code for matching large character sets () +- When loading languages via WASM, gracefully handle memory errors and leaks in external scanners () + +### Bug Fixes + +- **bindings**: Add utf-8 flag to python & node () +- **bindings**: Generate parser.c if missing () +- **bindings**: Remove required platforms for swift () +- **cli**: Fix mismatched parenthesis when accounting for `&&` () +- **lib**: Do not consider childless nodes for ts_node_parent () +- **lib**: Properly account for aliased root nodes and root nodes with + children in `ts_subtree_string` () +- **lib**: Account for the root node of a tree cursor being an alias () +- **lib**: Use correct format specifier in log message () +- **parser**: Fix variadic macro () +- render: Proper function prototypes () +- **windows**: Add `/utf-8` flag for parsers using unicode symbols () +- Add a semicolon after SKIP macros () +- Add back `build-wasm` temporarily () +- Add lifetime to matches function () +- Default output directory for `build --wasm` should use current_dir () +- Fix sorting of wasm stdlib symbols +- Insert "tree-sitter" section in current directory's package.json if it exists () +- Tie the lifetime of the cursor to the query in `QueryCursor::captures()` () +- Wrong flag check in `build.rs` + +### Performance + +- **cli**: Reduced the compile time of generated parsers by generating C code with fewer conditionals () + +### Documentation + +- Add NGINX grammar + +### Refactor + +- **parser**: Make REDUCE macro non-variadic () +- **js**: Misc fixes & tidying +- **rust**: Misc fixes & tidying + +### Testing + +- Add regression test for node parent + string bug () +- **test**: Allow colons in test names () + +### Build System and CI + +- Upgrade wasmtime +- Update emscripten version () +- **dependabot**: Improve PR labels () + +## [0.22.2] — 2024-03-17 + +### Breaking + +- **cli**: Add a separate build command to compile parsers + +### Features + +- **bindings/rust**: Expose `Parser::included_ranges` +- Lower the lib's MSRV () +- **lib**: Implement Display for Node () + +### Bug Fixes + +- **bindings/wasm**: Fix `Parser.getIncludedRanges()` () +- **lib**: Makefile installation on macOS () +- **lib**: Makefile installation () +- **lib**: Avoid possible UB of calling memset on a null ptr when 0 is passed into `array_grow_by` () +- **lib**: Allow hiding symbols () + +### Documentation + +- Fix typo () +- **licensfe**: Update year () + +### Refactor + +- Remove dependency on which crate () +- Turbofish styling + +### Testing + +- Fix header writes () + +### Build System and CI + +- Simplify workflows () +- **lib**: Allow overriding CFLAGS on the commandline () + +## [0.22.1] — 2024-03-10 + +### Bug Fixes + +- Cli build script behavior on release + +## [0.22.0] — 2024-03-10 + +### Breaking + +- Remove top-level `corpus` dir for tests + The cli will now only look in `test/corpus` for tests +- Remove redundant escape regex & curly brace regex preprocessing () +- **bindings**: Convert node bindings to NAPI () +- **wasm**: Make `current*`, `is*`, and `has*` methods properties () +- **wasm**: Keep API in-line with upstream and start aligning with node () + +### Features + +- Add xtasks to assist with bumping crates () +- Improve language bindings () +- Expose the allocator and array header files for external scanners () +- Add typings for the node bindings +- Replace `nan` with `node-addon-api` and conditionally print logs +- **bindings**: Add more make targets +- **bindings**: Add peerDependencies for npm +- **bindings**: Add prebuildify to node +- **bindings**: Remove dsl types file () +- **node**: Type tag the language () +- **test**: Add attributes for corpus tests + +### Bug Fixes + +- Apply some `scan-build` suggestions (unused assignment/garbage access) () +- Wrap `||` comparison in parentheses when `&&` is used () +- Ignore unused variables in the array macros () +- `binding.cc` overwrite should replace `PARSER_NAME` () +- Don't use `__declspec(dllexport)` on windows () +- Parsers should export the language function on windows +- Allow the regex `v` flag () +- **assertions**: Case shouldn't matter for comment node detection +- **bindings**: Editorconfig and setup.py fixes () +- **bindings**: Insert `types` after `main` if it exists () +- **bindings**: Fix template oversights () +- **cli**: Only output the sources with `--no-bindings` () +- **generate**: Add `.npmignore`, populate Swift's exclude list () +- **generate**: Extern allocator functions for the template don't need to be "exported" () +- **generate**: Camel case name in `Cargo.toml` description () +- **lib**: Include `api.h` so `ts_set_allocator` is visible () + +### Documentation + +- Add GitHub user and PR info to the changelog +- Add css for inline code () +- Document test attributes +- Add `Ohm` language parser +- Remove duplicate `the`'s () +- Add discord and matrix badges () + +### Refactor + +- Rename TS_REUSE_ALLOCATOR flag () +- Remove extern/const where possible +- **array**: Use pragma GCC in clang too +- **bindings**: Remove npmignore () + +### Testing + +- Don't use TS_REUSE_ALLOCATOR on Darwin systems () +- Add test case for parse stack merging with incorrect error cost bug () + +### Build System and CI + +- Improve changelog settings () +- Unify crate versions via workspace () +- Update `cc` to remove annoying debug output () +- Adjust dependabot settings () +- Use c11 everywhere +- Add uninstall command +- Don't skip tests on failing lint () +- Remove unused deps, bump deps, and bump MSRV to 1.74.1 () +- **bindings**: Metadata improvements +- **bindings**: Make everything c11 () +- **dependabot**: Update weekly instead of daily () +- **deps**: Bump the cargo group with 1 update () +- **deps**: Bump the cargo group with 1 update () +- **deps**: Bump deps & lockfile () +- **deps**: Bump the cargo group with 4 updates () +- **lint**: Detect if `Cargo.lock` needs to be updated () +- **lint**: Make lockfile check quiet () +- **swift**: Move 'cLanguageStandard' behind 'targets' () + +### Other + +- Make Node.js language bindings context aware () + They don't have any dynamic global data, so all it takes is just declaring them as such +- Fix crash when attempting to load ancient languages via wasm () +- Use workspace dependencies for internal crates like Tree-sitter () +- Remove vendored wasmtime headers () + When building rust binding, use wasmtime headers provided via cargo + by the wasmtime-c-api crate. +- Fix invalid parse stack recursive merging with mismatched error cost () + Allowing this invalid merge caused an invariant to be violated + later on during parsing, when handling a later error. +- Fix regression in `subtree_compare` () +- docs: Add `Ohm` language parser () +- Delete `binding_files.rs` () +- **bindings**: Consistent wording () +- **bindings**: Ignore more artifacts () + +## [0.21.0] — 2024-02-21 + +### Breaking + +- Remove the apply-all-captures flag, make last-wins precedence the default + + **NOTE**: This change might cause breakage in your grammar's highlight tests. + Just flip the order around of the relevant queries, and keep in mind that the + last query that matches will win. + +### Features + +- Use lockfiles to dedup recompilation +- Improve error message for files with an unknown grammar path () +- Implement first-line-regex () +- Error out if an empty string is in the `extras` array +- Allow specifying an external scanner's files () +- Better error info when a scanner is missing required symbols +- **cli**: Add an optional `grammar-path` argument for the playground () +- **cli**: Add optional `config-path` argument () +- **loader**: Add more commonly used default parser directories + +### Bug Fixes + +- Prettify xml output and add node position info () +- Inherited grammar generation +- Properly error out when the word property is an invalid rule +- Update schema for regex flags () +- Properly handle `Query.matches` when filtering out results () +- Sexp format edge case with quoted closed parenthesis () +- Always push the default files if there's no `externals` +- Don't log NUL characters () +- Don't throw an error if the user uses `map` in the grammar () +- Remove redundant imports () +- **cli**: Installation via a HTTP tunnel proxy () +- **cli**: Don't update tests automatically if parse errors are detected () +- **cli**: Don't use `long` for `grammar_path` +- **test**: Allow writing updates to tests without erroneous nodes instead of denying all of them if a single error is found +- **test**: Edge case when parsing `UNEXPECTED`/`MISSING` nodes with an indentation level greater than 0 +- **wasm**: Remove C++ mangled symbols () + +### Documentation + +- Create issue template () +- Document regex limitations +- Mention that `token($.foo)` is illegal +- Explicitly mention behavior of walking outside the given "root" node for a `TSTreeCursor` () +- Small fixes () +- Add `Tact` language parser () +- **web**: Provide deno usage information () + +### Refactor + +- Extract regex check into a function and lower its precedence +- `&PathBuf` -> `&Path` () +- Name anonymous types in api.h () + +### Testing + +- Add quotes around bash variables () +- Update html tests + +### Build System and CI + +- Only create release for normal semver tags () +- Add useful development targets to makefile () +- Remove minimum glibc information in summary page () +- Use the native m1 mac runner () +- Add editorconfig () +- Remove symbolic links from repository () +- Move common Cargo.toml keys into the workspace and inherit them () +- Remove reviewers when drafting or closing a PR () +- Enable creating changelogs with git-cliff () +- Cache fixtures () +- Don't cancel jobs on master () +- Relax caching requirements () +- **deps**: Bump clap from 4.4.18 to 4.5.0 () +- **deps**: Bump wasmtime from v16.0.0 to v17.0.1 () +- **deps**: Bump wasmtime to v18.0.1 () +- **sanitize**: Add a timeout of 60 minutes () +- **sanitize**: Reduce timeout to 20 minutes () + +### Other + +- Document preferred language for scanner () +- Add java and tsx to corpus tests () +- Provide a CLI flag to open `log.html` () +- Some more clippy lints () +- Remove deprecated query parsing mechanism () +- Print out full compiler arguments ran when it fails () +- Deprecate C++ scanners () +- Add some documentation to the playground page () +- Update relevant rust tests () +- Clippy lints () +- Error out when multiple arguments are passed to `token`/`token.immediate` () +- Tidying +- Prefer turbofish syntax where possible () +- Use published wasmtime crates +- Cleaner cast +- Update `Cargo.lock` +- Get rid of `github_issue_test` file () +- **cli**: Use spawn to display `emcc`'s stdout and stderr () +- **cli**: Warn users when a query path needed for a subcommand isn't specified in a grammar's package.json +- **generate**: Dedup and warn about duplicate or invalid rules () +- **test**: Use different languages for async tests () +- **wasm**: Use `SIDE_MODULE=2` to silence warning () diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index f11895c0..00000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -cmake_minimum_required(VERSION 3.13) - -project(tree-sitter - VERSION "0.27.0" - DESCRIPTION "An incremental parsing system for programming tools" - HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" - LANGUAGES C) - -option(BUILD_SHARED_LIBS "Build using shared libraries" ON) -option(TREE_SITTER_FEATURE_WASM "Enable the Wasm feature" OFF) -option(AMALGAMATED "Build using an amalgamated source" OFF) - -if(AMALGAMATED) - set(TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/lib/src/lib.c") -else() - file(GLOB TS_SOURCE_FILES lib/src/*.c) - list(REMOVE_ITEM TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/lib/src/lib.c") -endif() - -add_library(tree-sitter ${TS_SOURCE_FILES}) - -target_include_directories(tree-sitter PRIVATE lib/src lib/src/wasm PUBLIC lib/include) - -if(MSVC) - target_compile_options(tree-sitter PRIVATE - /wd4018 # disable 'signed/unsigned mismatch' - /wd4232 # disable 'nonstandard extension used' - /wd4244 # disable 'possible loss of data' - /wd4267 # disable 'possible loss of data (size_t)' - /wd4701 # disable 'potentially uninitialized local variable' - /we4022 # treat 'incompatible types' as an error - /W4) -else() - target_compile_options(tree-sitter PRIVATE - -Wall -Wextra -Wshadow -Wpedantic - -Werror=incompatible-pointer-types) -endif() - -if(TREE_SITTER_FEATURE_WASM) - if(NOT DEFINED CACHE{WASMTIME_INCLUDE_DIR}) - message(CHECK_START "Looking for wasmtime headers") - find_path(WASMTIME_INCLUDE_DIR wasmtime.h - PATHS ENV DEP_WASMTIME_C_API_INCLUDE) - if(NOT WASMTIME_INCLUDE_DIR) - unset(WASMTIME_INCLUDE_DIR CACHE) - message(FATAL_ERROR "Could not find wasmtime headers.\nDid you forget to set CMAKE_INCLUDE_PATH?") - endif() - message(CHECK_PASS "found") - endif() - - if(NOT DEFINED CACHE{WASMTIME_LIBRARY}) - message(CHECK_START "Looking for wasmtime library") - find_library(WASMTIME_LIBRARY wasmtime) - if(NOT WASMTIME_LIBRARY) - unset(WASMTIME_LIBRARY CACHE) - message(FATAL_ERROR "Could not find wasmtime library.\nDid you forget to set CMAKE_LIBRARY_PATH?") - endif() - message(CHECK_PASS "found") - endif() - - target_compile_definitions(tree-sitter PUBLIC TREE_SITTER_FEATURE_WASM) - target_include_directories(tree-sitter SYSTEM PRIVATE "${WASMTIME_INCLUDE_DIR}") - target_link_libraries(tree-sitter PUBLIC "${WASMTIME_LIBRARY}") - set_property(TARGET tree-sitter PROPERTY C_STANDARD_REQUIRED ON) - - if(NOT BUILD_SHARED_LIBS) - if(WIN32) - target_compile_definitions(tree-sitter PRIVATE WASM_API_EXTERN= WASI_API_EXTERN=) - target_link_libraries(tree-sitter INTERFACE ws2_32 advapi32 userenv ntdll shell32 ole32 bcrypt) - elseif(NOT APPLE) - target_link_libraries(tree-sitter INTERFACE pthread dl m) - endif() - endif() -endif() - -set_target_properties(tree-sitter - PROPERTIES - C_STANDARD 11 - C_VISIBILITY_PRESET hidden - POSITION_INDEPENDENT_CODE ON - SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" - DEFINE_SYMBOL "") - -target_compile_definitions(tree-sitter PRIVATE _POSIX_C_SOURCE=200112L _DEFAULT_SOURCE _BSD_SOURCE _DARWIN_C_SOURCE) - -include(GNUInstallDirs) - -configure_file(lib/tree-sitter.pc.in "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" @ONLY) - -install(FILES lib/include/tree_sitter/api.h - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/tree_sitter") -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -install(TARGETS tree-sitter - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 503955b0..42bc7b75 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1 @@ -See [docs/src/6-contributing.md](./docs/src/6-contributing.md) +See [section-6-contributing.md](./docs/section-6-contributing.md) diff --git a/Cargo.lock b/Cargo.lock index ae7803c8..8b131228 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,43 +3,31 @@ version = 3 [[package]] -name = "addr2line" -version = "0.24.2" +name = "ahash" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "gimli", + "cfg-if", + "once_cell", + "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ansi_colours" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14eec43e0298190790f41679fe69ef7a829d2a2ddd78c8c00339e84710e435fe" -dependencies = [ - "rgb", -] - [[package]] name = "anstream" -version = "0.6.21" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -52,59 +40,49 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.11" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "ar_archive_writer" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a" -dependencies = [ - "object 0.32.2", -] +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arbitrary" -version = "1.4.2" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" [[package]] name = "ascii" @@ -114,11 +92,11 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" [[package]] name = "bindgen" -version = "0.72.1" +version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.10.0", + "bitflags", "cexpr", "clang-sys", "itertools 0.13.0", @@ -134,30 +112,24 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.3.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block2" -version = "0.6.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ "objc2", ] [[package]] name = "bstr" -version = "1.12.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", "regex-automata", @@ -166,32 +138,30 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" -dependencies = [ - "allocator-api2", -] +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] -name = "bytemuck" -version = "1.24.0" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cc" -version = "1.2.53" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" dependencies = [ - "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -212,9 +182,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" @@ -236,14 +206,14 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.8.9", + "libloading", ] [[package]] name = "clap" -version = "4.5.54" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ "clap_builder", "clap_derive", @@ -251,9 +221,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ "anstream", "anstyle", @@ -263,30 +233,20 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.65" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "430b4dc2b5e3861848de79627b2bedc9f3342c7da5173a14eaa5d0f8dc18ae5d" +checksum = "8937760c3f4c60871870b8c3ee5f9b30771f792a7045c48bcbba999d7d6b3b8e" dependencies = [ "clap", ] -[[package]] -name = "clap_complete_nushell" -version = "4.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685bc86fd34b7467e0532a4f8435ab107960d69a243785ef0275e571b35b641a" -dependencies = [ - "clap", - "clap_complete", -] - [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "syn", @@ -294,24 +254,21 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.6" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cobs" -version = "0.3.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.17", -] +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "combine" @@ -324,32 +281,10 @@ dependencies = [ ] [[package]] -name = "console" -version = "0.15.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", -] - -[[package]] -name = "convert_case" +name = "core-foundation" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", "libc", @@ -361,38 +296,20 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "cranelift-assembler-x64" -version = "0.120.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5023e06632d8f351c2891793ccccfe4aef957954904392434038745fb6f1f68" -dependencies = [ - "cranelift-assembler-x64-meta", -] - -[[package]] -name = "cranelift-assembler-x64-meta" -version = "0.120.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c4012b4c8c1f6eb05c0a0a540e3e1ee992631af51aa2bbb3e712903ce4fd65" -dependencies = [ - "cranelift-srcgen", -] - [[package]] name = "cranelift-bforest" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6d883b4942ef3a7104096b8bc6f2d1a41393f159ac8de12aed27b25d67f895" +checksum = "b80c3a50b9c4c7e5b5f73c0ed746687774fc9e36ef652b110da8daebf0c6e0e6" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7b2ee9eec6ca8a716d900d5264d678fb2c290c58c46c8da7f94ee268175d17" +checksum = "38778758c2ca918b05acb2199134e0c561fb577c50574259b26190b6c2d95ded" dependencies = [ "serde", "serde_derive", @@ -400,12 +317,11 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeda0892577afdce1ac2e9a983a55f8c5b87a59334e1f79d8f735a2d7ba4f4b4" +checksum = "58258667ad10e468bfc13a8d620f50dfcd4bb35d668123e97defa2549b9ad397" dependencies = [ "bumpalo", - "cranelift-assembler-x64", "cranelift-bforest", "cranelift-bitset", "cranelift-codegen-meta", @@ -414,48 +330,43 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown 0.15.5", + "hashbrown 0.14.5", "log", - "pulley-interpreter", "regalloc2", "rustc-hash", - "serde", "smallvec", "target-lexicon", ] [[package]] name = "cranelift-codegen-meta" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e461480d87f920c2787422463313326f67664e68108c14788ba1676f5edfcd15" +checksum = "043f0b702e529dcb07ff92bd7d40e7d5317b5493595172c5eb0983343751ee06" dependencies = [ - "cranelift-assembler-x64-meta", "cranelift-codegen-shared", - "cranelift-srcgen", - "pulley-interpreter", ] [[package]] name = "cranelift-codegen-shared" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976584d09f200c6c84c4b9ff7af64fc9ad0cb64dffa5780991edd3fe143a30a1" +checksum = "7763578888ab53eca5ce7da141953f828e82c2bfadcffc106d10d1866094ffbb" [[package]] name = "cranelift-control" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46d43d70f4e17c545aa88dbf4c84d4200755d27c6e3272ebe4de65802fa6a955" +checksum = "32db15f08c05df570f11e8ab33cb1ec449a64b37c8a3498377b77650bef33d8b" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75418674520cb400c8772bfd6e11a62736c78fc1b6e418195696841d1bf91f1" +checksum = "5289cdb399381a27e7bbfa1b42185916007c3d49aeef70b1d01cb4caa8010130" dependencies = [ "cranelift-bitset", "serde", @@ -464,9 +375,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8b1a91c86687a344f3c52dd6dfb6e50db0dfa7f2e9c7711b060b3623e1fdeb" +checksum = "31ba8ab24eb9470477e98ddfa3c799a649ac5a0d9a2042868c4c952133c234e8" dependencies = [ "cranelift-codegen", "log", @@ -476,15 +387,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711baa4e3432d4129295b39ec2b4040cc1b558874ba0a37d08e832e857db7285" +checksum = "2b72a3c5c166a70426dcb209bdd0bb71a787c1ea76023dc0974fbabca770e8f9" [[package]] name = "cranelift-native" -version = "0.120.2" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c83e8666e3bcc5ffeaf6f01f356f0e1f9dcd69ce5511a1efd7ca5722001a3f" +checksum = "46a42424c956bbc31fc5c2706073df896156c5420ae8fa2a5d48dbc7b295d71b" dependencies = [ "cranelift-codegen", "libc", @@ -492,25 +403,35 @@ dependencies = [ ] [[package]] -name = "cranelift-srcgen" -version = "0.120.2" +name = "cranelift-wasm" +version = "0.111.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e3f4d783a55c64266d17dc67d2708852235732a100fc40dd9f1051adc64d7b" +checksum = "49778df4289933d735b93c30a345513e030cf83101de0036e19b760f8aa09f68" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools 0.12.1", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", +] [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "ctor" -version = "0.2.9" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", "syn", @@ -518,27 +439,12 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.1" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" dependencies = [ - "dispatch2", "nix", - "windows-sys 0.61.2", -] - -[[package]] -name = "dialoguer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" -dependencies = [ - "console", - "fuzzy-matcher", - "shell-words", - "tempfile", - "thiserror 1.0.69", - "zeroize", + "windows-sys 0.59.0", ] [[package]] @@ -548,45 +454,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] -name = "dispatch2" -version = "0.3.0" +name = "dirs" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ - "bitflags 2.10.0", - "block2", "libc", - "objc2", + "option-ext", + "redox_users", + "windows-sys 0.48.0", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - [[package]] name = "either" -version = "1.15.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embedded-io" @@ -600,45 +492,20 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.14" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etcetera" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de48cc4d1c1d97a20fd819def54b890cadde72ed3ad0c614822a0a433361be96" -dependencies = [ - "cfg-if", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -649,108 +516,57 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fastrand" -version = "2.3.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] -name = "file-id" -version = "0.2.3" +name = "filetime" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc6a637b6dc58414714eddd9170ff187ecb0933d4c7024d1abbd23a3cc26e9" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ - "windows-sys 0.60.2", + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", ] -[[package]] -name = "find-msvc-tools" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - [[package]] name = "form_urlencoded" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "fs4" -version = "0.12.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c29c30684418547d476f0b48e84f4821639119c483b1eccd566c8cd0cd05f521" +checksum = "f7e180ac76c23b45e767bd7ae9579bc0bb458618c4bc71835926e098e61d15f8" dependencies = [ - "rustix 0.38.44", + "rustix", "windows-sys 0.52.0", ] -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "fuzzy-matcher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" -dependencies = [ - "thread_local", -] - [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", "wasi", ] -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - [[package]] name = "gimli" -version = "0.31.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" dependencies = [ "fallible-iterator", "indexmap", @@ -758,31 +574,50 @@ dependencies = [ ] [[package]] -name = "glob" -version = "0.3.3" +name = "git2" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "openssl-probe", + "openssl-sys", + "url", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "foldhash 0.1.5", + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", "serde", ] [[package]] -name = "hashbrown" -version = "0.16.1" +name = "heck" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", -] +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "heck" @@ -790,6 +625,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "html-escape" version = "0.2.13" @@ -806,159 +650,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "icu_collections" -version = "2.1.1" +name = "id-arena" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" [[package]] name = "idna" -version = "1.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "indexmap" -version = "2.12.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.14.5", "serde", - "serde_core", ] [[package]] name = "indoc" -version = "2.0.7" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "inotify" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" -dependencies = [ - "bitflags 2.10.0", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" [[package]] name = "is_terminal_polyfill" -version = "1.70.2" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] [[package]] name = "itertools" @@ -969,20 +706,11 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jni" @@ -995,7 +723,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror 1.0.69", + "thiserror", "walkdir", "windows-sys 0.45.0", ] @@ -1007,119 +735,142 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] -name = "js-sys" -version = "0.3.83" +name = "jobserver" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ - "once_cell", "wasm-bindgen", ] [[package]] -name = "kqueue" -version = "1.1.1" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" -dependencies = [ - "kqueue-sys", - "libc", -] +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "kqueue-sys" -version = "1.0.4" +name = "leb128" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.178" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] -name = "libloading" -version = "0.8.9" +name = "libgit2-sys" +version = "0.16.2+1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" dependencies = [ - "cfg-if", - "windows-link", + "cc", + "libc", + "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", ] [[package]] name = "libloading" -version = "0.9.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-link", + "windows-targets 0.52.6", ] [[package]] name = "libm" -version = "0.2.15" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + +[[package]] +name = "libssh2-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libz-sys" +version = "1.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "log" -version = "0.4.29" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "mach2" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] [[package]] name = "memchr" -version = "2.7.6" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memfd" -version = "0.6.5" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 1.1.3", + "rustix", ] [[package]] @@ -1128,18 +879,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.61.2", -] - [[package]] name = "ndk-context" version = "0.1.1" @@ -1148,11 +887,11 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "nix" -version = "0.30.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.10.0", + "bitflags", "cfg-if", "cfg_aliases", "libc", @@ -1169,152 +908,116 @@ dependencies = [ ] [[package]] -name = "notify" -version = "8.2.0" +name = "objc-sys" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" -dependencies = [ - "bitflags 2.10.0", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "notify-types", - "walkdir", - "windows-sys 0.60.2", -] - -[[package]] -name = "notify-debouncer-full" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375bd3a138be7bfeff3480e4a623df4cbfb55b79df617c055cd810ba466fa078" -dependencies = [ - "file-id", - "log", - "notify", - "notify-types", - "walkdir", -] - -[[package]] -name = "notify-types" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] name = "objc2" -version = "0.6.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ + "objc-sys", "objc2-encode", ] [[package]] name = "objc2-encode" -version = "4.1.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" [[package]] name = "objc2-foundation" -version = "0.3.2" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.10.0", + "bitflags", + "block2", + "libc", "objc2", ] [[package]] name = "object" -version = "0.32.2" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "crc32fast", - "hashbrown 0.15.5", + "hashbrown 0.14.5", "indexmap", "memchr", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "once_cell_polyfill" -version = "1.70.2" +name = "openssl-probe" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] -name = "pathdiff" -version = "0.2.3" +name = "openssl-sys" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" [[package]] name = "percent-encoding" -version = "2.3.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_shared", - "serde", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "postcard" -version = "1.1.3" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" dependencies = [ "cobs", "embedded-io 0.4.0", @@ -1322,20 +1025,11 @@ dependencies = [ "serde", ] -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - [[package]] name = "ppv-lite86" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ "zerocopy", ] @@ -1352,68 +1046,41 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.37" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", "syn", ] -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit", -] - [[package]] name = "proc-macro2" -version = "1.0.104" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "psm" -version = "0.1.28" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" dependencies = [ - "ar_archive_writer", "cc", ] -[[package]] -name = "pulley-interpreter" -version = "33.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "986beaef947a51d17b42b0ea18ceaa88450d35b6994737065ed505c39172db71" -dependencies = [ - "cranelift-bitset", - "log", - "wasmtime-math", -] - [[package]] name = "quote" -version = "1.0.42" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "rand" version = "0.8.5" @@ -1441,48 +1108,47 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom", ] [[package]] -name = "ref-cast" -version = "1.0.25" +name = "redox_syscall" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ - "ref-cast-impl", + "bitflags", ] [[package]] -name = "ref-cast-impl" -version = "1.0.25" +name = "redox_users" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "proc-macro2", - "quote", - "syn", + "getrandom", + "libredox", + "thiserror", ] [[package]] name = "regalloc2" -version = "0.12.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown 0.15.5", + "hashbrown 0.13.2", "log", "rustc-hash", + "slice-group-by", "smallvec", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -1492,9 +1158,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1503,116 +1169,34 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "relative-path" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca40a312222d8ba74837cb474edef44b37f561da5f773981007a10bbaa992b0" -dependencies = [ - "serde", -] - -[[package]] -name = "rgb" -version = "0.8.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "rquickjs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50dc6d6c587c339edb4769cf705867497a2baf0eca8b4645fa6ecd22f02c77a" -dependencies = [ - "rquickjs-core", - "rquickjs-macro", -] - -[[package]] -name = "rquickjs-core" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bf7840285c321c3ab20e752a9afb95548c75cd7f4632a0627cea3507e310c1" -dependencies = [ - "hashbrown 0.16.1", - "phf", - "relative-path", - "rquickjs-sys", -] - -[[package]] -name = "rquickjs-macro" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7106215ff41a5677b104906a13e1a440b880f4b6362b5dc4f3978c267fad2b80" -dependencies = [ - "convert_case", - "fnv", - "ident_case", - "indexmap", - "phf_generator", - "phf_shared", - "proc-macro-crate", - "proc-macro2", - "quote", - "rquickjs-core", - "syn", -] - -[[package]] -name = "rquickjs-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27344601ef27460e82d6a4e1ecb9e7e99f518122095f3c51296da8e9be2b9d83" -dependencies = [ - "bindgen", - "cc", -] +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.44" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.10.0", + "bitflags", "errno", "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] -name = "rustix" -version = "1.1.3" +name = "ryu" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -1623,76 +1207,26 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schemars" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" -dependencies = [ - "dyn-clone", - "ref-cast", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4908ad288c5035a8eb12cfdf0d49270def0a268ee162b75eeee0f85d155a7c45" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn", -] - [[package]] name = "semver" -version = "1.0.27" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1701,23 +1235,25 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "indexmap", "itoa", "memchr", + "ryu", "serde", - "serde_core", - "zmij", ] [[package]] -name = "shell-words" -version = "1.1.1" +name = "serde_spanned" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] [[package]] name = "shlex" @@ -1727,27 +1263,27 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "similar" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" [[package]] -name = "siphasher" -version = "1.0.1" +name = "slice-group-by" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "smallbitvec" -version = "2.6.0" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d31d263dd118560e1a492922182ab6ca6dc1d03a3bf54e7699993f31a4150e3f" +checksum = "fcc3fc564a4b53fd1e8589628efafe57602d91bde78be18186b5f61e8faea470" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" dependencies = [ "serde", ] @@ -1760,15 +1296,9 @@ checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" [[package]] name = "stable_deref_trait" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" @@ -1778,43 +1308,32 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.112" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "target-lexicon" -version = "0.13.4" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1dd07eb858a2067e2f3c7155d54e929265c264e6f37efe3ee7a8d1b5a1dd0ba" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.24.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ + "cfg-if", "fastrand", - "getrandom 0.3.4", "once_cell", - "rustix 1.1.3", - "windows-sys 0.61.2", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -1828,53 +1347,24 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - [[package]] name = "tiny_http" version = "0.12.0" @@ -1888,56 +1378,59 @@ dependencies = [ ] [[package]] -name = "tinystr" -version = "0.8.2" +name = "tinyvec" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ - "displaydoc", - "zerovec", + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ - "serde_core", + "serde", ] [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", - "toml_parser", "winnow", ] -[[package]] -name = "toml_parser" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" -dependencies = [ - "winnow", -] - -[[package]] -name = "topological-sort" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" - [[package]] name = "tracing" -version = "0.1.44" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -1946,9 +1439,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.31" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -1957,140 +1450,112 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.36" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] [[package]] name = "tree-sitter" -version = "0.27.0" +version = "0.23.0" dependencies = [ "bindgen", "cc", "regex", "regex-syntax", - "serde_json", - "streaming-iterator", "tree-sitter-language", "wasmtime-c-api-impl", ] [[package]] name = "tree-sitter-cli" -version = "0.27.0" +version = "0.23.0" dependencies = [ - "ansi_colours", "anstyle", "anyhow", "bstr", "clap", "clap_complete", - "clap_complete_nushell", - "crc32fast", "ctor", "ctrlc", - "dialoguer", - "encoding_rs", + "dirs", + "filetime", "glob", - "heck", + "heck 0.5.0", "html-escape", + "indexmap", "indoc", + "lazy_static", "log", "memchr", "pretty_assertions", "rand", "regex", - "schemars", + "regex-syntax", + "rustc-hash", "semver", "serde", + "serde_derive", "serde_json", "similar", - "streaming-iterator", + "smallbitvec", "tempfile", - "thiserror 2.0.17", "tiny_http", "tree-sitter", "tree-sitter-config", - "tree-sitter-generate", "tree-sitter-highlight", "tree-sitter-loader", "tree-sitter-tags", "tree-sitter-tests-proc-macro", "unindent", + "url", "walkdir", - "wasmparser 0.243.0", + "wasmparser", "webbrowser", - "widestring", ] [[package]] name = "tree-sitter-config" -version = "0.27.0" +version = "0.23.0" dependencies = [ - "etcetera", - "log", + "anyhow", + "dirs", "serde", "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "tree-sitter-generate" -version = "0.27.0" -dependencies = [ - "bitflags 2.10.0", - "dunce", - "indexmap", - "indoc", - "log", - "pathdiff", - "regex", - "regex-syntax", - "rquickjs", - "rustc-hash", - "semver", - "serde", - "serde_json", - "smallbitvec", - "tempfile", - "thiserror 2.0.17", - "topological-sort", ] [[package]] name = "tree-sitter-highlight" -version = "0.27.0" +version = "0.23.0" dependencies = [ + "lazy_static", "regex", - "streaming-iterator", - "thiserror 2.0.17", + "thiserror", "tree-sitter", ] [[package]] name = "tree-sitter-language" -version = "0.1.7" +version = "0.1.0" [[package]] name = "tree-sitter-loader" -version = "0.27.0" +version = "0.23.0" dependencies = [ + "anyhow", "cc", - "etcetera", + "dirs", "fs4", "indoc", - "libloading 0.9.0", - "log", + "libloading", "once_cell", + "path-slash", "regex", - "semver", "serde", "serde_json", "tempfile", - "thiserror 2.0.17", "tree-sitter", "tree-sitter-highlight", "tree-sitter-tags", @@ -2098,12 +1563,11 @@ dependencies = [ [[package]] name = "tree-sitter-tags" -version = "0.27.0" +version = "0.23.0" dependencies = [ "memchr", "regex", - "streaming-iterator", - "thiserror 2.0.17", + "thiserror", "tree-sitter", ] @@ -2113,56 +1577,59 @@ version = "0.0.0" dependencies = [ "proc-macro2", "quote", + "rand", "syn", ] +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] -name = "unicode-segmentation" -version = "1.12.0" +name = "unicode-normalization" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] [[package]] -name = "unicode-width" -version = "0.2.2" +name = "unicode-xid" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "unindent" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" +checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce" [[package]] name = "url" -version = "2.5.7" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] name = "utf8-width" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "utf8parse" @@ -2170,6 +1637,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "walkdir" version = "2.5.0" @@ -2182,49 +1661,30 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", "once_cell", - "rustversion", "wasm-bindgen-macro", - "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.106" +name = "wasm-bindgen-backend" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", + "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -2232,45 +1692,52 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.106" +name = "wasm-bindgen-macro" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "unicode-ident", + "quote", + "wasm-bindgen-macro-support", ] +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + [[package]] name = "wasm-encoder" -version = "0.229.0" +version = "0.215.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2" +checksum = "4fb56df3e06b8e6b77e37d2969a50ba51281029a9aeb3855e76b7f49b6418847" dependencies = [ - "leb128fmt", - "wasmparser 0.229.0", + "leb128", ] [[package]] name = "wasmparser" -version = "0.229.0" +version = "0.215.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c" +checksum = "53fbde0881f24199b81cf49b6ff8f9c145ac8eb1b7fc439adb5c099734f7d90e" dependencies = [ - "bitflags 2.10.0", - "hashbrown 0.15.5", - "indexmap", - "semver", - "serde", -] - -[[package]] -name = "wasmparser" -version = "0.243.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d8db401b0528ec316dfbe579e6ab4152d61739cfe076706d2009127970159d" -dependencies = [ - "bitflags 2.10.0", - "hashbrown 0.15.5", + "ahash", + "bitflags", + "hashbrown 0.14.5", "indexmap", "semver", "serde", @@ -2278,74 +1745,73 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.229.0" +version = "0.215.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e" +checksum = "d8e9a325d85053408209b3d2ce5eaddd0dd6864d1cff7a007147ba073157defc" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.229.0", + "wasmparser", ] [[package]] name = "wasmtime" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57373e1d8699662fb791270ac5dfac9da5c14f618ecf940cdb29dc3ad9472a3c" +checksum = "9a5883d64dfc8423c56e3d8df27cffc44db25336aa468e8e0724fddf30a333d7" dependencies = [ - "addr2line", "anyhow", - "bitflags 2.10.0", + "bitflags", "bumpalo", "cc", "cfg-if", - "hashbrown 0.15.5", + "hashbrown 0.14.5", "indexmap", "libc", + "libm", "log", "mach2", "memfd", - "object 0.36.7", + "object", "once_cell", + "paste", "postcard", "psm", - "pulley-interpreter", - "rustix 1.1.3", + "rustix", "serde", "serde_derive", "smallvec", "sptr", "target-lexicon", - "wasmparser 0.229.0", + "wasmparser", "wasmtime-asm-macros", + "wasmtime-component-macro", "wasmtime-cranelift", "wasmtime-environ", - "wasmtime-fiber", "wasmtime-jit-icache-coherence", - "wasmtime-math", "wasmtime-slab", "wasmtime-versioned-export-macros", - "wasmtime-winch", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-asm-macros" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0fc91372865167a695dc98d0d6771799a388a7541d3f34e939d0539d6583de" +checksum = "1c4dc7e2a379c0dd6be5b55857d14c4b277f43a9c429a9e14403eb61776ae3be" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-c-api-impl" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46db556f1dccdd88e0672bd407162ab0036b72e5eccb0f4398d8251cba32dba1" +checksum = "765e302e7d9125e614aaeec3ad6b6083605393004eca00214106a4ff6b47fc58" dependencies = [ "anyhow", "log", + "once_cell", "tracing", "wasmtime", "wasmtime-c-api-macros", @@ -2353,19 +1819,40 @@ dependencies = [ [[package]] name = "wasmtime-c-api-macros" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "315cc6bc8cdc66f296accb26d7625ae64c1c7b6da6f189e8a72ce6594bf7bd36" +checksum = "2d09d02eaa84aa2de5babee7b0296557ad6e4903bb10aa8d135e393e753a43d6" dependencies = [ "proc-macro2", "quote", ] [[package]] -name = "wasmtime-cranelift" -version = "33.0.2" +name = "wasmtime-component-macro" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bd72f0a6a0ffcc6a184ec86ac35c174e48ea0e97bbae277c8f15f8bf77a566" +checksum = "4b07773d1c3dab5f014ec61316ee317aa424033e17e70a63abdf7c3a47e58fcf" +dependencies = [ + "anyhow", + "proc-macro2", + "quote", + "syn", + "wasmtime-component-util", + "wasmtime-wit-bindgen", + "wit-parser", +] + +[[package]] +name = "wasmtime-component-util" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e38d735320f4e83478369ce649ad8fe87c6b893220902e798547a225fc0c5874" + +[[package]] +name = "wasmtime-cranelift" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e570d831d0785d93d7d8c722b1eb9a34e0d0c1534317666f65892818358a2da9" dependencies = [ "anyhow", "cfg-if", @@ -2374,24 +1861,22 @@ dependencies = [ "cranelift-entity", "cranelift-frontend", "cranelift-native", + "cranelift-wasm", "gimli", - "itertools 0.14.0", "log", - "object 0.36.7", - "pulley-interpreter", - "smallvec", + "object", "target-lexicon", - "thiserror 2.0.17", - "wasmparser 0.229.0", + "thiserror", + "wasmparser", "wasmtime-environ", "wasmtime-versioned-export-macros", ] [[package]] name = "wasmtime-environ" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6187bb108a23eb25d2a92aa65d6c89fb5ed53433a319038a2558567f3011ff2" +checksum = "c5fe80dfbd81687431a7d4f25929fae1ae96894786d5c96b14ae41164ee97377" dependencies = [ "anyhow", "cranelift-bitset", @@ -2399,64 +1884,54 @@ dependencies = [ "gimli", "indexmap", "log", - "object 0.36.7", + "object", "postcard", "serde", "serde_derive", - "smallvec", "target-lexicon", "wasm-encoder", - "wasmparser 0.229.0", + "wasmparser", "wasmprinter", -] - -[[package]] -name = "wasmtime-fiber" -version = "33.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc8965d2128c012329f390e24b8b2758dd93d01bf67e1a1a0dd3d8fd72f56873" -dependencies = [ - "anyhow", - "cc", - "cfg-if", - "rustix 1.1.3", - "wasmtime-asm-macros", - "wasmtime-versioned-export-macros", - "windows-sys 0.59.0", + "wasmtime-types", ] [[package]] name = "wasmtime-jit-icache-coherence" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7af0e940cb062a45c0b3f01a926f77da5947149e99beb4e3dd9846d5b8f11619" +checksum = "d15de8429db996f0d17a4163a35eccc3f874cbfb50f29c379951ea1bbb39452e" dependencies = [ "anyhow", "cfg-if", "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "wasmtime-math" -version = "33.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfca360e719dda9a27e26944f2754ff2fd5bad88e21919c42c5a5f38ddd93cb" -dependencies = [ - "libm", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-slab" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e240559cada55c4b24af979d5f6c95e0029f5772f32027ec3c62b258aaff65" +checksum = "1f68d38fa6b30c5e1fc7d608263062997306f79e577ebd197ddcd6b0f55d87d1" + +[[package]] +name = "wasmtime-types" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6634e7079d9c5cfc81af8610ed59b488cc5b7f9777a2f4c1667a2565c2e45249" +dependencies = [ + "anyhow", + "cranelift-entity", + "serde", + "serde_derive", + "smallvec", + "wasmparser", +] [[package]] name = "wasmtime-versioned-export-macros" -version = "33.0.2" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0963c1438357a3d8c0efe152b4ef5259846c1cf8b864340270744fe5b3bae5e" +checksum = "3850e3511d6c7f11a72d571890b0ed5f6204681f7f050b9de2690e7f13123fed" dependencies = [ "proc-macro2", "quote", @@ -2464,27 +1939,22 @@ dependencies = [ ] [[package]] -name = "wasmtime-winch" -version = "33.0.2" +name = "wasmtime-wit-bindgen" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc3b117d03d6eeabfa005a880c5c22c06503bb8820f3aa2e30f0e8d87b6752f" +checksum = "3cb331ac7ed1d5ba49cddcdb6b11973752a857148858bb308777d2fc5584121f" dependencies = [ "anyhow", - "cranelift-codegen", - "gimli", - "object 0.36.7", - "target-lexicon", - "wasmparser 0.229.0", - "wasmtime-cranelift", - "wasmtime-environ", - "winch-codegen", + "heck 0.4.1", + "indexmap", + "wit-parser", ] [[package]] name = "web-sys" -version = "0.3.83" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -2492,11 +1962,13 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.0.6" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97" +checksum = "2e5f07fb9bc8de2ddfe6b24a71a75430673fd679e568c48b52716cef1cfae923" dependencies = [ + "block2", "core-foundation", + "home", "jni", "log", "ndk-context", @@ -2506,46 +1978,15 @@ dependencies = [ "web-sys", ] -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - [[package]] name = "winapi-util" -version = "0.1.11" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] -[[package]] -name = "winch-codegen" -version = "33.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7914c296fbcef59d1b89a15e82384d34dc9669bc09763f2ef068a28dd3a64ebf" -dependencies = [ - "anyhow", - "cranelift-assembler-x64", - "cranelift-codegen", - "gimli", - "regalloc2", - "smallvec", - "target-lexicon", - "thiserror 2.0.17", - "wasmparser 0.229.0", - "wasmtime-cranelift", - "wasmtime-environ", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - [[package]] name = "windows-sys" version = "0.45.0" @@ -2555,6 +1996,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2573,24 +2023,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-targets" version = "0.42.2" @@ -2606,6 +2038,21 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -2615,30 +2062,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -2647,15 +2077,15 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.6" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -2665,15 +2095,15 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.52.6" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.53.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -2683,15 +2113,15 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.52.6" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.53.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" @@ -2699,12 +2129,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -2713,15 +2137,15 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.52.6" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.53.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -2731,15 +2155,15 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.52.6" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.53.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -2749,15 +2173,15 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.6" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.1" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -2765,57 +2189,55 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winnow" -version = "0.7.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen" -version = "0.46.0" +name = "wit-parser" +version = "0.215.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "935a97eaffd57c3b413aa510f8f0b550a4a9fe7d59e79cd8b89a83dcb860321f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "xtask" version = "0.1.0" dependencies = [ - "anstyle", - "anyhow", - "bindgen", - "clap", - "etcetera", + "git2", "indoc", - "notify", - "notify-debouncer-full", - "regex", - "schemars", "semver", + "serde", "serde_json", - "tree-sitter-cli", - "tree-sitter-loader", + "toml", ] [[package]] @@ -2824,111 +2246,23 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - [[package]] name = "zerocopy" -version = "0.8.31" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.31" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", "syn", ] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zmij" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9747e91771f56fd7893e1164abd78febd14a670ceec257caad15e051de35f06" diff --git a/Cargo.toml b/Cargo.toml index ca0d644a..544e6149 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,86 +1,28 @@ [workspace] -default-members = ["crates/cli"] +default-members = ["cli"] members = [ - "crates/cli", - "crates/config", - "crates/generate", - "crates/highlight", - "crates/loader", - "crates/tags", - "crates/xtask", - "crates/language", + "cli", + "cli/config", + "cli/loader", "lib", + "lib/language", + "tags", + "highlight", + "xtask", ] resolver = "2" [workspace.package] -version = "0.27.0" -authors = [ - "Max Brunsfeld ", - "Amaan Qureshi ", -] +version = "0.23.0" +authors = ["Max Brunsfeld "] edition = "2021" -rust-version = "1.85" +rust-version = "1.74.1" homepage = "https://tree-sitter.github.io/tree-sitter" repository = "https://github.com/tree-sitter/tree-sitter" license = "MIT" keywords = ["incremental", "parsing"] categories = ["command-line-utilities", "parsing"] -[workspace.lints.clippy] -dbg_macro = "deny" -todo = "deny" -pedantic = { level = "warn", priority = -1 } -nursery = { level = "warn", priority = -1 } -cargo = { level = "warn", priority = -1 } - -# The lints below are a specific subset of the pedantic+nursery lints -# that we explicitly allow in the tree-sitter codebase because they either: -# -# 1. Contain false positives, -# 2. Are unnecessary, or -# 3. Worsen the code - -branches_sharing_code = "allow" -cast_lossless = "allow" -cast_possible_truncation = "allow" -cast_possible_wrap = "allow" -cast_precision_loss = "allow" -cast_sign_loss = "allow" -checked_conversions = "allow" -cognitive_complexity = "allow" -collection_is_never_read = "allow" -fallible_impl_from = "allow" -fn_params_excessive_bools = "allow" -inline_always = "allow" -if_not_else = "allow" -items_after_statements = "allow" -match_wildcard_for_single_variants = "allow" -missing_errors_doc = "allow" -missing_panics_doc = "allow" -module_name_repetitions = "allow" -multiple_crate_versions = "allow" -needless_for_each = "allow" -obfuscated_if_else = "allow" -option_if_let_else = "allow" -or_fun_call = "allow" -range_plus_one = "allow" -redundant_clone = "allow" -redundant_closure_for_method_calls = "allow" -ref_option = "allow" -similar_names = "allow" -string_lit_as_bytes = "allow" -struct_excessive_bools = "allow" -struct_field_names = "allow" -transmute_undefined_repr = "allow" -too_many_lines = "allow" -unnecessary_wraps = "allow" -unused_self = "allow" -used_underscore_items = "allow" - -[workspace.lints.rust] -mismatched_lifetime_syntaxes = "allow" - [profile.optimize] inherits = "release" strip = true # Automatically strip symbols from the binary. @@ -92,72 +34,62 @@ codegen-units = 1 # Maximum size reduction optimizations. inherits = "optimize" opt-level = "s" # Optimize for size. -[profile.release-dev] -inherits = "release" -lto = false -debug = true -debug-assertions = true -overflow-checks = true -incremental = true -codegen-units = 256 +[profile.profile] +inherits = "optimize" +strip = false [workspace.dependencies] -ansi_colours = "1.2.3" -anstyle = "1.0.13" -anyhow = "1.0.100" -bstr = "1.12.0" -cc = "1.2.53" -clap = { version = "4.5.54", features = [ +anstyle = "1.0.8" +anyhow = "1.0.89" +bstr = "1.10.0" +cc = "1.1.21" +clap = { version = "4.5.18", features = [ "cargo", "derive", "env", "help", - "string", "unstable-styles", ] } -clap_complete = "4.5.65" -clap_complete_nushell = "4.5.10" -crc32fast = "1.5.0" -ctor = "0.2.9" -ctrlc = { version = "3.5.0", features = ["termination"] } -dialoguer = { version = "0.11.0", features = ["fuzzy-select"] } -etcetera = "0.11.0" -fs4 = "0.12.0" -glob = "0.3.3" +clap_complete = "4.5.29" +ctor = "0.2.8" +ctrlc = { version = "3.4.5", features = ["termination"] } +dirs = "5.0.1" +filetime = "0.2.25" +fs4 = "0.8.4" +git2 = "0.18.3" +glob = "0.3.1" heck = "0.5.0" html-escape = "0.2.13" -indexmap = "2.12.1" -indoc = "2.0.6" -libloading = "0.9.0" -log = { version = "0.4.28", features = ["std"] } -memchr = "2.7.6" -once_cell = "1.21.3" +indexmap = "2.5.0" +indoc = "2.0.5" +lazy_static = "1.5.0" +libloading = "0.8.5" +log = { version = "0.4.22", features = ["std"] } +memchr = "2.7.4" +once_cell = "1.19.0" +path-slash = "0.2.1" pretty_assertions = "1.4.1" rand = "0.8.5" -regex = "1.11.3" -regex-syntax = "0.8.6" -rustc-hash = "2.1.1" -schemars = "1.0.5" -semver = { version = "1.0.27", features = ["serde"] } -serde = { version = "1.0.219", features = ["derive"] } -serde_json = { version = "1.0.149", features = ["preserve_order"] } -similar = "2.7.0" -smallbitvec = "2.6.0" -streaming-iterator = "0.1.9" -tempfile = "3.23.0" -thiserror = "2.0.17" +regex = "1.10.6" +regex-syntax = "0.8.4" +rustc-hash = "1.1.0" +semver = "1.0.23" +serde = { version = "1.0.210", features = ["derive"] } +serde_derive = "1.0.197" +serde_json = { version = "1.0.128", features = ["preserve_order"] } +similar = "2.6.0" +smallbitvec = "2.5.3" +tempfile = "3.12.0" +thiserror = "1.0.64" tiny_http = "0.12.0" -topological-sort = "0.2.2" -unindent = "0.2.4" +toml = "0.8.19" +unindent = "0.2.3" walkdir = "2.5.0" -wasmparser = "0.243.0" -webbrowser = "1.0.5" +wasmparser = "0.215.0" +webbrowser = "1.0.2" -tree-sitter = { version = "0.27.0", path = "./lib" } -tree-sitter-generate = { version = "0.27.0", path = "./crates/generate" } -tree-sitter-loader = { version = "0.27.0", path = "./crates/loader" } -tree-sitter-config = { version = "0.27.0", path = "./crates/config" } -tree-sitter-highlight = { version = "0.27.0", path = "./crates/highlight" } -tree-sitter-tags = { version = "0.27.0", path = "./crates/tags" } - -tree-sitter-language = { version = "0.1", path = "./crates/language" } +tree-sitter = { version = "0.23.0", path = "./lib" } +tree-sitter-loader = { version = "0.23.0", path = "./cli/loader" } +tree-sitter-config = { version = "0.23.0", path = "./cli/config" } +tree-sitter-highlight = { version = "0.23.0", path = "./highlight" } +tree-sitter-tags = { version = "0.23.0", path = "./tags" } diff --git a/LICENSE b/LICENSE index 971b81f9..451fe1d2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Max Brunsfeld +Copyright (c) 2018-2024 Max Brunsfeld Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile index 2098d275..4127acd3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,8 @@ -VERSION := 0.27.0 +ifeq ($(OS),Windows_NT) +$(error Windows is not supported) +endif + +VERSION := 0.23.0 DESCRIPTION := An incremental parsing system for programming tools HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ @@ -6,7 +10,6 @@ HOMEPAGE_URL := https://tree-sitter.github.io/tree-sitter/ PREFIX ?= /usr/local INCLUDEDIR ?= $(PREFIX)/include LIBDIR ?= $(PREFIX)/lib -BINDIR ?= $(PREFIX)/bin PCLIBDIR ?= $(LIBDIR)/pkgconfig # collect sources @@ -22,9 +25,8 @@ OBJ := $(SRC:.c=.o) # define default flags, and override to append mandatory flags ARFLAGS := rcs -CFLAGS ?= -O3 -Wall -Wextra -Wshadow -Wpedantic -Werror=incompatible-pointer-types +CFLAGS ?= -O3 -Wall -Wextra -Wshadow -pedantic override CFLAGS += -std=c11 -fPIC -fvisibility=hidden -override CFLAGS += -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_DARWIN_C_SOURCE override CFLAGS += -Ilib/src -Ilib/src/wasm -Ilib/include # ABI versioning @@ -32,25 +34,20 @@ SONAME_MAJOR := $(word 1,$(subst ., ,$(VERSION))) SONAME_MINOR := $(word 2,$(subst ., ,$(VERSION))) # OS-specific bits -MACHINE := $(shell $(CC) -dumpmachine) - -ifneq ($(findstring darwin,$(MACHINE)),) +ifneq ($(findstring darwin,$(shell $(CC) -dumpmachine)),) SOEXT = dylib SOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT) SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT) LINKSHARED += -dynamiclib -Wl,-install_name,$(LIBDIR)/libtree-sitter.$(SOEXTVER) -else ifneq ($(findstring mingw32,$(MACHINE)),) - SOEXT = dll - LINKSHARED += -s -shared -Wl,--out-implib,libtree-sitter.dll.a else SOEXT = so SOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR) SOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR) LINKSHARED += -shared -Wl,-soname,libtree-sitter.$(SOEXTVER) +endif ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),) PCLIBDIR := $(PREFIX)/libdata/pkgconfig endif -endif all: libtree-sitter.a libtree-sitter.$(SOEXT) tree-sitter.pc @@ -63,39 +60,25 @@ ifneq ($(STRIP),) $(STRIP) $@ endif -ifneq ($(findstring mingw32,$(MACHINE)),) -libtree-sitter.dll.a: libtree-sitter.$(SOEXT) -endif - tree-sitter.pc: lib/tree-sitter.pc.in sed -e 's|@PROJECT_VERSION@|$(VERSION)|' \ - -e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \ - -e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \ + -e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR)|' \ + -e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR)|' \ -e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \ -e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \ -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ -shared: libtree-sitter.$(SOEXT) - -static: libtree-sitter.a - clean: - $(RM) $(OBJ) tree-sitter.pc libtree-sitter.a libtree-sitter.$(SOEXT) libtree-stitter.dll.a + $(RM) $(OBJ) tree-sitter.pc libtree-sitter.a libtree-sitter.$(SOEXT) install: all install -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' install -m644 lib/include/tree_sitter/api.h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/api.h install -m644 tree-sitter.pc '$(DESTDIR)$(PCLIBDIR)'/tree-sitter.pc install -m644 libtree-sitter.a '$(DESTDIR)$(LIBDIR)'/libtree-sitter.a -ifneq ($(findstring mingw32,$(MACHINE)),) - install -d '$(DESTDIR)$(BINDIR)' - install -m755 libtree-sitter.dll '$(DESTDIR)$(BINDIR)'/libtree-sitter.dll - install -m755 libtree-sitter.dll.a '$(DESTDIR)$(LIBDIR)'/libtree-sitter.dll.a -else install -m755 libtree-sitter.$(SOEXT) '$(DESTDIR)$(LIBDIR)'/libtree-sitter.$(SOEXTVER) - cd '$(DESTDIR)$(LIBDIR)' && ln -sf libtree-sitter.$(SOEXTVER) libtree-sitter.$(SOEXTVER_MAJOR) - cd '$(DESTDIR)$(LIBDIR)' && ln -sf libtree-sitter.$(SOEXTVER_MAJOR) libtree-sitter.$(SOEXT) -endif + ln -sf libtree-sitter.$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/libtree-sitter.$(SOEXTVER_MAJOR) + ln -sf libtree-sitter.$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/libtree-sitter.$(SOEXT) uninstall: $(RM) '$(DESTDIR)$(LIBDIR)'/libtree-sitter.a \ @@ -104,36 +87,31 @@ uninstall: '$(DESTDIR)$(LIBDIR)'/libtree-sitter.$(SOEXT) \ '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/api.h \ '$(DESTDIR)$(PCLIBDIR)'/tree-sitter.pc - rmdir '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter -.PHONY: all shared static install uninstall clean +.PHONY: all install uninstall clean ##### Dev targets ##### test: - cargo xtask fetch-fixtures - cargo xtask generate-fixtures - cargo xtask test + script/fetch-fixtures + script/generate-fixtures + script/test -test-wasm: - cargo xtask generate-fixtures --wasm - cargo xtask test-wasm +test_wasm: + script/generate-fixtures-wasm + script/test-wasm lint: cargo update --workspace --locked --quiet cargo check --workspace --all-targets - cargo fmt --all --check + cargo +nightly fmt --all --check cargo clippy --workspace --all-targets -- -D warnings -lint-web: - npm --prefix lib/binding_web ci - npm --prefix lib/binding_web run lint - format: - cargo fmt --all + cargo +nightly fmt --all changelog: - @git-cliff --config .github/cliff.toml --prepend CHANGELOG.md --latest --github-token $(shell gh auth token) + @git-cliff --config script/cliff.toml --output CHANGELOG.md --latest --github-token $(shell gh auth token) -.PHONY: test test-wasm lint format changelog +.PHONY: test test_wasm lint format changelog diff --git a/Package.swift b/Package.swift index fb6c6e95..3a4b9744 100644 --- a/Package.swift +++ b/Package.swift @@ -14,22 +14,8 @@ let package = Package( targets: [ .target(name: "TreeSitter", path: "lib", - exclude: [ - "src/unicode/ICU_SHA", - "src/unicode/README.md", - "src/unicode/LICENSE", - "src/wasm/stdlib-symbols.txt", - "src/lib.c", - ], - sources: ["src"], - publicHeadersPath: "include", - cSettings: [ - .headerSearchPath("src"), - .define("_POSIX_C_SOURCE", to: "200112L"), - .define("_DEFAULT_SOURCE"), - .define("_BSD_SOURCE"), - .define("_DARWIN_C_SOURCE"), - ]), + sources: ["src/lib.c"], + cSettings: [.headerSearchPath("src")]), ], cLanguageStandard: .c11 ) diff --git a/README.md b/README.md index b347c880..d378215e 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ Tree-sitter is a parser generator tool and an incremental parsing library. It ca ## Links - [Documentation](https://tree-sitter.github.io) - [Rust binding](lib/binding_rust/README.md) -- [Wasm binding](lib/binding_web/README.md) -- [Command-line interface](crates/cli/README.md) +- [WASM binding](lib/binding_web/README.md) +- [Command-line interface](cli/README.md) [discord]: https://img.shields.io/discord/1063097320771698699?logo=discord&label=discord [matrix]: https://img.shields.io/matrix/tree-sitter-chat%3Amatrix.org?logo=matrix&label=matrix diff --git a/build.zig b/build.zig index 9bb1e818..8c1273c7 100644 --- a/build.zig +++ b/build.zig @@ -1,142 +1,18 @@ const std = @import("std"); -pub fn build(b: *std.Build) !void { - const target = b.standardTargetOptions(.{}); - const optimize = b.standardOptimizeOption(.{}); - - const wasm = b.option(bool, "enable-wasm", "Enable Wasm support") orelse false; - const shared = b.option(bool, "build-shared", "Build a shared library") orelse false; - const amalgamated = b.option(bool, "amalgamated", "Build using an amalgamated source") orelse false; - - const lib: *std.Build.Step.Compile = b.addLibrary(.{ +pub fn build(b: *std.Build) void { + var lib = b.addStaticLibrary(.{ .name = "tree-sitter", - .linkage = if (shared) .dynamic else .static, - .root_module = b.createModule(.{ - .target = target, - .optimize = optimize, - .link_libc = true, - .pic = if (shared) true else null, - }), + .target = b.standardTargetOptions(.{}), + .optimize = b.standardOptimizeOption(.{}), }); - if (amalgamated) { - lib.addCSourceFile(.{ - .file = b.path("lib/src/lib.c"), - .flags = &.{"-std=c11"}, - }); - } else { - const files = try findSourceFiles(b); - defer b.allocator.free(files); - lib.addCSourceFiles(.{ - .root = b.path("lib/src"), - .files = files, - .flags = &.{"-std=c11"}, - }); - } - + lib.linkLibC(); + lib.addCSourceFile(.{ .file = b.path("lib/src/lib.c"), .flags = &.{"-std=c11"} }); lib.addIncludePath(b.path("lib/include")); lib.addIncludePath(b.path("lib/src")); - lib.addIncludePath(b.path("lib/src/wasm")); - - lib.root_module.addCMacro("_POSIX_C_SOURCE", "200112L"); - lib.root_module.addCMacro("_DEFAULT_SOURCE", ""); - lib.root_module.addCMacro("_BSD_SOURCE", ""); - lib.root_module.addCMacro("_DARWIN_C_SOURCE", ""); - - if (wasm) { - if (b.lazyDependency(wasmtimeDep(target.result), .{})) |wasmtime| { - lib.root_module.addCMacro("TREE_SITTER_FEATURE_WASM", ""); - lib.addSystemIncludePath(wasmtime.path("include")); - lib.addLibraryPath(wasmtime.path("lib")); - if (shared) lib.linkSystemLibrary("wasmtime"); - } - } lib.installHeadersDirectory(b.path("lib/include"), ".", .{}); b.installArtifact(lib); } - -/// Get the name of the wasmtime dependency for this target. -pub fn wasmtimeDep(target: std.Target) []const u8 { - const arch = target.cpu.arch; - const os = target.os.tag; - const abi = target.abi; - return @as(?[]const u8, switch (os) { - .linux => switch (arch) { - .x86_64 => switch (abi) { - .gnu => "wasmtime_c_api_x86_64_linux", - .musl => "wasmtime_c_api_x86_64_musl", - .android => "wasmtime_c_api_x86_64_android", - else => null, - }, - .aarch64 => switch (abi) { - .gnu => "wasmtime_c_api_aarch64_linux", - .musl => "wasmtime_c_api_aarch64_musl", - .android => "wasmtime_c_api_aarch64_android", - else => null, - }, - .x86 => switch (abi) { - .gnu => "wasmtime_c_api_i686_linux", - else => null, - }, - .arm => switch (abi) { - .gnueabi => "wasmtime_c_api_armv7_linux", - else => null, - }, - .s390x => switch (abi) { - .gnu => "wasmtime_c_api_s390x_linux", - else => null, - }, - .riscv64 => switch (abi) { - .gnu => "wasmtime_c_api_riscv64gc_linux", - else => null, - }, - else => null, - }, - .windows => switch (arch) { - .x86_64 => switch (abi) { - .gnu => "wasmtime_c_api_x86_64_mingw", - .msvc => "wasmtime_c_api_x86_64_windows", - else => null, - }, - .aarch64 => switch (abi) { - .msvc => "wasmtime_c_api_aarch64_windows", - else => null, - }, - .x86 => switch (abi) { - .msvc => "wasmtime_c_api_i686_windows", - else => null, - }, - else => null, - }, - .macos => switch (arch) { - .x86_64 => "wasmtime_c_api_x86_64_macos", - .aarch64 => "wasmtime_c_api_aarch64_macos", - else => null, - }, - else => null, - }) orelse std.debug.panic( - "Unsupported target for wasmtime: {s}-{s}-{s}", - .{ @tagName(arch), @tagName(os), @tagName(abi) }, - ); -} - -fn findSourceFiles(b: *std.Build) ![]const []const u8 { - var sources: std.ArrayListUnmanaged([]const u8) = .empty; - - var dir = try b.build_root.handle.openDir("lib/src", .{ .iterate = true }); - var iter = dir.iterate(); - defer dir.close(); - - while (try iter.next()) |entry| { - if (entry.kind != .file) continue; - const file = entry.name; - const ext = std.fs.path.extension(file); - if (std.mem.eql(u8, ext, ".c") and !std.mem.eql(u8, file, "lib.c")) { - try sources.append(b.allocator, b.dupe(file)); - } - } - - return sources.toOwnedSlice(b.allocator); -} diff --git a/build.zig.zon b/build.zig.zon index 4ef5de16..97b4cdb9 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,96 +1,10 @@ .{ - .name = .tree_sitter, - .fingerprint = 0x841224b447ac0d4f, - .version = "0.27.0", - .minimum_zig_version = "0.14.1", + .name = "tree-sitter", + .version = "0.23.0", .paths = .{ "build.zig", "build.zig.zon", "lib/src", "lib/include", - "README.md", - "LICENSE", - }, - .dependencies = .{ - .wasmtime_c_api_aarch64_android = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-android-c-api.tar.xz", - .hash = "N-V-__8AAIfPIgdw2YnV3QyiFQ2NHdrxrXzzCdjYJyxJDOta", - .lazy = true, - }, - .wasmtime_c_api_aarch64_linux = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-linux-c-api.tar.xz", - .hash = "N-V-__8AAIt97QZi7Pf7nNJ2mVY6uxA80Klyuvvtop3pLMRK", - .lazy = true, - }, - .wasmtime_c_api_aarch64_macos = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-macos-c-api.tar.xz", - .hash = "N-V-__8AAAO48QQf91w9RmmUDHTja8DrXZA1n6Bmc8waW3qe", - .lazy = true, - }, - .wasmtime_c_api_aarch64_musl = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-musl-c-api.tar.xz", - .hash = "N-V-__8AAI196wa9pwADoA2RbCDp5F7bKQg1iOPq6gIh8-FH", - .lazy = true, - }, - .wasmtime_c_api_aarch64_windows = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-aarch64-windows-c-api.zip", - .hash = "N-V-__8AAC9u4wXfqd1Q6XyQaC8_DbQZClXux60Vu5743N05", - .lazy = true, - }, - .wasmtime_c_api_armv7_linux = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-armv7-linux-c-api.tar.xz", - .hash = "N-V-__8AAHXe8gWs3s83Cc5G6SIq0_jWxj8fGTT5xG4vb6-x", - .lazy = true, - }, - .wasmtime_c_api_i686_linux = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-i686-linux-c-api.tar.xz", - .hash = "N-V-__8AAN2pzgUUfulRCYnipSfis9IIYHoTHVlieLRmKuct", - .lazy = true, - }, - .wasmtime_c_api_i686_windows = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-i686-windows-c-api.zip", - .hash = "N-V-__8AAJu0YAUUTFBLxFIOi-MSQVezA6MMkpoFtuaf2Quf", - .lazy = true, - }, - .wasmtime_c_api_riscv64gc_linux = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-riscv64gc-linux-c-api.tar.xz", - .hash = "N-V-__8AAG8m-gc3E3AIImtTZ3l1c7HC6HUWazQ9OH5KACX4", - .lazy = true, - }, - .wasmtime_c_api_s390x_linux = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-s390x-linux-c-api.tar.xz", - .hash = "N-V-__8AAH314gd-gE4IBp2uvAL3gHeuW1uUZjMiLLeUdXL_", - .lazy = true, - }, - .wasmtime_c_api_x86_64_android = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-android-c-api.tar.xz", - .hash = "N-V-__8AAIPNRwfNkznebrcGb0IKUe7f35bkuZEYOjcx6q3f", - .lazy = true, - }, - .wasmtime_c_api_x86_64_linux = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-linux-c-api.tar.xz", - .hash = "N-V-__8AAI8EDwcyTtk_Afhk47SEaqfpoRqGkJeZpGs69ChF", - .lazy = true, - }, - .wasmtime_c_api_x86_64_macos = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-macos-c-api.tar.xz", - .hash = "N-V-__8AAGtGNgVaOpHSxC22IjrampbRIy6lLwscdcAE8nG1", - .lazy = true, - }, - .wasmtime_c_api_x86_64_mingw = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-mingw-c-api.zip", - .hash = "N-V-__8AAPS2PAbVix50L6lnddlgazCPTz3whLUFk1qnRtnZ", - .lazy = true, - }, - .wasmtime_c_api_x86_64_musl = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-musl-c-api.tar.xz", - .hash = "N-V-__8AAF-WEQe0nzvi09PgusM5i46FIuCKJmIDWUleWgQ3", - .lazy = true, - }, - .wasmtime_c_api_x86_64_windows = .{ - .url = "https://github.com/bytecodealliance/wasmtime/releases/download/v33.0.2/wasmtime-v33.0.2-x86_64-windows-c-api.zip", - .hash = "N-V-__8AAKGNXwbpJQsn0_6kwSIVDDWifSg8cBzf7T2RzsC9", - .lazy = true, - }, }, } diff --git a/crates/cli/Cargo.toml b/cli/Cargo.toml similarity index 73% rename from crates/cli/Cargo.toml rename to cli/Cargo.toml index c10b4652..36c2f9c8 100644 --- a/crates/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -8,17 +8,9 @@ rust-version.workspace = true readme = "README.md" homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter-cli" license.workspace = true keywords.workspace = true categories.workspace = true -include = ["build.rs", "README.md", "LICENSE", "benches/*", "src/**"] - -[lints] -workspace = true - -[lib] -path = "src/tree_sitter_cli.rs" [[bin]] name = "tree-sitter" @@ -30,52 +22,51 @@ name = "benchmark" harness = false [features] -default = ["qjs-rt"] wasm = ["tree-sitter/wasm", "tree-sitter-loader/wasm"] -qjs-rt = ["tree-sitter-generate/qjs-rt"] [dependencies] -ansi_colours.workspace = true anstyle.workspace = true anyhow.workspace = true bstr.workspace = true clap.workspace = true clap_complete.workspace = true -clap_complete_nushell.workspace = true -crc32fast.workspace = true ctor.workspace = true ctrlc.workspace = true -dialoguer.workspace = true +dirs.workspace = true +filetime.workspace = true glob.workspace = true heck.workspace = true html-escape.workspace = true +indexmap.workspace = true indoc.workspace = true +lazy_static.workspace = true log.workspace = true memchr.workspace = true rand.workspace = true regex.workspace = true -schemars.workspace = true +regex-syntax.workspace = true +rustc-hash.workspace = true semver.workspace = true serde.workspace = true +serde_derive.workspace = true serde_json.workspace = true similar.workspace = true -streaming-iterator.workspace = true -thiserror.workspace = true +smallbitvec.workspace = true tiny_http.workspace = true walkdir.workspace = true wasmparser.workspace = true webbrowser.workspace = true tree-sitter.workspace = true -tree-sitter-generate.workspace = true tree-sitter-config.workspace = true tree-sitter-highlight.workspace = true tree-sitter-loader.workspace = true tree-sitter-tags.workspace = true +[target."cfg(windows)".dependencies] +url = "2.5.2" + [dev-dependencies] -encoding_rs = "0.8.35" -widestring = "1.2.1" tree_sitter_proc_macro = { path = "src/tests/proc_macro", package = "tree-sitter-tests-proc-macro" } tempfile.workspace = true diff --git a/crates/cli/README.md b/cli/README.md similarity index 79% rename from crates/cli/README.md rename to cli/README.md index e3ef899e..eb93bcfa 100644 --- a/crates/cli/README.md +++ b/cli/README.md @@ -7,15 +7,14 @@ [npmjs.com]: https://www.npmjs.org/package/tree-sitter-cli [npmjs.com badge]: https://img.shields.io/npm/v/tree-sitter-cli.svg?color=%23BF4A4A -The Tree-sitter CLI allows you to develop, test, and use Tree-sitter grammars from the command line. It works on `MacOS`, -`Linux`, and `Windows`. +The Tree-sitter CLI allows you to develop, test, and use Tree-sitter grammars from the command line. It works on MacOS, Linux, and Windows. ### Installation You can install the `tree-sitter-cli` with `cargo`: ```sh -cargo install --locked tree-sitter-cli +cargo install tree-sitter-cli ``` or with `npm`: @@ -35,11 +34,9 @@ The `tree-sitter` binary itself has no dependencies, but specific commands have ### Commands -* `generate` - The `tree-sitter generate` command will generate a Tree-sitter parser based on the grammar in the current - working directory. See [the documentation] for more information. +* `generate` - The `tree-sitter generate` command will generate a Tree-sitter parser based on the grammar in the current working directory. See [the documentation] for more information. -* `test` - The `tree-sitter test` command will run the unit tests for the Tree-sitter parser in the current working directory. - See [the documentation] for more information. +* `test` - The `tree-sitter test` command will run the unit tests for the Tree-sitter parser in the current working directory. See [the documentation] for more information. * `parse` - The `tree-sitter parse` command will parse a file (or list of files) using Tree-sitter parsers. diff --git a/crates/cli/benches/benchmark.rs b/cli/benches/benchmark.rs similarity index 58% rename from crates/cli/benches/benchmark.rs rename to cli/benches/benchmark.rs index 3edda96e..7d6cc2fb 100644 --- a/crates/cli/benches/benchmark.rs +++ b/cli/benches/benchmark.rs @@ -3,77 +3,70 @@ use std::{ env, fs, path::{Path, PathBuf}, str, - sync::LazyLock, time::Instant, }; use anyhow::Context; -use log::info; +use lazy_static::lazy_static; use tree_sitter::{Language, Parser, Query}; use tree_sitter_loader::{CompileConfig, Loader}; include!("../src/tests/helpers/dirs.rs"); -static LANGUAGE_FILTER: LazyLock> = - LazyLock::new(|| env::var("TREE_SITTER_BENCHMARK_LANGUAGE_FILTER").ok()); -static EXAMPLE_FILTER: LazyLock> = - LazyLock::new(|| env::var("TREE_SITTER_BENCHMARK_EXAMPLE_FILTER").ok()); -static REPETITION_COUNT: LazyLock = LazyLock::new(|| { - env::var("TREE_SITTER_BENCHMARK_REPETITION_COUNT") +lazy_static! { + static ref LANGUAGE_FILTER: Option = + env::var("TREE_SITTER_BENCHMARK_LANGUAGE_FILTER").ok(); + static ref EXAMPLE_FILTER: Option = + env::var("TREE_SITTER_BENCHMARK_EXAMPLE_FILTER").ok(); + static ref REPETITION_COUNT: usize = env::var("TREE_SITTER_BENCHMARK_REPETITION_COUNT") .map(|s| s.parse::().unwrap()) - .unwrap_or(5) -}); -static TEST_LOADER: LazyLock = - LazyLock::new(|| Loader::with_parser_lib_path(SCRATCH_DIR.clone())); + .unwrap_or(5); + static ref TEST_LOADER: Loader = Loader::with_parser_lib_path(SCRATCH_DIR.clone()); + static ref EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR: BTreeMap, Vec)> = { + fn process_dir(result: &mut BTreeMap, Vec)>, dir: &Path) { + if dir.join("grammar.js").exists() { + let relative_path = dir.strip_prefix(GRAMMARS_DIR.as_path()).unwrap(); + let (example_paths, query_paths) = + result.entry(relative_path.to_owned()).or_default(); -#[allow(clippy::type_complexity)] -static EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR: LazyLock< - BTreeMap, Vec)>, -> = LazyLock::new(|| { - fn process_dir(result: &mut BTreeMap, Vec)>, dir: &Path) { - if dir.join("grammar.js").exists() { - let relative_path = dir.strip_prefix(GRAMMARS_DIR.as_path()).unwrap(); - let (example_paths, query_paths) = result.entry(relative_path.to_owned()).or_default(); + if let Ok(example_files) = fs::read_dir(dir.join("examples")) { + example_paths.extend(example_files.filter_map(|p| { + let p = p.unwrap().path(); + if p.is_file() { + Some(p) + } else { + None + } + })); + } - if let Ok(example_files) = fs::read_dir(dir.join("examples")) { - example_paths.extend(example_files.filter_map(|p| { - let p = p.unwrap().path(); - if p.is_file() { - Some(p) - } else { - None + if let Ok(query_files) = fs::read_dir(dir.join("queries")) { + query_paths.extend(query_files.filter_map(|p| { + let p = p.unwrap().path(); + if p.is_file() { + Some(p) + } else { + None + } + })); + } + } else { + for entry in fs::read_dir(dir).unwrap() { + let entry = entry.unwrap().path(); + if entry.is_dir() { + process_dir(result, &entry); } - })); - } - - if let Ok(query_files) = fs::read_dir(dir.join("queries")) { - query_paths.extend(query_files.filter_map(|p| { - let p = p.unwrap().path(); - if p.is_file() { - Some(p) - } else { - None - } - })); - } - } else { - for entry in fs::read_dir(dir).unwrap() { - let entry = entry.unwrap().path(); - if entry.is_dir() { - process_dir(result, &entry); } } } - } - let mut result = BTreeMap::new(); - process_dir(&mut result, &GRAMMARS_DIR); - result -}); + let mut result = BTreeMap::new(); + process_dir(&mut result, &GRAMMARS_DIR); + result + }; +} fn main() { - tree_sitter_cli::logger::init(); - let max_path_length = EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR .values() .flat_map(|(e, q)| { @@ -84,7 +77,7 @@ fn main() { .max() .unwrap_or(0); - info!("Benchmarking with {} repetitions", *REPETITION_COUNT); + eprintln!("Benchmarking with {} repetitions", *REPETITION_COUNT); let mut parser = Parser::new(); let mut all_normal_speeds = Vec::new(); @@ -101,11 +94,11 @@ fn main() { } } - info!("\nLanguage: {language_name}"); + eprintln!("\nLanguage: {language_name}"); let language = get_language(language_path); parser.set_language(&language).unwrap(); - info!(" Constructing Queries"); + eprintln!(" Constructing Queries"); for path in query_paths { if let Some(filter) = EXAMPLE_FILTER.as_ref() { if !path.to_str().unwrap().contains(filter.as_str()) { @@ -115,12 +108,12 @@ fn main() { parse(path, max_path_length, |source| { Query::new(&language, str::from_utf8(source).unwrap()) - .with_context(|| format!("Query file path: {}", path.display())) + .with_context(|| format!("Query file path: {path:?}")) .expect("Failed to parse query"); }); } - info!(" Parsing Valid Code:"); + eprintln!(" Parsing Valid Code:"); let mut normal_speeds = Vec::new(); for example_path in example_paths { if let Some(filter) = EXAMPLE_FILTER.as_ref() { @@ -134,7 +127,7 @@ fn main() { })); } - info!(" Parsing Invalid Code (mismatched languages):"); + eprintln!(" Parsing Invalid Code (mismatched languages):"); let mut error_speeds = Vec::new(); for (other_language_path, (example_paths, _)) in EXAMPLE_AND_QUERY_PATHS_BY_LANGUAGE_DIR.iter() @@ -155,30 +148,30 @@ fn main() { } if let Some((average_normal, worst_normal)) = aggregate(&normal_speeds) { - info!(" Average Speed (normal): {average_normal} bytes/ms"); - info!(" Worst Speed (normal): {worst_normal} bytes/ms"); + eprintln!(" Average Speed (normal): {average_normal} bytes/ms"); + eprintln!(" Worst Speed (normal): {worst_normal} bytes/ms"); } if let Some((average_error, worst_error)) = aggregate(&error_speeds) { - info!(" Average Speed (errors): {average_error} bytes/ms"); - info!(" Worst Speed (errors): {worst_error} bytes/ms"); + eprintln!(" Average Speed (errors): {average_error} bytes/ms"); + eprintln!(" Worst Speed (errors): {worst_error} bytes/ms"); } all_normal_speeds.extend(normal_speeds); all_error_speeds.extend(error_speeds); } - info!("\n Overall"); + eprintln!("\n Overall"); if let Some((average_normal, worst_normal)) = aggregate(&all_normal_speeds) { - info!(" Average Speed (normal): {average_normal} bytes/ms"); - info!(" Worst Speed (normal): {worst_normal} bytes/ms"); + eprintln!(" Average Speed (normal): {average_normal} bytes/ms"); + eprintln!(" Worst Speed (normal): {worst_normal} bytes/ms"); } if let Some((average_error, worst_error)) = aggregate(&all_error_speeds) { - info!(" Average Speed (errors): {average_error} bytes/ms"); - info!(" Worst Speed (errors): {worst_error} bytes/ms"); + eprintln!(" Average Speed (errors): {average_error} bytes/ms"); + eprintln!(" Worst Speed (errors): {worst_error} bytes/ms"); } - info!(""); + eprintln!(); } fn aggregate(speeds: &[usize]) -> Option<(usize, usize)> { @@ -197,8 +190,14 @@ fn aggregate(speeds: &[usize]) -> Option<(usize, usize)> { } fn parse(path: &Path, max_path_length: usize, mut action: impl FnMut(&[u8])) -> usize { + eprint!( + " {:width$}\t", + path.file_name().unwrap().to_str().unwrap(), + width = max_path_length + ); + let source_code = fs::read(path) - .with_context(|| format!("Failed to read {}", path.display())) + .with_context(|| format!("Failed to read {path:?}")) .unwrap(); let time = Instant::now(); for _ in 0..*REPETITION_COUNT { @@ -207,9 +206,8 @@ fn parse(path: &Path, max_path_length: usize, mut action: impl FnMut(&[u8])) -> let duration = time.elapsed() / (*REPETITION_COUNT as u32); let duration_ns = duration.as_nanos(); let speed = ((source_code.len() as u128) * 1_000_000) / duration_ns; - info!( - " {:max_path_length$}\ttime {:>7.2} ms\t\tspeed {speed:>6} bytes/ms", - path.file_name().unwrap().to_str().unwrap(), + eprintln!( + "time {:>7.2} ms\t\tspeed {speed:>6} bytes/ms", (duration_ns as f64) / 1e6, ); speed as usize @@ -219,6 +217,6 @@ fn get_language(path: &Path) -> Language { let src_path = GRAMMARS_DIR.join(path).join("src"); TEST_LOADER .load_language_at_path(CompileConfig::new(&src_path, None, None)) - .with_context(|| format!("Failed to load language at path {}", src_path.display())) + .with_context(|| format!("Failed to load language at path {src_path:?}")) .unwrap() } diff --git a/cli/build.rs b/cli/build.rs new file mode 100644 index 00000000..375d87d6 --- /dev/null +++ b/cli/build.rs @@ -0,0 +1,142 @@ +use std::{ + env, + ffi::OsStr, + fs, + path::{Path, PathBuf}, + time::SystemTime, +}; + +fn main() { + if let Some(git_sha) = read_git_sha() { + println!("cargo:rustc-env=BUILD_SHA={git_sha}"); + } + + println!("cargo:rustc-check-cfg=cfg(sanitizing)"); + println!("cargo:rustc-check-cfg=cfg(TREE_SITTER_EMBED_WASM_BINDING)"); + + if web_playground_files_present() { + println!("cargo:rustc-cfg=TREE_SITTER_EMBED_WASM_BINDING"); + } + + let build_time = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs_f64(); + println!("cargo:rustc-env=BUILD_TIME={build_time}"); + + #[cfg(any( + target_os = "linux", + target_os = "android", + target_os = "freebsd", + target_os = "openbsd", + target_os = "netbsd", + target_os = "dragonfly", + ))] + { + let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()).join("dynamic-symbols.txt"); + std::fs::write( + &out_dir, + "{ + ts_current_malloc; + ts_current_calloc; + ts_current_realloc; + ts_current_free; + };", + ) + .unwrap(); + println!( + "cargo:rustc-link-arg=-Wl,--dynamic-list={}", + out_dir.display() + ); + } +} + +fn web_playground_files_present() -> bool { + let paths = [ + "../docs/assets/js/playground.js", + "../lib/binding_web/tree-sitter.js", + "../lib/binding_web/tree-sitter.wasm", + ]; + + paths.iter().all(|p| Path::new(p).exists()) +} + +fn read_git_sha() -> Option { + let mut repo_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); + + let mut git_path; + loop { + git_path = repo_path.join(".git"); + if git_path.exists() { + break; + } + if !repo_path.pop() { + return None; + } + } + + let git_dir_path; + if git_path.is_dir() { + git_dir_path = git_path; + } else if let Ok(git_path_content) = fs::read_to_string(&git_path) { + git_dir_path = repo_path.join(git_path_content.get("gitdir: ".len()..).unwrap().trim_end()); + } else { + return None; + } + let git_head_path = git_dir_path.join("HEAD"); + if let Some(path) = git_head_path.to_str() { + println!("cargo:rerun-if-changed={path}"); + } + if let Ok(mut head_content) = fs::read_to_string(&git_head_path) { + if head_content.ends_with('\n') { + head_content.pop(); + } + + // If we're on a branch, read the SHA from the ref file. + if head_content.starts_with("ref: ") { + head_content.replace_range(0.."ref: ".len(), ""); + let ref_filename = { + // Go to real non-worktree gitdir + let git_dir_path = git_dir_path + .parent() + .and_then(|p| { + p.file_name() + .map(|n| n == OsStr::new("worktrees")) + .and_then(|x| x.then(|| p.parent())) + }) + .flatten() + .unwrap_or(&git_dir_path); + + let file = git_dir_path.join(&head_content); + if file.is_file() { + file + } else { + let packed_refs = git_dir_path.join("packed-refs"); + if let Ok(packed_refs_content) = fs::read_to_string(&packed_refs) { + for line in packed_refs_content.lines() { + if let Some((hash, r#ref)) = line.split_once(' ') { + if r#ref == head_content { + if let Some(path) = packed_refs.to_str() { + println!("cargo:rerun-if-changed={path}"); + } + return Some(hash.to_string()); + } + } + } + } + return None; + } + }; + if let Some(path) = ref_filename.to_str() { + println!("cargo:rerun-if-changed={path}"); + } + return fs::read_to_string(&ref_filename).ok(); + } + // If we're on a detached commit, then the `HEAD` file itself contains the sha. + if head_content.len() == 40 { + return Some(head_content); + } + } + + None +} diff --git a/crates/config/Cargo.toml b/cli/config/Cargo.toml similarity index 69% rename from crates/config/Cargo.toml rename to cli/config/Cargo.toml index 641b434b..8379a546 100644 --- a/crates/config/Cargo.toml +++ b/cli/config/Cargo.toml @@ -8,20 +8,12 @@ rust-version.workspace = true readme = "README.md" homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter-config" license.workspace = true keywords.workspace = true categories.workspace = true -[lib] -path = "src/tree_sitter_config.rs" - -[lints] -workspace = true - [dependencies] -etcetera.workspace = true -log.workspace = true +anyhow.workspace = true +dirs.workspace = true serde.workspace = true serde_json.workspace = true -thiserror.workspace = true diff --git a/crates/config/README.md b/cli/config/README.md similarity index 100% rename from crates/config/README.md rename to cli/config/README.md diff --git a/crates/config/src/tree_sitter_config.rs b/cli/config/src/lib.rs similarity index 56% rename from crates/config/src/tree_sitter_config.rs rename to cli/config/src/lib.rs index 17b1d384..6d240c52 100644 --- a/crates/config/src/tree_sitter_config.rs +++ b/cli/config/src/lib.rs @@ -1,54 +1,10 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] +#![doc = include_str!("../README.md")] -use std::{ - env, fs, - path::{Path, PathBuf}, -}; +use std::{env, fs, path::PathBuf}; -use etcetera::BaseStrategy as _; -use log::warn; +use anyhow::{anyhow, Context, Result}; use serde::{Deserialize, Serialize}; use serde_json::Value; -use thiserror::Error; - -pub type ConfigResult = Result; - -#[derive(Debug, Error)] -pub enum ConfigError { - #[error("Bad JSON config {0} -- {1}")] - ConfigRead(String, serde_json::Error), - #[error(transparent)] - HomeDir(#[from] etcetera::HomeDirError), - #[error(transparent)] - IO(IoError), - #[error(transparent)] - Serialization(#[from] serde_json::Error), -} - -#[derive(Debug, Error)] -pub struct IoError { - pub error: std::io::Error, - pub path: Option, -} - -impl IoError { - fn new(error: std::io::Error, path: Option<&Path>) -> Self { - Self { - error, - path: path.map(|p| p.to_string_lossy().to_string()), - } - } -} - -impl std::fmt::Display for IoError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.error)?; - if let Some(ref path) = self.path { - write!(f, " ({path})")?; - } - Ok(()) - } -} /// Holds the contents of tree-sitter's configuration file. /// @@ -65,7 +21,7 @@ pub struct Config { } impl Config { - pub fn find_config_file() -> ConfigResult> { + pub fn find_config_file() -> Result> { if let Ok(path) = env::var("TREE_SITTER_DIR") { let mut path = PathBuf::from(path); path.push("config.json"); @@ -82,28 +38,8 @@ impl Config { return Ok(Some(xdg_path)); } - if cfg!(target_os = "macos") { - let legacy_apple_path = etcetera::base_strategy::Apple::new()? - .data_dir() // `$HOME/Library/Application Support/` - .join("tree-sitter") - .join("config.json"); - if legacy_apple_path.is_file() { - let xdg_dir = xdg_path.parent().unwrap(); - fs::create_dir_all(xdg_dir) - .map_err(|e| ConfigError::IO(IoError::new(e, Some(xdg_dir))))?; - fs::rename(&legacy_apple_path, &xdg_path).map_err(|e| { - ConfigError::IO(IoError::new(e, Some(legacy_apple_path.as_path()))) - })?; - warn!( - "Your config.json file has been automatically migrated from \"{}\" to \"{}\"", - legacy_apple_path.display(), - xdg_path.display() - ); - return Ok(Some(xdg_path)); - } - } - - let legacy_path = etcetera::home_dir()? + let legacy_path = dirs::home_dir() + .ok_or_else(|| anyhow!("Cannot determine home directory"))? .join(".tree-sitter") .join("config.json"); if legacy_path.is_file() { @@ -113,9 +49,9 @@ impl Config { Ok(None) } - fn xdg_config_file() -> ConfigResult { - let xdg_path = etcetera::choose_base_strategy()? - .config_dir() + fn xdg_config_file() -> Result { + let xdg_path = dirs::config_dir() + .ok_or_else(|| anyhow!("Cannot determine config directory"))? .join("tree-sitter") .join("config.json"); Ok(xdg_path) @@ -127,10 +63,10 @@ impl Config { /// - Location specified by the path parameter if provided /// - `$TREE_SITTER_DIR/config.json`, if the `TREE_SITTER_DIR` environment variable is set /// - `tree-sitter/config.json` in your default user configuration directory, as determined by - /// [`etcetera::choose_base_strategy`](https://docs.rs/etcetera/*/etcetera/#basestrategy) + /// [`dirs::config_dir`](https://docs.rs/dirs/*/dirs/fn.config_dir.html) /// - `$HOME/.tree-sitter/config.json` as a fallback from where tree-sitter _used_ to store /// its configuration - pub fn load(path: Option) -> ConfigResult { + pub fn load(path: Option) -> Result { let location = if let Some(path) = path { path } else if let Some(path) = Self::find_config_file()? { @@ -140,9 +76,9 @@ impl Config { }; let content = fs::read_to_string(&location) - .map_err(|e| ConfigError::IO(IoError::new(e, Some(location.as_path()))))?; + .with_context(|| format!("Failed to read {}", &location.to_string_lossy()))?; let config = serde_json::from_str(&content) - .map_err(|e| ConfigError::ConfigRead(location.to_string_lossy().to_string(), e))?; + .with_context(|| format!("Bad JSON config {}", &location.to_string_lossy()))?; Ok(Self { location, config }) } @@ -152,7 +88,7 @@ impl Config { /// disk. /// /// (Note that this is typically only done by the `tree-sitter init-config` command.) - pub fn initial() -> ConfigResult { + pub fn initial() -> Result { let location = if let Ok(path) = env::var("TREE_SITTER_DIR") { let mut path = PathBuf::from(path); path.push("config.json"); @@ -165,20 +101,17 @@ impl Config { } /// Saves this configuration to the file that it was originally loaded from. - pub fn save(&self) -> ConfigResult<()> { + pub fn save(&self) -> Result<()> { let json = serde_json::to_string_pretty(&self.config)?; - let config_dir = self.location.parent().unwrap(); - fs::create_dir_all(config_dir) - .map_err(|e| ConfigError::IO(IoError::new(e, Some(config_dir))))?; - fs::write(&self.location, json) - .map_err(|e| ConfigError::IO(IoError::new(e, Some(self.location.as_path()))))?; + fs::create_dir_all(self.location.parent().unwrap())?; + fs::write(&self.location, json)?; Ok(()) } /// Parses a component-specific configuration from the configuration file. The type `C` must /// be [deserializable](https://docs.rs/serde/*/serde/trait.Deserialize.html) from a JSON /// object, and must only include the fields relevant to that component. - pub fn get(&self) -> ConfigResult + pub fn get(&self) -> Result where C: for<'de> Deserialize<'de>, { @@ -189,7 +122,7 @@ impl Config { /// Adds a component-specific configuration to the configuration file. The type `C` must be /// [serializable](https://docs.rs/serde/*/serde/trait.Serialize.html) into a JSON object, and /// must only include the fields relevant to that component. - pub fn add(&mut self, config: C) -> ConfigResult<()> + pub fn add(&mut self, config: C) -> Result<()> where C: Serialize, { diff --git a/crates/cli/eslint/index.js b/cli/eslint/index.js similarity index 100% rename from crates/cli/eslint/index.js rename to cli/eslint/index.js diff --git a/crates/cli/eslint/package-lock.json b/cli/eslint/package-lock.json similarity index 98% rename from crates/cli/eslint/package-lock.json rename to cli/eslint/package-lock.json index 60559b10..54e22017 100644 --- a/crates/cli/eslint/package-lock.json +++ b/cli/eslint/package-lock.json @@ -1,12 +1,12 @@ { "name": "eslint-config-treesitter", - "version": "1.0.2", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "eslint-config-treesitter", - "version": "1.0.2", + "version": "1.0.0", "license": "MIT", "dependencies": { "eslint-plugin-jsdoc": "^50.2.4" @@ -128,9 +128,10 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "license": "Apache-2.0", "peer": true, "dependencies": { "levn": "^0.4.1" @@ -305,9 +306,9 @@ "peer": true }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "peer": true, "dependencies": { @@ -379,9 +380,10 @@ "peer": true }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "peer": true, "dependencies": { "path-key": "^3.1.0", @@ -805,9 +807,9 @@ "peer": true }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "peer": true, "dependencies": { diff --git a/crates/cli/eslint/package.json b/cli/eslint/package.json similarity index 71% rename from crates/cli/eslint/package.json rename to cli/eslint/package.json index a3ef0c10..d53bf3a4 100644 --- a/crates/cli/eslint/package.json +++ b/cli/eslint/package.json @@ -4,8 +4,7 @@ "description": "Eslint configuration for Tree-sitter grammar files", "repository": { "type": "git", - "url": "git+https://github.com/tree-sitter/tree-sitter.git", - "directory": "crates/cli/eslint" + "url": "git+https://github.com/tree-sitter/tree-sitter.git" }, "license": "MIT", "author": "Amaan Qureshi ", @@ -21,9 +20,5 @@ }, "peerDependencies": { "eslint": ">= 9" - }, - "scripts": { - "prepack": "cp ../../../LICENSE .", - "postpack": "rm LICENSE" } } diff --git a/crates/loader/Cargo.toml b/cli/loader/Cargo.toml similarity index 61% rename from crates/loader/Cargo.toml rename to cli/loader/Cargo.toml index cecae218..0c4df0af 100644 --- a/crates/loader/Cargo.toml +++ b/cli/loader/Cargo.toml @@ -8,40 +8,30 @@ rust-version.workspace = true readme = "README.md" homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter-loader" license.workspace = true keywords.workspace = true categories.workspace = true -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] - -[lib] -path = "src/loader.rs" - -[lints] -workspace = true - [features] wasm = ["tree-sitter/wasm"] +# TODO: For backward compatibility these must be enabled by default, +# consider removing for the next semver incompatible release default = ["tree-sitter-highlight", "tree-sitter-tags"] [dependencies] +anyhow.workspace = true cc.workspace = true -etcetera.workspace = true +dirs.workspace = true fs4.workspace = true indoc.workspace = true libloading.workspace = true -log.workspace = true once_cell.workspace = true +path-slash.workspace = true regex.workspace = true -semver.workspace = true serde.workspace = true serde_json.workspace = true tempfile.workspace = true -thiserror.workspace = true -tree-sitter = { workspace = true } -tree-sitter-highlight = { workspace = true, optional = true } -tree-sitter-tags = { workspace = true, optional = true } +tree-sitter = {workspace = true} +tree-sitter-highlight = {workspace = true, optional = true} +tree-sitter-tags = {workspace = true, optional = true} diff --git a/crates/loader/README.md b/cli/loader/README.md similarity index 100% rename from crates/loader/README.md rename to cli/loader/README.md diff --git a/crates/loader/build.rs b/cli/loader/build.rs similarity index 58% rename from crates/loader/build.rs rename to cli/loader/build.rs index 5ffc889a..b01f01bb 100644 --- a/crates/loader/build.rs +++ b/cli/loader/build.rs @@ -7,4 +7,7 @@ fn main() { "cargo:rustc-env=BUILD_HOST={}", std::env::var("HOST").unwrap() ); + + let emscripten_version = std::fs::read_to_string("emscripten-version").unwrap(); + println!("cargo:rustc-env=EMSCRIPTEN_VERSION={emscripten_version}"); } diff --git a/cli/loader/emscripten-version b/cli/loader/emscripten-version new file mode 100644 index 00000000..331ba4bc --- /dev/null +++ b/cli/loader/emscripten-version @@ -0,0 +1 @@ +3.1.64 diff --git a/cli/loader/src/lib.rs b/cli/loader/src/lib.rs new file mode 100644 index 00000000..7f1c6bfd --- /dev/null +++ b/cli/loader/src/lib.rs @@ -0,0 +1,1448 @@ +#![doc = include_str!("../README.md")] + +#[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] +use std::ops::Range; +#[cfg(feature = "tree-sitter-highlight")] +use std::sync::Mutex; +use std::{ + collections::HashMap, + env, + ffi::{OsStr, OsString}, + fs, + io::{BufRead, BufReader}, + mem, + path::{Path, PathBuf}, + process::Command, + time::SystemTime, +}; + +#[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] +use anyhow::Error; +use anyhow::{anyhow, Context, Result}; +use fs4::FileExt; +use indoc::indoc; +use libloading::{Library, Symbol}; +use once_cell::unsync::OnceCell; +use path_slash::PathBufExt as _; +use regex::{Regex, RegexBuilder}; +use serde::{Deserialize, Deserializer, Serialize}; +use tree_sitter::Language; +#[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] +use tree_sitter::QueryError; +#[cfg(feature = "tree-sitter-highlight")] +use tree_sitter::QueryErrorKind; +#[cfg(feature = "tree-sitter-highlight")] +use tree_sitter_highlight::HighlightConfiguration; +#[cfg(feature = "tree-sitter-tags")] +use tree_sitter_tags::{Error as TagsError, TagsConfiguration}; + +pub const EMSCRIPTEN_TAG: &str = concat!("docker.io/emscripten/emsdk:", env!("EMSCRIPTEN_VERSION")); + +#[derive(Default, Deserialize, Serialize)] +pub struct Config { + #[serde(default)] + #[serde( + rename = "parser-directories", + deserialize_with = "deserialize_parser_directories" + )] + pub parser_directories: Vec, +} + +// Replace `~` or `$HOME` with home path string. +// (While paths like "~/.tree-sitter/config.json" can be deserialized, +// they're not valid path for I/O modules.) +fn deserialize_parser_directories<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let paths = Vec::::deserialize(deserializer)?; + let Some(home) = dirs::home_dir() else { + return Ok(paths); + }; + let standardized = paths + .into_iter() + .map(|path| standardize_path(path, &home)) + .collect(); + Ok(standardized) +} + +fn standardize_path(path: PathBuf, home: &Path) -> PathBuf { + if let Ok(p) = path.strip_prefix("~") { + return home.join(p); + } + if let Ok(p) = path.strip_prefix("$HOME") { + return home.join(p); + } + path +} + +impl Config { + #[must_use] + pub fn initial() -> Self { + let home_dir = dirs::home_dir().expect("Cannot determine home directory"); + Self { + parser_directories: vec![ + home_dir.join("github"), + home_dir.join("src"), + home_dir.join("source"), + home_dir.join("projects"), + home_dir.join("dev"), + home_dir.join("git"), + ], + } + } +} + +const BUILD_TARGET: &str = env!("BUILD_TARGET"); +const BUILD_HOST: &str = env!("BUILD_HOST"); + +pub struct LanguageConfiguration<'a> { + pub scope: Option, + pub content_regex: Option, + pub first_line_regex: Option, + pub injection_regex: Option, + pub file_types: Vec, + pub root_path: PathBuf, + pub highlights_filenames: Option>, + pub injections_filenames: Option>, + pub locals_filenames: Option>, + pub tags_filenames: Option>, + pub language_name: String, + language_id: usize, + #[cfg(feature = "tree-sitter-highlight")] + highlight_config: OnceCell>, + #[cfg(feature = "tree-sitter-tags")] + tags_config: OnceCell>, + #[cfg(feature = "tree-sitter-highlight")] + highlight_names: &'a Mutex>, + #[cfg(feature = "tree-sitter-highlight")] + use_all_highlight_names: bool, +} + +pub struct Loader { + pub parser_lib_path: PathBuf, + languages_by_id: Vec<(PathBuf, OnceCell, Option>)>, + language_configurations: Vec>, + language_configuration_ids_by_file_type: HashMap>, + language_configuration_in_current_path: Option, + language_configuration_ids_by_first_line_regex: HashMap>, + #[cfg(feature = "tree-sitter-highlight")] + highlight_names: Box>>, + #[cfg(feature = "tree-sitter-highlight")] + use_all_highlight_names: bool, + debug_build: bool, + sanitize_build: bool, + force_rebuild: bool, + + #[cfg(feature = "wasm")] + wasm_store: Mutex>, +} + +pub struct CompileConfig<'a> { + pub src_path: &'a Path, + pub header_paths: Vec<&'a Path>, + pub parser_path: PathBuf, + pub scanner_path: Option, + pub external_files: Option<&'a [PathBuf]>, + pub output_path: Option, + pub flags: &'a [&'a str], + pub sanitize: bool, + pub name: String, +} + +impl<'a> CompileConfig<'a> { + #[must_use] + pub fn new( + src_path: &'a Path, + externals: Option<&'a [PathBuf]>, + output_path: Option, + ) -> Self { + Self { + src_path, + header_paths: vec![src_path], + parser_path: src_path.join("parser.c"), + scanner_path: None, + external_files: externals, + output_path, + flags: &[], + sanitize: false, + name: String::new(), + } + } +} + +unsafe impl Send for Loader {} +unsafe impl Sync for Loader {} + +impl Loader { + pub fn new() -> Result { + let parser_lib_path = match env::var("TREE_SITTER_LIBDIR") { + Ok(path) => PathBuf::from(path), + _ => dirs::cache_dir() + .ok_or_else(|| anyhow!("Cannot determine cache directory"))? + .join("tree-sitter") + .join("lib"), + }; + Ok(Self::with_parser_lib_path(parser_lib_path)) + } + + #[must_use] + pub fn with_parser_lib_path(parser_lib_path: PathBuf) -> Self { + Self { + parser_lib_path, + languages_by_id: Vec::new(), + language_configurations: Vec::new(), + language_configuration_ids_by_file_type: HashMap::new(), + language_configuration_in_current_path: None, + language_configuration_ids_by_first_line_regex: HashMap::new(), + #[cfg(feature = "tree-sitter-highlight")] + highlight_names: Box::new(Mutex::new(Vec::new())), + #[cfg(feature = "tree-sitter-highlight")] + use_all_highlight_names: true, + debug_build: false, + sanitize_build: false, + force_rebuild: false, + + #[cfg(feature = "wasm")] + wasm_store: Mutex::default(), + } + } + + #[cfg(feature = "tree-sitter-highlight")] + pub fn configure_highlights(&mut self, names: &[String]) { + self.use_all_highlight_names = false; + let mut highlights = self.highlight_names.lock().unwrap(); + highlights.clear(); + highlights.extend(names.iter().cloned()); + } + + #[must_use] + #[cfg(feature = "tree-sitter-highlight")] + pub fn highlight_names(&self) -> Vec { + self.highlight_names.lock().unwrap().clone() + } + + pub fn find_all_languages(&mut self, config: &Config) -> Result<()> { + if config.parser_directories.is_empty() { + eprintln!("Warning: You have not configured any parser directories!"); + eprintln!("Please run `tree-sitter init-config` and edit the resulting"); + eprintln!("configuration file to indicate where we should look for"); + eprintln!("language grammars.\n"); + } + for parser_container_dir in &config.parser_directories { + if let Ok(entries) = fs::read_dir(parser_container_dir) { + for entry in entries { + let entry = entry?; + if let Some(parser_dir_name) = entry.file_name().to_str() { + if parser_dir_name.starts_with("tree-sitter-") { + self.find_language_configurations_at_path( + &parser_container_dir.join(parser_dir_name), + false, + ) + .ok(); + } + } + } + } + } + Ok(()) + } + + pub fn languages_at_path(&mut self, path: &Path) -> Result> { + if let Ok(configurations) = self.find_language_configurations_at_path(path, true) { + let mut language_ids = configurations + .iter() + .map(|c| (c.language_id, c.language_name.clone())) + .collect::>(); + language_ids.sort_unstable(); + language_ids.dedup(); + language_ids + .into_iter() + .map(|(id, name)| Ok((self.language_for_id(id)?, name))) + .collect::>>() + } else { + Ok(Vec::new()) + } + } + + #[must_use] + pub fn get_all_language_configurations(&self) -> Vec<(&LanguageConfiguration, &Path)> { + self.language_configurations + .iter() + .map(|c| (c, self.languages_by_id[c.language_id].0.as_ref())) + .collect() + } + + pub fn language_configuration_for_scope( + &self, + scope: &str, + ) -> Result> { + for configuration in &self.language_configurations { + if configuration.scope.as_ref().map_or(false, |s| s == scope) { + let language = self.language_for_id(configuration.language_id)?; + return Ok(Some((language, configuration))); + } + } + Ok(None) + } + + pub fn language_configuration_for_first_line_regex( + &self, + path: &Path, + ) -> Result> { + self.language_configuration_ids_by_first_line_regex + .iter() + .try_fold(None, |_, (regex, ids)| { + if let Some(regex) = Self::regex(Some(regex)) { + let file = fs::File::open(path)?; + let reader = BufReader::new(file); + let first_line = reader.lines().next().transpose()?; + if let Some(first_line) = first_line { + if regex.is_match(&first_line) && !ids.is_empty() { + let configuration = &self.language_configurations[ids[0]]; + let language = self.language_for_id(configuration.language_id)?; + return Ok(Some((language, configuration))); + } + } + } + + Ok(None) + }) + } + + pub fn language_configuration_for_file_name( + &self, + path: &Path, + ) -> Result> { + // Find all the language configurations that match this file name + // or a suffix of the file name. + let configuration_ids = path + .file_name() + .and_then(|n| n.to_str()) + .and_then(|file_name| self.language_configuration_ids_by_file_type.get(file_name)) + .or_else(|| { + path.extension() + .and_then(|extension| extension.to_str()) + .and_then(|extension| { + self.language_configuration_ids_by_file_type.get(extension) + }) + }); + + if let Some(configuration_ids) = configuration_ids { + if !configuration_ids.is_empty() { + let configuration = if configuration_ids.len() == 1 { + &self.language_configurations[configuration_ids[0]] + } + // If multiple language configurations match, then determine which + // one to use by applying the configurations' content regexes. + else { + let file_contents = + fs::read(path).with_context(|| format!("Failed to read path {path:?}"))?; + let file_contents = String::from_utf8_lossy(&file_contents); + let mut best_score = -2isize; + let mut best_configuration_id = None; + for configuration_id in configuration_ids { + let config = &self.language_configurations[*configuration_id]; + + // If the language configuration has a content regex, assign + // a score based on the length of the first match. + let score; + if let Some(content_regex) = &config.content_regex { + if let Some(mat) = content_regex.find(&file_contents) { + score = (mat.end() - mat.start()) as isize; + } + // If the content regex does not match, then *penalize* this + // language configuration, so that language configurations + // without content regexes are preferred over those with + // non-matching content regexes. + else { + score = -1; + } + } else { + score = 0; + } + if score > best_score { + best_configuration_id = Some(*configuration_id); + best_score = score; + } + } + + &self.language_configurations[best_configuration_id.unwrap()] + }; + + let language = self.language_for_id(configuration.language_id)?; + return Ok(Some((language, configuration))); + } + } + + Ok(None) + } + + pub fn language_configuration_for_injection_string( + &self, + string: &str, + ) -> Result> { + let mut best_match_length = 0; + let mut best_match_position = None; + for (i, configuration) in self.language_configurations.iter().enumerate() { + if let Some(injection_regex) = &configuration.injection_regex { + if let Some(mat) = injection_regex.find(string) { + let length = mat.end() - mat.start(); + if length > best_match_length { + best_match_position = Some(i); + best_match_length = length; + } + } + } + } + + if let Some(i) = best_match_position { + let configuration = &self.language_configurations[i]; + let language = self.language_for_id(configuration.language_id)?; + Ok(Some((language, configuration))) + } else { + Ok(None) + } + } + + fn language_for_id(&self, id: usize) -> Result { + let (path, language, externals) = &self.languages_by_id[id]; + language + .get_or_try_init(|| { + let src_path = path.join("src"); + self.load_language_at_path(CompileConfig::new( + &src_path, + externals.as_deref(), + None, + )) + }) + .cloned() + } + + pub fn compile_parser_at_path( + &self, + grammar_path: &Path, + output_path: PathBuf, + flags: &[&str], + ) -> Result<()> { + let src_path = grammar_path.join("src"); + let mut config = CompileConfig::new(&src_path, None, Some(output_path)); + config.flags = flags; + self.load_language_at_path(config).map(|_| ()) + } + + pub fn load_language_at_path(&self, mut config: CompileConfig) -> Result { + let grammar_path = config.src_path.join("grammar.json"); + + #[derive(Deserialize)] + struct GrammarJSON { + name: String, + } + let mut grammar_file = fs::File::open(&grammar_path).with_context(|| { + format!( + "Failed to read grammar.json file at the following path:\n{:?}", + &grammar_path + ) + })?; + let grammar_json: GrammarJSON = serde_json::from_reader(BufReader::new(&mut grammar_file)) + .with_context(|| { + format!( + "Failed to parse grammar.json file at the following path:\n{:?}", + &grammar_path + ) + })?; + + config.name = grammar_json.name; + + self.load_language_at_path_with_name(config) + } + + pub fn load_language_at_path_with_name(&self, mut config: CompileConfig) -> Result { + let mut lib_name = config.name.to_string(); + let language_fn_name = format!( + "tree_sitter_{}", + replace_dashes_with_underscores(&config.name) + ); + if self.debug_build { + lib_name.push_str(".debug._"); + } + + if self.sanitize_build { + lib_name.push_str(".sanitize._"); + config.sanitize = true; + } + + if config.output_path.is_none() { + fs::create_dir_all(&self.parser_lib_path)?; + } + + let mut recompile = self.force_rebuild || config.output_path.is_some(); // if specified, always recompile + + let output_path = config.output_path.unwrap_or_else(|| { + let mut path = self.parser_lib_path.join(lib_name); + path.set_extension(env::consts::DLL_EXTENSION); + #[cfg(feature = "wasm")] + if self.wasm_store.lock().unwrap().is_some() { + path.set_extension("wasm"); + } + path + }); + config.output_path = Some(output_path.clone()); + + let parser_path = config.src_path.join("parser.c"); + config.scanner_path = self.get_scanner_path(config.src_path); + + let mut paths_to_check = vec![parser_path]; + + if let Some(scanner_path) = config.scanner_path.as_ref() { + paths_to_check.push(scanner_path.clone()); + } + + paths_to_check.extend( + config + .external_files + .unwrap_or_default() + .iter() + .map(|p| config.src_path.join(p)), + ); + + if !recompile { + recompile = needs_recompile(&output_path, &paths_to_check) + .with_context(|| "Failed to compare source and binary timestamps")?; + } + + #[cfg(feature = "wasm")] + if let Some(wasm_store) = self.wasm_store.lock().unwrap().as_mut() { + if recompile { + self.compile_parser_to_wasm( + &config.name, + None, + config.src_path, + config + .scanner_path + .as_ref() + .and_then(|p| p.strip_prefix(config.src_path).ok()), + &output_path, + false, + )?; + } + + let wasm_bytes = fs::read(&output_path)?; + return Ok(wasm_store.load_language(&config.name, &wasm_bytes)?); + } + + let lock_path = if env::var("CROSS_RUNNER").is_ok() { + tempfile::tempdir() + .unwrap() + .path() + .join("tree-sitter") + .join("lock") + .join(format!("{}.lock", config.name)) + } else { + dirs::cache_dir() + .ok_or_else(|| anyhow!("Cannot determine cache directory"))? + .join("tree-sitter") + .join("lock") + .join(format!("{}.lock", config.name)) + }; + + if let Ok(lock_file) = fs::OpenOptions::new().write(true).open(&lock_path) { + recompile = false; + if lock_file.try_lock_exclusive().is_err() { + // if we can't acquire the lock, another process is compiling the parser, wait for + // it and don't recompile + lock_file.lock_exclusive()?; + recompile = false; + } else { + // if we can acquire the lock, check if the lock file is older than 30 seconds, a + // run that was interrupted and left the lock file behind should not block + // subsequent runs + let time = lock_file.metadata()?.modified()?.elapsed()?.as_secs(); + if time > 30 { + fs::remove_file(&lock_path)?; + recompile = true; + } + } + } + + if recompile { + fs::create_dir_all(lock_path.parent().unwrap()).with_context(|| { + format!( + "Failed to create directory {:?}", + lock_path.parent().unwrap() + ) + })?; + let lock_file = fs::OpenOptions::new() + .create(true) + .truncate(true) + .write(true) + .open(&lock_path)?; + lock_file.lock_exclusive()?; + + self.compile_parser_to_dylib(&config, &lock_file, &lock_path)?; + + if config.scanner_path.is_some() { + self.check_external_scanner(&config.name, &output_path)?; + } + } + + let library = unsafe { Library::new(&output_path) } + .with_context(|| format!("Error opening dynamic library {output_path:?}"))?; + let language = unsafe { + let language_fn = library + .get:: Language>>(language_fn_name.as_bytes()) + .with_context(|| format!("Failed to load symbol {language_fn_name}"))?; + language_fn() + }; + mem::forget(library); + Ok(language) + } + + fn compile_parser_to_dylib( + &self, + config: &CompileConfig, + lock_file: &fs::File, + lock_path: &Path, + ) -> Result<(), Error> { + let mut cc_config = cc::Build::new(); + cc_config + .cargo_metadata(false) + .cargo_warnings(false) + .target(BUILD_TARGET) + .host(BUILD_HOST) + .debug(self.debug_build) + .file(&config.parser_path) + .includes(&config.header_paths) + .std("c11"); + + if let Some(scanner_path) = config.scanner_path.as_ref() { + cc_config.file(scanner_path); + } + + if self.debug_build { + cc_config.opt_level(0).extra_warnings(true); + } else { + cc_config.opt_level(2).extra_warnings(false); + } + + for flag in config.flags { + cc_config.define(flag, None); + } + + let compiler = cc_config.get_compiler(); + let mut command = Command::new(compiler.path()); + command.args(compiler.args()); + for (key, value) in compiler.env() { + command.env(key, value); + } + + let output_path = config.output_path.as_ref().unwrap(); + + if compiler.is_like_msvc() { + let out = format!("-out:{}", output_path.to_str().unwrap()); + command.arg(if self.debug_build { "-LDd" } else { "-LD" }); + command.arg("-utf-8"); + command.args(cc_config.get_files()); + command.arg("-link").arg(out); + } else { + command.arg("-Werror=implicit-function-declaration"); + if cfg!(any(target_os = "macos", target_os = "ios")) { + command.arg("-dynamiclib"); + // TODO: remove when supported + command.arg("-UTREE_SITTER_REUSE_ALLOCATOR"); + } else { + command.arg("-shared"); + } + command.args(cc_config.get_files()); + command.arg("-o").arg(output_path); + } + + let output = command.output().with_context(|| { + format!("Failed to execute the C compiler with the following command:\n{command:?}") + })?; + + lock_file.unlock()?; + fs::remove_file(lock_path)?; + + if output.status.success() { + Ok(()) + } else { + Err(anyhow!( + "Parser compilation failed.\nStdout: {}\nStderr: {}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + )) + } + } + + #[cfg(unix)] + fn check_external_scanner(&self, name: &str, library_path: &Path) -> Result<()> { + let prefix = if cfg!(any(target_os = "macos", target_os = "ios")) { + "_" + } else { + "" + }; + let mut must_have = vec![ + format!("{prefix}tree_sitter_{name}_external_scanner_create"), + format!("{prefix}tree_sitter_{name}_external_scanner_destroy"), + format!("{prefix}tree_sitter_{name}_external_scanner_serialize"), + format!("{prefix}tree_sitter_{name}_external_scanner_deserialize"), + format!("{prefix}tree_sitter_{name}_external_scanner_scan"), + ]; + + let command = Command::new("nm") + .arg("-W") + .arg("-U") + .arg(library_path) + .output(); + if let Ok(output) = command { + if output.status.success() { + let mut found_non_static = false; + for line in String::from_utf8_lossy(&output.stdout).lines() { + if line.contains(" T ") { + if let Some(function_name) = + line.split_whitespace().collect::>().get(2) + { + if !line.contains("tree_sitter_") { + if !found_non_static { + found_non_static = true; + eprintln!("Warning: Found non-static non-tree-sitter functions in the external scannner"); + } + eprintln!(" `{function_name}`"); + } else { + must_have.retain(|f| f != function_name); + } + } + } + } + if found_non_static { + eprintln!("Consider making these functions static, they can cause conflicts when another tree-sitter project uses the same function name"); + } + + if !must_have.is_empty() { + let missing = must_have + .iter() + .map(|f| format!(" `{f}`")) + .collect::>() + .join("\n"); + + return Err(anyhow!(format!( + indoc! {" + Missing required functions in the external scanner, parsing won't work without these! + + {} + + You can read more about this at https://tree-sitter.github.io/tree-sitter/creating-parsers#external-scanners + "}, + missing, + ))); + } + } + } + + Ok(()) + } + + #[cfg(windows)] + fn check_external_scanner(&self, _name: &str, _library_path: &Path) -> Result<()> { + // TODO: there's no nm command on windows, whoever wants to implement this can and should :) + + // let mut must_have = vec![ + // format!("tree_sitter_{name}_external_scanner_create"), + // format!("tree_sitter_{name}_external_scanner_destroy"), + // format!("tree_sitter_{name}_external_scanner_serialize"), + // format!("tree_sitter_{name}_external_scanner_deserialize"), + // format!("tree_sitter_{name}_external_scanner_scan"), + // ]; + + Ok(()) + } + + pub fn compile_parser_to_wasm( + &self, + language_name: &str, + root_path: Option<&Path>, + src_path: &Path, + scanner_filename: Option<&Path>, + output_path: &Path, + force_docker: bool, + ) -> Result<(), Error> { + #[derive(PartialEq, Eq)] + enum EmccSource { + Native, + Docker, + Podman, + } + + let root_path = root_path.unwrap_or(src_path); + let emcc_name = if cfg!(windows) { "emcc.bat" } else { "emcc" }; + + // Order of preference: emscripten > docker > podman > error + let source = if !force_docker && Command::new(emcc_name).output().is_ok() { + EmccSource::Native + } else if Command::new("docker") + .arg("info") + .output() + .map_or(false, |out| out.status.success()) + { + EmccSource::Docker + } else if Command::new("podman") + .arg("--version") + .output() + .map_or(false, |out| out.status.success()) + { + EmccSource::Podman + } else { + return Err(anyhow!( + "You must have either emcc, docker, or podman on your PATH to run this command" + )); + }; + + let mut command = match source { + EmccSource::Native => { + let mut command = Command::new(emcc_name); + command.current_dir(src_path); + command + } + + EmccSource::Docker | EmccSource::Podman => { + let mut command = match source { + EmccSource::Docker => Command::new("docker"), + EmccSource::Podman => Command::new("podman"), + _ => unreachable!(), + }; + command.args(["run", "--rm"]); + + // The working directory is the directory containing the parser itself + let workdir = if root_path == src_path { + PathBuf::from("/src") + } else { + let mut path = PathBuf::from("/src"); + path.push(src_path.strip_prefix(root_path).unwrap()); + path + }; + command.args(["--workdir", &workdir.to_slash_lossy()]); + + // Mount the root directory as a volume, which is the repo root + let mut volume_string = OsString::from(&root_path); + volume_string.push(":/src:Z"); + command.args([OsStr::new("--volume"), &volume_string]); + + // In case `docker` is an alias to `podman`, ensure that podman + // mounts the current directory as writable by the container + // user which has the same uid as the host user. Setting the + // podman-specific variable is more reliable than attempting to + // detect whether `docker` is an alias for `podman`. + // see https://docs.podman.io/en/latest/markdown/podman-run.1.html#userns-mode + command.env("PODMAN_USERNS", "keep-id"); + + // Get the current user id so that files created in the docker container will have + // the same owner. + #[cfg(unix)] + { + #[link(name = "c")] + extern "C" { + fn getuid() -> u32; + } + // don't need to set user for podman since PODMAN_USERNS=keep-id is already set + if source == EmccSource::Docker { + let user_id = unsafe { getuid() }; + command.args(["--user", &user_id.to_string()]); + } + }; + + // Run `emcc` in a container using the `emscripten-slim` image + command.args([EMSCRIPTEN_TAG, "emcc"]); + command + } + }; + + let output_name = "output.wasm"; + + command.args([ + "-o", + output_name, + "-Os", + "-s", + "WASM=1", + "-s", + "SIDE_MODULE=2", + "-s", + "TOTAL_MEMORY=33554432", + "-s", + "NODEJS_CATCH_EXIT=0", + "-s", + &format!("EXPORTED_FUNCTIONS=[\"_tree_sitter_{language_name}\"]"), + "-fno-exceptions", + "-fvisibility=hidden", + "-I", + ".", + ]); + + if let Some(scanner_filename) = scanner_filename { + command.arg(scanner_filename); + } + + command.arg("parser.c"); + let status = command + .spawn() + .with_context(|| "Failed to run emcc command")? + .wait()?; + if !status.success() { + return Err(anyhow!("emcc command failed")); + } + + fs::rename(src_path.join(output_name), output_path) + .context("failed to rename wasm output file")?; + + Ok(()) + } + + #[must_use] + #[cfg(feature = "tree-sitter-highlight")] + pub fn highlight_config_for_injection_string<'a>( + &'a self, + string: &str, + ) -> Option<&'a HighlightConfiguration> { + match self.language_configuration_for_injection_string(string) { + Err(e) => { + eprintln!("Failed to load language for injection string '{string}': {e}",); + None + } + Ok(None) => None, + Ok(Some((language, configuration))) => { + match configuration.highlight_config(language, None) { + Err(e) => { + eprintln!( + "Failed to load property sheet for injection string '{string}': {e}", + ); + None + } + Ok(None) => None, + Ok(Some(config)) => Some(config), + } + } + } + } + + pub fn find_language_configurations_at_path( + &mut self, + parser_path: &Path, + set_current_path_config: bool, + ) -> Result<&[LanguageConfiguration]> { + #[derive(Deserialize, Clone, Default)] + #[serde(untagged)] + enum PathsJSON { + #[default] + Empty, + Single(String), + Multiple(Vec), + } + + impl PathsJSON { + fn into_vec(self) -> Option> { + match self { + Self::Empty => None, + Self::Single(s) => Some(vec![s]), + Self::Multiple(s) => Some(s), + } + } + } + + #[derive(Deserialize)] + struct LanguageConfigurationJSON { + #[serde(default)] + path: PathBuf, + scope: Option, + #[serde(rename = "file-types")] + file_types: Option>, + #[serde(rename = "content-regex")] + content_regex: Option, + #[serde(rename = "first-line-regex")] + first_line_regex: Option, + #[serde(rename = "injection-regex")] + injection_regex: Option, + #[serde(default)] + highlights: PathsJSON, + #[serde(default)] + injections: PathsJSON, + #[serde(default)] + locals: PathsJSON, + #[serde(default)] + tags: PathsJSON, + #[serde(default, rename = "external-files")] + external_files: PathsJSON, + } + + #[derive(Deserialize)] + struct PackageJSON { + #[serde(default)] + #[serde(rename = "tree-sitter")] + tree_sitter: Vec, + } + + #[derive(Deserialize)] + struct GrammarJSON { + name: String, + } + + let initial_language_configuration_count = self.language_configurations.len(); + + if let Ok(package_json_contents) = fs::read_to_string(parser_path.join("package.json")) { + let package_json = serde_json::from_str::(&package_json_contents); + if let Ok(package_json) = package_json { + let language_count = self.languages_by_id.len(); + for config_json in package_json.tree_sitter { + // Determine the path to the parser directory. This can be specified in + // the package.json, but defaults to the directory containing the package.json. + let language_path = parser_path.join(config_json.path); + + let grammar_path = language_path.join("src").join("grammar.json"); + let mut grammar_file = fs::File::open(grammar_path) + .with_context(|| "Failed to read grammar.json")?; + let grammar_json: GrammarJSON = + serde_json::from_reader(BufReader::new(&mut grammar_file)) + .with_context(|| "Failed to parse grammar.json")?; + + // Determine if a previous language configuration in this package.json file + // already uses the same language. + let mut language_id = None; + for (id, (path, _, _)) in + self.languages_by_id.iter().enumerate().skip(language_count) + { + if language_path == *path { + language_id = Some(id); + } + } + + // If not, add a new language path to the list. + let language_id = if let Some(language_id) = language_id { + language_id + } else { + self.languages_by_id.push(( + language_path, + OnceCell::new(), + config_json.external_files.clone().into_vec().map(|files| { + files.into_iter() + .map(|path| { + let path = parser_path.join(path); + // prevent p being above/outside of parser_path + if path.starts_with(parser_path) { + Ok(path) + } else { + Err(anyhow!("External file path {path:?} is outside of parser directory {parser_path:?}")) + } + }) + .collect::>>() + }).transpose()?, + )); + self.languages_by_id.len() - 1 + }; + + let configuration = LanguageConfiguration { + root_path: parser_path.to_path_buf(), + language_name: grammar_json.name.clone(), + scope: config_json.scope, + language_id, + file_types: config_json.file_types.unwrap_or_default(), + content_regex: Self::regex(config_json.content_regex.as_deref()), + first_line_regex: Self::regex(config_json.first_line_regex.as_deref()), + injection_regex: Self::regex(config_json.injection_regex.as_deref()), + injections_filenames: config_json.injections.into_vec(), + locals_filenames: config_json.locals.into_vec(), + tags_filenames: config_json.tags.into_vec(), + highlights_filenames: config_json.highlights.into_vec(), + #[cfg(feature = "tree-sitter-highlight")] + highlight_config: OnceCell::new(), + #[cfg(feature = "tree-sitter-tags")] + tags_config: OnceCell::new(), + #[cfg(feature = "tree-sitter-highlight")] + highlight_names: &self.highlight_names, + #[cfg(feature = "tree-sitter-highlight")] + use_all_highlight_names: self.use_all_highlight_names, + }; + + for file_type in &configuration.file_types { + self.language_configuration_ids_by_file_type + .entry(file_type.to_string()) + .or_default() + .push(self.language_configurations.len()); + } + if let Some(first_line_regex) = &configuration.first_line_regex { + self.language_configuration_ids_by_first_line_regex + .entry(first_line_regex.to_string()) + .or_default() + .push(self.language_configurations.len()); + } + + self.language_configurations.push(unsafe { + mem::transmute::, LanguageConfiguration<'static>>( + configuration, + ) + }); + + if set_current_path_config + && self.language_configuration_in_current_path.is_none() + { + self.language_configuration_in_current_path = + Some(self.language_configurations.len() - 1); + } + } + } + } + + if self.language_configurations.len() == initial_language_configuration_count + && parser_path.join("src").join("grammar.json").exists() + { + let grammar_path = parser_path.join("src").join("grammar.json"); + let mut grammar_file = + fs::File::open(grammar_path).with_context(|| "Failed to read grammar.json")?; + let grammar_json: GrammarJSON = + serde_json::from_reader(BufReader::new(&mut grammar_file)) + .with_context(|| "Failed to parse grammar.json")?; + let configuration = LanguageConfiguration { + root_path: parser_path.to_owned(), + language_name: grammar_json.name, + language_id: self.languages_by_id.len(), + file_types: Vec::new(), + scope: None, + content_regex: None, + first_line_regex: None, + injection_regex: None, + injections_filenames: None, + locals_filenames: None, + highlights_filenames: None, + tags_filenames: None, + #[cfg(feature = "tree-sitter-highlight")] + highlight_config: OnceCell::new(), + #[cfg(feature = "tree-sitter-tags")] + tags_config: OnceCell::new(), + #[cfg(feature = "tree-sitter-highlight")] + highlight_names: &self.highlight_names, + #[cfg(feature = "tree-sitter-highlight")] + use_all_highlight_names: self.use_all_highlight_names, + }; + self.language_configurations.push(unsafe { + mem::transmute::, LanguageConfiguration<'static>>( + configuration, + ) + }); + self.languages_by_id + .push((parser_path.to_owned(), OnceCell::new(), None)); + } + + Ok(&self.language_configurations[initial_language_configuration_count..]) + } + + fn regex(pattern: Option<&str>) -> Option { + pattern.and_then(|r| RegexBuilder::new(r).multi_line(true).build().ok()) + } + + pub fn select_language( + &mut self, + path: &Path, + current_dir: &Path, + scope: Option<&str>, + ) -> Result { + if let Some(scope) = scope { + if let Some(config) = self + .language_configuration_for_scope(scope) + .with_context(|| format!("Failed to load language for scope '{scope}'"))? + { + Ok(config.0) + } else { + Err(anyhow!("Unknown scope '{scope}'")) + } + } else if let Some((lang, _)) = self + .language_configuration_for_file_name(path) + .with_context(|| { + format!( + "Failed to load language for file name {}", + &path.file_name().unwrap().to_string_lossy() + ) + })? + { + Ok(lang) + } else if let Some(id) = self.language_configuration_in_current_path { + Ok(self.language_for_id(self.language_configurations[id].language_id)?) + } else if let Some(lang) = self + .languages_at_path(current_dir) + .with_context(|| "Failed to load language in current directory")? + .first() + .cloned() + { + Ok(lang.0) + } else if let Some(lang) = self.language_configuration_for_first_line_regex(path)? { + Ok(lang.0) + } else { + Err(anyhow!("No language found")) + } + } + + pub fn debug_build(&mut self, flag: bool) { + self.debug_build = flag; + } + + pub fn sanitize_build(&mut self, flag: bool) { + self.sanitize_build = flag; + } + + pub fn force_rebuild(&mut self, rebuild: bool) { + self.force_rebuild = rebuild; + } + + #[cfg(feature = "wasm")] + pub fn use_wasm(&mut self, engine: &tree_sitter::wasmtime::Engine) { + *self.wasm_store.lock().unwrap() = Some(tree_sitter::WasmStore::new(engine).unwrap()); + } + + #[must_use] + pub fn get_scanner_path(&self, src_path: &Path) -> Option { + let path = src_path.join("scanner.c"); + path.exists().then_some(path) + } +} + +impl<'a> LanguageConfiguration<'a> { + #[cfg(feature = "tree-sitter-highlight")] + pub fn highlight_config( + &self, + language: Language, + paths: Option<&[String]>, + ) -> Result> { + let (highlights_filenames, injections_filenames, locals_filenames) = match paths { + Some(paths) => ( + Some( + paths + .iter() + .filter(|p| p.ends_with("tree-sitter-highlights.scm")) + .cloned() + .collect::>(), + ), + Some( + paths + .iter() + .filter(|p| p.ends_with("tree-sitter-tags.scm")) + .cloned() + .collect::>(), + ), + Some( + paths + .iter() + .filter(|p| p.ends_with("locals.scm")) + .cloned() + .collect::>(), + ), + ), + None => (None, None, None), + }; + self.highlight_config + .get_or_try_init(|| { + let (highlights_query, highlight_ranges) = self.read_queries( + if highlights_filenames.is_some() { + highlights_filenames.as_deref() + } else { + self.highlights_filenames.as_deref() + }, + "tree-sitter-highlights.scm", + )?; + let (injections_query, injection_ranges) = self.read_queries( + if injections_filenames.is_some() { + injections_filenames.as_deref() + } else { + self.injections_filenames.as_deref() + }, + "injections.scm", + )?; + let (locals_query, locals_ranges) = self.read_queries( + if locals_filenames.is_some() { + locals_filenames.as_deref() + } else { + self.locals_filenames.as_deref() + }, + "locals.scm", + )?; + + if highlights_query.is_empty() { + Ok(None) + } else { + let mut result = HighlightConfiguration::new( + language, + &self.language_name, + &highlights_query, + &injections_query, + &locals_query, + ) + .map_err(|error| match error.kind { + QueryErrorKind::Language => Error::from(error), + _ => { + if error.offset < injections_query.len() { + Self::include_path_in_query_error( + error, + &injection_ranges, + &injections_query, + 0, + ) + } else if error.offset < injections_query.len() + locals_query.len() { + Self::include_path_in_query_error( + error, + &locals_ranges, + &locals_query, + injections_query.len(), + ) + } else { + Self::include_path_in_query_error( + error, + &highlight_ranges, + &highlights_query, + injections_query.len() + locals_query.len(), + ) + } + } + })?; + let mut all_highlight_names = self.highlight_names.lock().unwrap(); + if self.use_all_highlight_names { + for capture_name in result.query.capture_names() { + if !all_highlight_names.iter().any(|x| x == capture_name) { + all_highlight_names.push((*capture_name).to_string()); + } + } + } + result.configure(all_highlight_names.as_slice()); + drop(all_highlight_names); + Ok(Some(result)) + } + }) + .map(Option::as_ref) + } + + #[cfg(feature = "tree-sitter-tags")] + pub fn tags_config(&self, language: Language) -> Result> { + self.tags_config + .get_or_try_init(|| { + let (tags_query, tags_ranges) = + self.read_queries(self.tags_filenames.as_deref(), "tree-sitter-tags.scm")?; + let (locals_query, locals_ranges) = + self.read_queries(self.locals_filenames.as_deref(), "locals.scm")?; + if tags_query.is_empty() { + Ok(None) + } else { + TagsConfiguration::new(language, &tags_query, &locals_query) + .map(Some) + .map_err(|error| { + if let TagsError::Query(error) = error { + if error.offset < locals_query.len() { + Self::include_path_in_query_error( + error, + &locals_ranges, + &locals_query, + 0, + ) + } else { + Self::include_path_in_query_error( + error, + &tags_ranges, + &tags_query, + locals_query.len(), + ) + } + } else { + error.into() + } + }) + } + }) + .map(Option::as_ref) + } + + #[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] + fn include_path_in_query_error( + mut error: QueryError, + ranges: &[(String, Range)], + source: &str, + start_offset: usize, + ) -> Error { + let offset_within_section = error.offset - start_offset; + let (path, range) = ranges + .iter() + .find(|(_, range)| range.contains(&offset_within_section)) + .unwrap_or_else(|| ranges.last().unwrap()); + error.offset = offset_within_section - range.start; + error.row = source[range.start..offset_within_section] + .matches('\n') + .count(); + Error::from(error).context(format!("Error in query file {path:?}")) + } + + #[allow(clippy::type_complexity)] + #[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] + fn read_queries( + &self, + paths: Option<&[String]>, + default_path: &str, + ) -> Result<(String, Vec<(String, Range)>)> { + let mut query = String::new(); + let mut path_ranges = Vec::new(); + if let Some(paths) = paths { + for path in paths { + let abs_path = self.root_path.join(path); + let prev_query_len = query.len(); + query += &fs::read_to_string(&abs_path) + .with_context(|| format!("Failed to read query file {path:?}"))?; + path_ranges.push((path.clone(), prev_query_len..query.len())); + } + } else { + // highlights.scm is needed to test highlights, and tags.scm to test tags + if default_path == "tree-sitter-highlights.scm" + || default_path == "tree-sitter-tags.scm" + { + eprintln!( + indoc! {" + Warning: you should add a `{}` entry pointing to the highlights path in `tree-sitter` language list in the grammar's package.json + See more here: https://tree-sitter.github.io/tree-sitter/syntax-highlighting#query-paths + "}, + default_path.replace(".scm", "") + ); + } + let queries_path = self.root_path.join("queries"); + let path = queries_path.join(default_path); + if path.exists() { + query = fs::read_to_string(&path) + .with_context(|| format!("Failed to read query file {path:?}"))?; + path_ranges.push((default_path.to_string(), 0..query.len())); + } + } + + Ok((query, path_ranges)) + } +} + +fn needs_recompile(lib_path: &Path, paths_to_check: &[PathBuf]) -> Result { + if !lib_path.exists() { + return Ok(true); + } + let lib_mtime = + mtime(lib_path).with_context(|| format!("Failed to read mtime of {lib_path:?}"))?; + for path in paths_to_check { + if mtime(path)? > lib_mtime { + return Ok(true); + } + } + Ok(false) +} + +fn mtime(path: &Path) -> Result { + Ok(fs::metadata(path)?.modified()?) +} + +fn replace_dashes_with_underscores(name: &str) -> String { + let mut result = String::with_capacity(name.len()); + for c in name.chars() { + if c == '-' { + result.push('_'); + } else { + result.push(c); + } + } + result +} diff --git a/crates/cli/npm/.gitignore b/cli/npm/.gitignore similarity index 100% rename from crates/cli/npm/.gitignore rename to cli/npm/.gitignore diff --git a/crates/cli/npm/cli.js b/cli/npm/cli.js similarity index 100% rename from crates/cli/npm/cli.js rename to cli/npm/cli.js diff --git a/crates/cli/npm/dsl.d.ts b/cli/npm/dsl.d.ts similarity index 90% rename from crates/cli/npm/dsl.d.ts rename to cli/npm/dsl.d.ts index accdb95f..63f9ed49 100644 --- a/crates/cli/npm/dsl.d.ts +++ b/cli/npm/dsl.d.ts @@ -10,7 +10,6 @@ type PrecRightRule = { type: 'PREC_RIGHT'; content: Rule; value: number }; type PrecRule = { type: 'PREC'; content: Rule; value: number }; type Repeat1Rule = { type: 'REPEAT1'; content: Rule }; type RepeatRule = { type: 'REPEAT'; content: Rule }; -type ReservedRule = { type: 'RESERVED'; content: Rule; context_name: string }; type SeqRule = { type: 'SEQ'; members: Rule[] }; type StringRule = { type: 'STRING'; value: string }; type SymbolRule = { type: 'SYMBOL'; name: Name }; @@ -29,19 +28,12 @@ type Rule = | PrecRule | Repeat1Rule | RepeatRule - | ReservedRule | SeqRule | StringRule | SymbolRule | TokenRule; -declare class RustRegex { - value: string; - - constructor(pattern: string); -} - -type RuleOrLiteral = Rule | RegExp | RustRegex | string; +type RuleOrLiteral = Rule | RegExp | string; type GrammarSymbols = { [name in RuleName]: SymbolRule; @@ -50,7 +42,7 @@ type GrammarSymbols = { type RuleBuilder = ( $: GrammarSymbols, - previous?: Rule, + previous: Rule, ) => RuleOrLiteral; type RuleBuilders< @@ -113,7 +105,7 @@ interface Grammar< * @param $ grammar rules * @param previous array of externals from the base schema, if any * - * @see https://tree-sitter.github.io/tree-sitter/creating-parsers/4-external-scanners + * @see https://tree-sitter.github.io/tree-sitter/creating-parsers#external-scanners */ externals?: ( $: Record>, @@ -151,7 +143,7 @@ interface Grammar< * * @param $ grammar rules * - * @see https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types + * @see https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types */ supertypes?: ( $: GrammarSymbols, @@ -164,20 +156,9 @@ interface Grammar< * * @param $ grammar rules * - * @see https://tree-sitter.github.io/tree-sitter/creating-parsers/3-writing-the-grammar#keyword-extraction + * @see https://tree-sitter.github.io/tree-sitter/creating-parsers#keyword-extraction */ word?: ($: GrammarSymbols) => RuleOrLiteral; - - - /** - * Mapping of names to reserved word sets. The first reserved word set is the - * global word set, meaning it applies to every rule in every parse state. - * The other word sets can be used with the `reserved` function. - */ - reserved?: Record< - string, - ($: GrammarSymbols) => RuleOrLiteral[] - >; } type GrammarSchema = { @@ -262,7 +243,7 @@ declare function optional(rule: RuleOrLiteral): ChoiceRule; * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html */ declare const prec: { - (value: string | number, rule: RuleOrLiteral): PrecRule; + (value: String | number, rule: RuleOrLiteral): PrecRule; /** * Marks the given rule as left-associative (and optionally applies a @@ -278,7 +259,7 @@ declare const prec: { * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html */ left(rule: RuleOrLiteral): PrecLeftRule; - left(value: string | number, rule: RuleOrLiteral): PrecLeftRule; + left(value: String | number, rule: RuleOrLiteral): PrecLeftRule; /** * Marks the given rule as right-associative (and optionally applies a @@ -294,7 +275,7 @@ declare const prec: { * @see https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html */ right(rule: RuleOrLiteral): PrecRightRule; - right(value: string | number, rule: RuleOrLiteral): PrecRightRule; + right(value: String | number, rule: RuleOrLiteral): PrecRightRule; /** * Marks the given rule with a numerical precedence which will be used to @@ -311,7 +292,7 @@ declare const prec: { * * @see https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html */ - dynamic(value: string | number, rule: RuleOrLiteral): PrecDynamicRule; + dynamic(value: String | number, rule: RuleOrLiteral): PrecDynamicRule; }; /** @@ -331,15 +312,6 @@ declare function repeat(rule: RuleOrLiteral): RepeatRule; */ declare function repeat1(rule: RuleOrLiteral): Repeat1Rule; -/** - * Overrides the global reserved word set for a given rule. The word set name - * should be defined in the `reserved` field in the grammar. - * - * @param wordset name of the reserved word set - * @param rule rule that will use the reserved word set - */ -declare function reserved(wordset: string, rule: RuleOrLiteral): ReservedRule; - /** * Creates a rule that matches any number of other rules, one after another. * It is analogous to simply writing multiple symbols next to each other @@ -358,7 +330,7 @@ declare function sym(name: Name): SymbolRule; /** * Marks the given rule as producing only a single token. Tree-sitter's - * default is to treat each string or RegExp literal in the grammar as a + * default is to treat each String or RegExp literal in the grammar as a * separate token. Each token is matched separately by the lexer and * returned as its own leaf node in the tree. The token function allows * you to express a complex rule using the DSL functions (rather diff --git a/crates/cli/npm/install.js b/cli/npm/install.js old mode 100644 new mode 100755 similarity index 97% rename from crates/cli/npm/install.js rename to cli/npm/install.js index 6d0fbc57..f2a4944d --- a/crates/cli/npm/install.js +++ b/cli/npm/install.js @@ -6,8 +6,7 @@ const http = require('http'); const https = require('https'); const packageJSON = require('./package.json'); -https.globalAgent.keepAlive = false; - +// Look to a results table in https://github.com/tree-sitter/tree-sitter/issues/2196 const matrix = { platform: { 'darwin': { diff --git a/crates/cli/npm/package.json b/cli/npm/package.json similarity index 51% rename from crates/cli/npm/package.json rename to cli/npm/package.json index d49abd46..bdab77fc 100644 --- a/crates/cli/npm/package.json +++ b/cli/npm/package.json @@ -1,33 +1,24 @@ { "name": "tree-sitter-cli", - "version": "0.27.0", - "author": { - "name": "Max Brunsfeld", - "email": "maxbrunsfeld@gmail.com" - }, - "maintainers": [ - { - "name": "Amaan Qureshi", - "email": "amaanq12@gmail.com" - } - ], + "version": "0.23.0", + "author": "Max Brunsfeld", "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/tree-sitter/tree-sitter.git", - "directory": "crates/cli/npm" + "url": "https://github.com/tree-sitter/tree-sitter.git" }, "description": "CLI for generating fast incremental parsers", "keywords": [ "parser", "lexer" ], + "main": "lib/api/index.js", "engines": { "node": ">=12.0.0" }, "scripts": { "install": "node install.js", - "prepack": "cp ../../../LICENSE ../README.md .", + "prepack": "cp ../../LICENSE ../README.md .", "postpack": "rm LICENSE README.md" }, "bin": { diff --git a/crates/cli/src/fuzz/allocations.rs b/cli/src/fuzz/allocations.rs similarity index 72% rename from crates/cli/src/fuzz/allocations.rs rename to cli/src/fuzz/allocations.rs index ca0c0860..fed446c6 100644 --- a/crates/cli/src/fuzz/allocations.rs +++ b/cli/src/fuzz/allocations.rs @@ -40,11 +40,7 @@ extern "C" { fn free(ptr: *mut c_void); } -pub fn record(f: impl FnOnce() -> T) -> T { - record_checked(f).unwrap() -} - -pub fn record_checked(f: impl FnOnce() -> T) -> Result { +pub fn record(f: impl FnOnce() -> T) -> Result { RECORDER.with(|recorder| { recorder.enabled.store(true, SeqCst); recorder.allocation_count.store(0, SeqCst); @@ -97,49 +93,30 @@ fn record_dealloc(ptr: *mut c_void) { }); } -/// # Safety -/// -/// The caller must ensure that the returned pointer is eventually -/// freed by calling `ts_record_free`. -#[must_use] -pub unsafe extern "C" fn ts_record_malloc(size: usize) -> *mut c_void { +unsafe extern "C" fn ts_record_malloc(size: usize) -> *mut c_void { let result = malloc(size); record_alloc(result); result } -/// # Safety -/// -/// The caller must ensure that the returned pointer is eventually -/// freed by calling `ts_record_free`. -#[must_use] -pub unsafe extern "C" fn ts_record_calloc(count: usize, size: usize) -> *mut c_void { +unsafe extern "C" fn ts_record_calloc(count: usize, size: usize) -> *mut c_void { let result = calloc(count, size); record_alloc(result); result } -/// # Safety -/// -/// The caller must ensure that the returned pointer is eventually -/// freed by calling `ts_record_free`. -#[must_use] -pub unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_void { +unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_void { let result = realloc(ptr, size); if ptr.is_null() { record_alloc(result); - } else if !core::ptr::eq(ptr, result) { + } else if ptr != result { record_dealloc(ptr); record_alloc(result); } result } -/// # Safety -/// -/// The caller must ensure that `ptr` was allocated by a previous call -/// to `ts_record_malloc`, `ts_record_calloc`, or `ts_record_realloc`. -pub unsafe extern "C" fn ts_record_free(ptr: *mut c_void) { +unsafe extern "C" fn ts_record_free(ptr: *mut c_void) { record_dealloc(ptr); free(ptr); } diff --git a/crates/cli/src/fuzz/corpus_test.rs b/cli/src/fuzz/corpus_test.rs similarity index 98% rename from crates/cli/src/fuzz/corpus_test.rs rename to cli/src/fuzz/corpus_test.rs index e95ab283..8807d9a9 100644 --- a/crates/cli/src/fuzz/corpus_test.rs +++ b/cli/src/fuzz/corpus_test.rs @@ -23,7 +23,7 @@ pub fn check_consistent_sizes(tree: &Tree, input: &[u8]) { let mut some_child_has_changes = false; let mut actual_named_child_count = 0; for i in 0..node.child_count() { - let child = node.child(i as u32).unwrap(); + let child = node.child(i).unwrap(); assert!(child.start_byte() >= last_child_end_byte); assert!(child.start_position() >= last_child_end_point); check(child, line_offsets); diff --git a/crates/cli/src/fuzz/edits.rs b/cli/src/fuzz/edits.rs similarity index 100% rename from crates/cli/src/fuzz/edits.rs rename to cli/src/fuzz/edits.rs diff --git a/crates/cli/src/fuzz.rs b/cli/src/fuzz/mod.rs similarity index 77% rename from crates/cli/src/fuzz.rs rename to cli/src/fuzz/mod.rs index 39ad7691..38993e1f 100644 --- a/crates/cli/src/fuzz.rs +++ b/cli/src/fuzz/mod.rs @@ -1,11 +1,6 @@ -use std::{ - collections::HashMap, - env, fs, - path::{Path, PathBuf}, - sync::LazyLock, -}; +use std::{collections::HashMap, env, fs, path::Path}; -use log::{error, info}; +use lazy_static::lazy_static; use rand::Rng; use regex::Regex; use tree_sitter::{Language, Parser}; @@ -25,30 +20,19 @@ use crate::{ random::Rand, }, parse::perform_edit, - test::{parse_tests, strip_sexp_fields, DiffKey, TestDiff, TestEntry}, + test::{parse_tests, print_diff, print_diff_key, strip_sexp_fields, TestEntry}, }; -pub static LOG_ENABLED: LazyLock = LazyLock::new(|| env::var("TREE_SITTER_LOG").is_ok()); - -pub static LOG_GRAPH_ENABLED: LazyLock = - LazyLock::new(|| env::var("TREE_SITTER_LOG_GRAPHS").is_ok()); - -pub static LANGUAGE_FILTER: LazyLock> = - LazyLock::new(|| env::var("TREE_SITTER_LANGUAGE").ok()); - -pub static EXAMPLE_INCLUDE: LazyLock> = - LazyLock::new(|| regex_env_var("TREE_SITTER_EXAMPLE_INCLUDE")); - -pub static EXAMPLE_EXCLUDE: LazyLock> = - LazyLock::new(|| regex_env_var("TREE_SITTER_EXAMPLE_EXCLUDE")); - -pub static START_SEED: LazyLock = LazyLock::new(new_seed); - -pub static EDIT_COUNT: LazyLock = - LazyLock::new(|| int_env_var("TREE_SITTER_EDITS").unwrap_or(3)); - -pub static ITERATION_COUNT: LazyLock = - LazyLock::new(|| int_env_var("TREE_SITTER_ITERATIONS").unwrap_or(10)); +lazy_static! { + pub static ref LOG_ENABLED: bool = env::var("TREE_SITTER_LOG").is_ok(); + pub static ref LOG_GRAPH_ENABLED: bool = env::var("TREE_SITTER_LOG_GRAPHS").is_ok(); + pub static ref LANGUAGE_FILTER: Option = env::var("TREE_SITTER_LANGUAGE").ok(); + pub static ref EXAMPLE_INCLUDE: Option = regex_env_var("TREE_SITTER_EXAMPLE_INCLUDE"); + pub static ref EXAMPLE_EXCLUDE: Option = regex_env_var("TREE_SITTER_EXAMPLE_EXCLUDE"); + pub static ref START_SEED: usize = new_seed(); + pub static ref EDIT_COUNT: usize = int_env_var("TREE_SITTER_EDITS").unwrap_or(3); + pub static ref ITERATION_COUNT: usize = int_env_var("TREE_SITTER_ITERATIONS").unwrap_or(10); +} fn int_env_var(name: &'static str) -> Option { env::var(name).ok().and_then(|e| e.parse().ok()) @@ -62,15 +46,13 @@ fn regex_env_var(name: &'static str) -> Option { pub fn new_seed() -> usize { int_env_var("TREE_SITTER_SEED").unwrap_or_else(|| { let mut rng = rand::thread_rng(); - let seed = rng.gen::(); - info!("Seed: {seed}"); - seed + rng.gen::() }) } pub struct FuzzOptions { pub skipped: Option>, - pub subdir: Option, + pub subdir: Option, pub edits: usize, pub iterations: usize, pub include: Option, @@ -109,12 +91,12 @@ pub fn fuzz_language_corpus( let corpus_dir = grammar_dir.join(subdir).join("test").join("corpus"); if !corpus_dir.exists() || !corpus_dir.is_dir() { - error!("No corpus directory found, ensure that you have a `test/corpus` directory in your grammar directory with at least one test file."); + eprintln!("No corpus directory found, ensure that you have a `test/corpus` directory in your grammar directory with at least one test file."); return; } if std::fs::read_dir(&corpus_dir).unwrap().count() == 0 { - error!("No corpus files found in `test/corpus`, ensure that you have at least one test file in your corpus directory."); + eprintln!("No corpus files found in `test/corpus`, ensure that you have at least one test file in your corpus directory."); return; } @@ -150,7 +132,7 @@ pub fn fuzz_language_corpus( let dump_edits = env::var("TREE_SITTER_DUMP_EDITS").is_ok(); if log_seed { - info!(" start seed: {start_seed}"); + println!(" start seed: {start_seed}"); } println!(); @@ -164,7 +146,7 @@ pub fn fuzz_language_corpus( println!(" {test_index}. {test_name}"); - let passed = allocations::record_checked(|| { + let passed = allocations::record(|| { let mut log_session = None; let mut parser = get_parser(&mut log_session, "log.html"); parser.set_language(language).unwrap(); @@ -183,8 +165,8 @@ pub fn fuzz_language_corpus( if actual_output != test.output { println!("Incorrect initial parse for {test_name}"); - DiffKey::print(); - println!("{}", TestDiff::new(&actual_output, &test.output)); + print_diff_key(); + print_diff(&actual_output, &test.output, true); println!(); return false; } @@ -192,7 +174,7 @@ pub fn fuzz_language_corpus( true }) .unwrap_or_else(|e| { - error!("{e}"); + eprintln!("Error: {e}"); false }); @@ -208,7 +190,7 @@ pub fn fuzz_language_corpus( for trial in 0..options.iterations { let seed = start_seed + trial; - let passed = allocations::record_checked(|| { + let passed = allocations::record(|| { let mut rand = Rand::new(seed); let mut log_session = None; let mut parser = get_parser(&mut log_session, "log.html"); @@ -217,20 +199,19 @@ pub fn fuzz_language_corpus( let mut input = test.input.clone(); if options.log_graphs { - info!("{}\n", String::from_utf8_lossy(&input)); + eprintln!("{}\n", String::from_utf8_lossy(&input)); } // Perform a random series of edits and reparse. - let edit_count = rand.unsigned(*EDIT_COUNT); - let mut undo_stack = Vec::with_capacity(edit_count); - for _ in 0..=edit_count { + let mut undo_stack = Vec::new(); + for _ in 0..=rand.unsigned(*EDIT_COUNT) { let edit = get_random_edit(&mut rand, &input); undo_stack.push(invert_edit(&input, &edit)); perform_edit(&mut tree, &mut input, &edit).unwrap(); } if log_seed { - info!(" {test_index}.{trial:<2} seed: {seed}"); + println!(" {test_index}.{trial:<2} seed: {seed}"); } if dump_edits { @@ -244,7 +225,7 @@ pub fn fuzz_language_corpus( } if options.log_graphs { - info!("{}\n", String::from_utf8_lossy(&input)); + eprintln!("{}\n", String::from_utf8_lossy(&input)); } set_included_ranges(&mut parser, &input, test.template_delimiters); @@ -253,7 +234,7 @@ pub fn fuzz_language_corpus( // Check that the new tree is consistent. check_consistent_sizes(&tree2, &input); if let Err(message) = check_changed_ranges(&tree, &tree2, &input) { - error!("\nUnexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n",); + println!("\nUnexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n",); return false; } @@ -262,7 +243,7 @@ pub fn fuzz_language_corpus( perform_edit(&mut tree2, &mut input, &edit).unwrap(); } if options.log_graphs { - info!("{}\n", String::from_utf8_lossy(&input)); + eprintln!("{}\n", String::from_utf8_lossy(&input)); } set_included_ranges(&mut parser, &test.input, test.template_delimiters); @@ -276,8 +257,8 @@ pub fn fuzz_language_corpus( if actual_output != test.output && !test.error { println!("Incorrect parse for {test_name} - seed {seed}"); - DiffKey::print(); - println!("{}", TestDiff::new(&actual_output, &test.output)); + print_diff_key(); + print_diff(&actual_output, &test.output, true); println!(); return false; } @@ -285,13 +266,13 @@ pub fn fuzz_language_corpus( // Check that the edited tree is consistent. check_consistent_sizes(&tree3, &input); if let Err(message) = check_changed_ranges(&tree2, &tree3, &input) { - error!("Unexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n"); + println!("Unexpected scope change in seed {seed} with start seed {start_seed}\n{message}\n\n"); return false; } true }).unwrap_or_else(|e| { - error!("{e}"); + eprintln!("Error: {e}"); false }); @@ -303,17 +284,17 @@ pub fn fuzz_language_corpus( } if failure_count != 0 { - info!("{failure_count} {language_name} corpus tests failed fuzzing"); + eprintln!("{failure_count} {language_name} corpus tests failed fuzzing"); } skipped.retain(|_, v| *v == 0); if !skipped.is_empty() { - info!("Non matchable skip definitions:"); + println!("Non matchable skip definitions:"); for k in skipped.keys() { - info!(" {k}"); + println!(" {k}"); } - panic!("Non matchable skip definitions need to be removed"); + panic!("Non matchable skip definitions needs to be removed"); } } diff --git a/crates/cli/src/fuzz/random.rs b/cli/src/fuzz/random.rs similarity index 94% rename from crates/cli/src/fuzz/random.rs rename to cli/src/fuzz/random.rs index 7b2ede62..8a8410f4 100644 --- a/crates/cli/src/fuzz/random.rs +++ b/cli/src/fuzz/random.rs @@ -20,8 +20,8 @@ impl Rand { } pub fn words(&mut self, max_count: usize) -> Vec { + let mut result = Vec::new(); let word_count = self.unsigned(max_count); - let mut result = Vec::with_capacity(2 * word_count); for i in 0..word_count { if i > 0 { if self.unsigned(5) == 0 { diff --git a/crates/cli/src/fuzz/scope_sequence.rs b/cli/src/fuzz/scope_sequence.rs similarity index 100% rename from crates/cli/src/fuzz/scope_sequence.rs rename to cli/src/fuzz/scope_sequence.rs diff --git a/crates/generate/src/build_tables/build_lex_table.rs b/cli/src/generate/build_tables/build_lex_table.rs similarity index 97% rename from crates/generate/src/build_tables/build_lex_table.rs rename to cli/src/generate/build_tables/build_lex_table.rs index 9d0d4fb7..215e45b1 100644 --- a/crates/generate/src/build_tables/build_lex_table.rs +++ b/cli/src/generate/build_tables/build_lex_table.rs @@ -3,13 +3,14 @@ use std::{ mem, }; -use log::debug; +use log::info; use super::{coincident_tokens::CoincidentTokenIndex, token_conflicts::TokenConflictMap}; -use crate::{ +use crate::generate::{ dedup::split_state_id_groups, grammars::{LexicalGrammar, SyntaxGrammar}, nfa::{CharacterSet, NfaCursor}, + prepare_grammar::symbol_is_used, rules::{Symbol, TokenSet}, tables::{AdvanceAction, LexState, LexTable, ParseStateId, ParseTable}, }; @@ -43,17 +44,15 @@ pub fn build_lex_table( let tokens = state .terminal_entries .keys() - .copied() - .chain(state.reserved_words.iter()) .filter_map(|token| { if token.is_terminal() { - if keywords.contains(&token) { + if keywords.contains(token) { syntax_grammar.word_token } else { - Some(token) + Some(*token) } } else if token.is_eof() { - Some(token) + Some(*token) } else { None } @@ -95,6 +94,9 @@ pub fn build_lex_table( let mut large_character_sets = Vec::new(); for (variable_ix, _variable) in lexical_grammar.variables.iter().enumerate() { let symbol = Symbol::terminal(variable_ix); + if !symbol_is_used(&syntax_grammar.variables, symbol) { + continue; + } builder.reset(); builder.add_state_for_tokens(&TokenSet::from_iter([symbol])); for state in &builder.table.states { @@ -176,8 +178,9 @@ impl<'a> LexTableBuilder<'a> { let (state_id, is_new) = self.add_state(nfa_states, eof_valid); if is_new { - debug!( - "entry point state: {state_id}, tokens: {:?}", + info!( + "entry point state: {}, tokens: {:?}", + state_id, tokens .iter() .map(|t| &self.lexical_grammar.variables[t.index].name) @@ -358,7 +361,9 @@ fn minimize_lex_table(table: &mut LexTable, parse_table: &mut ParseTable) { &mut group_ids_by_state_id, 1, lex_states_differ, - ) {} + ) { + continue; + } let mut new_states = Vec::with_capacity(state_ids_by_group_id.len()); for state_ids in &state_ids_by_group_id { diff --git a/crates/generate/src/build_tables/build_parse_table.rs b/cli/src/generate/build_tables/build_parse_table.rs similarity index 68% rename from crates/generate/src/build_tables/build_parse_table.rs rename to cli/src/generate/build_tables/build_parse_table.rs index 66f29609..bb6d10bd 100644 --- a/crates/generate/src/build_tables/build_parse_table.rs +++ b/cli/src/generate/build_tables/build_parse_table.rs @@ -1,21 +1,22 @@ use std::{ cmp::Ordering, - collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque}, + collections::{BTreeMap, HashMap, HashSet, VecDeque}, + fmt::Write, hash::BuildHasherDefault, }; +use anyhow::{anyhow, Result}; use indexmap::{map::Entry, IndexMap}; -use log::warn; use rustc_hash::FxHasher; -use serde::Serialize; -use thiserror::Error; use super::{ - item::{ParseItem, ParseItemSet, ParseItemSetCore, ParseItemSetEntry}, + item::{ParseItem, ParseItemSet, ParseItemSetCore}, item_set_builder::ParseItemSetBuilder, }; -use crate::{ - grammars::{LexicalGrammar, PrecedenceEntry, ReservedWordSetId, SyntaxGrammar, VariableType}, +use crate::generate::{ + grammars::{ + InlinedProductionMap, LexicalGrammar, PrecedenceEntry, SyntaxGrammar, VariableType, + }, node_types::VariableInfo, rules::{Associativity, Precedence, Symbol, SymbolType, TokenSet}, tables::{ @@ -65,208 +66,8 @@ struct ParseTableBuilder<'a> { parse_table: ParseTable, } -pub type BuildTableResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ParseTableBuilderError { - #[error("Unresolved conflict for symbol sequence:\n\n{0}")] - Conflict(#[from] ConflictError), - #[error("Extra rules must have unambiguous endings. Conflicting rules: {0}")] - AmbiguousExtra(#[from] AmbiguousExtraError), - #[error( - "The non-terminal rule `{0}` is used in a non-terminal `extra` rule, which is not allowed." - )] - ImproperNonTerminalExtra(String), - #[error("State count `{0}` exceeds the max value {max}.", max=u16::MAX)] - StateCount(usize), -} - -#[derive(Default, Debug, Serialize, Error)] -pub struct ConflictError { - pub symbol_sequence: Vec, - pub conflicting_lookahead: String, - pub possible_interpretations: Vec, - pub possible_resolutions: Vec, -} - -#[derive(Default, Debug, Serialize, Error)] -pub struct Interpretation { - pub preceding_symbols: Vec, - pub variable_name: String, - pub production_step_symbols: Vec, - pub step_index: u32, - pub done: bool, - pub conflicting_lookahead: String, - pub precedence: Option, - pub associativity: Option, -} - -#[derive(Debug, Serialize)] -pub enum Resolution { - Precedence { symbols: Vec }, - Associativity { symbols: Vec }, - AddConflict { symbols: Vec }, -} - -#[derive(Debug, Serialize, Error)] -pub struct AmbiguousExtraError { - pub parent_symbols: Vec, -} - -impl std::fmt::Display for ConflictError { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - for symbol in &self.symbol_sequence { - write!(f, " {symbol}")?; - } - writeln!(f, " • {} …\n", self.conflicting_lookahead)?; - - writeln!(f, "Possible interpretations:\n")?; - let mut interpretations = self - .possible_interpretations - .iter() - .map(|i| { - let line = i.to_string(); - let prec_line = if let (Some(precedence), Some(associativity)) = - (&i.precedence, &i.associativity) - { - Some(format!( - "(precedence: {precedence}, associativity: {associativity})", - )) - } else { - i.precedence - .as_ref() - .map(|precedence| format!("(precedence: {precedence})")) - }; - - (line, prec_line) - }) - .collect::>(); - let max_interpretation_length = interpretations - .iter() - .map(|i| i.0.chars().count()) - .max() - .unwrap(); - interpretations.sort_unstable(); - for (i, (line, prec_suffix)) in interpretations.into_iter().enumerate() { - write!(f, " {}:", i + 1).unwrap(); - write!(f, "{line}")?; - if let Some(prec_suffix) = prec_suffix { - write!( - f, - "{:1$}", - "", - max_interpretation_length.saturating_sub(line.chars().count()) + 2 - )?; - write!(f, "{prec_suffix}")?; - } - writeln!(f)?; - } - - writeln!(f, "\nPossible resolutions:\n")?; - for (i, resolution) in self.possible_resolutions.iter().enumerate() { - writeln!(f, " {}: {resolution}", i + 1)?; - } - Ok(()) - } -} - -impl std::fmt::Display for Interpretation { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - for symbol in &self.preceding_symbols { - write!(f, " {symbol}")?; - } - write!(f, " ({}", self.variable_name)?; - for (i, symbol) in self.production_step_symbols.iter().enumerate() { - if i == self.step_index as usize { - write!(f, " •")?; - } - write!(f, " {symbol}")?; - } - write!(f, ")")?; - if self.done { - write!(f, " • {} …", self.conflicting_lookahead)?; - } - Ok(()) - } -} - -impl std::fmt::Display for Resolution { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - Self::Precedence { symbols } => { - write!(f, "Specify a higher precedence in ")?; - for (i, symbol) in symbols.iter().enumerate() { - if i > 0 { - write!(f, " and ")?; - } - write!(f, "`{symbol}`")?; - } - write!(f, " than in the other rules.")?; - } - Self::Associativity { symbols } => { - write!(f, "Specify a left or right associativity in ")?; - for (i, symbol) in symbols.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "`{symbol}`")?; - } - } - Self::AddConflict { symbols } => { - write!(f, "Add a conflict for these rules: ")?; - for (i, symbol) in symbols.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "`{symbol}`")?; - } - } - } - Ok(()) - } -} - -impl std::fmt::Display for AmbiguousExtraError { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - for (i, symbol) in self.parent_symbols.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{symbol}")?; - } - Ok(()) - } -} - impl<'a> ParseTableBuilder<'a> { - fn new( - syntax_grammar: &'a SyntaxGrammar, - lexical_grammar: &'a LexicalGrammar, - item_set_builder: ParseItemSetBuilder<'a>, - variable_info: &'a [VariableInfo], - ) -> Self { - Self { - syntax_grammar, - lexical_grammar, - item_set_builder, - variable_info, - non_terminal_extra_states: Vec::new(), - state_ids_by_item_set: IndexMap::default(), - core_ids_by_core: HashMap::new(), - parse_state_info_by_id: Vec::new(), - parse_state_queue: VecDeque::new(), - actual_conflicts: syntax_grammar.expected_conflicts.iter().cloned().collect(), - parse_table: ParseTable { - states: Vec::new(), - symbols: Vec::new(), - external_lex_states: Vec::new(), - production_infos: Vec::new(), - max_aliased_production_length: 1, - }, - } - } - - fn build(mut self) -> BuildTableResult<(ParseTable, Vec>)> { + fn build(mut self) -> Result<(ParseTable, Vec>)> { // Ensure that the empty alias sequence has index 0. self.parse_table .production_infos @@ -279,13 +80,10 @@ impl<'a> ParseTableBuilder<'a> { self.add_parse_state( &Vec::new(), &Vec::new(), - ParseItemSet { - entries: vec![ParseItemSetEntry { - item: ParseItem::start(), - lookaheads: std::iter::once(Symbol::end()).collect(), - following_reserved_word_set: ReservedWordSetId::default(), - }], - }, + ParseItemSet::with(std::iter::once(( + ParseItem::start(), + std::iter::once(&Symbol::end()).copied().collect(), + ))), ); // Compute the possible item sets for non-terminal extras. @@ -301,35 +99,25 @@ impl<'a> ParseTableBuilder<'a> { non_terminal_extra_item_sets_by_first_terminal .entry(production.first_symbol().unwrap()) .or_insert_with(ParseItemSet::default) - .insert(ParseItem { - variable_index: extra_non_terminal.index as u32, - production, - step_index: 1, - has_preceding_inherited_fields: false, - }) - .lookaheads - .insert(Symbol::end_of_nonterminal_extra()); + .insert( + ParseItem { + variable_index: extra_non_terminal.index as u32, + production, + step_index: 1, + has_preceding_inherited_fields: false, + }, + &std::iter::once(&Symbol::end_of_nonterminal_extra()) + .copied() + .collect(), + ); } } - let non_terminal_sets_len = non_terminal_extra_item_sets_by_first_terminal.len(); - self.non_terminal_extra_states - .reserve(non_terminal_sets_len); - self.parse_state_info_by_id.reserve(non_terminal_sets_len); - self.parse_table.states.reserve(non_terminal_sets_len); - self.parse_state_queue.reserve(non_terminal_sets_len); // Add a state for each starting terminal of a non-terminal extra rule. for (terminal, item_set) in non_terminal_extra_item_sets_by_first_terminal { - if terminal.is_non_terminal() { - Err(ParseTableBuilderError::ImproperNonTerminalExtra( - self.symbol_name(&terminal), - ))?; - } - - // Add the parse state, and *then* push the terminal and the state id into the - // list of nonterminal extra states - let state_id = self.add_parse_state(&Vec::new(), &Vec::new(), item_set); - self.non_terminal_extra_states.push((terminal, state_id)); + self.non_terminal_extra_states + .push((terminal, self.parse_table.states.len())); + self.add_parse_state(&Vec::new(), &Vec::new(), item_set); } while let Some(entry) = self.parse_state_queue.pop_front() { @@ -346,21 +134,17 @@ impl<'a> ParseTableBuilder<'a> { } if !self.actual_conflicts.is_empty() { - warn!( - "unnecessary conflicts:\n {}", - &self - .actual_conflicts - .iter() - .map(|conflict| { - conflict - .iter() - .map(|symbol| format!("`{}`", self.symbol_name(symbol))) - .collect::>() - .join(", ") - }) - .collect::>() - .join("\n ") - ); + println!("Warning: unnecessary conflicts"); + for conflict in &self.actual_conflicts { + println!( + " {}", + conflict + .iter() + .map(|symbol| format!("`{}`", self.symbol_name(symbol))) + .collect::>() + .join(", ") + ); + } } Ok((self.parse_table, self.parse_state_info_by_id)) @@ -394,7 +178,6 @@ impl<'a> ParseTableBuilder<'a> { external_lex_state_id: 0, terminal_entries: IndexMap::default(), nonterminal_entries: IndexMap::default(), - reserved_words: TokenSet::default(), core_id, }); self.parse_state_queue.push_back(ParseStateQueueEntry { @@ -413,7 +196,7 @@ impl<'a> ParseTableBuilder<'a> { mut preceding_auxiliary_symbols: AuxiliarySymbolSequence, state_id: ParseStateId, item_set: &ParseItemSet<'a>, - ) -> BuildTableResult<()> { + ) -> Result<()> { let mut terminal_successors = BTreeMap::new(); let mut non_terminal_successors = BTreeMap::new(); let mut lookaheads_with_conflicts = TokenSet::new(); @@ -421,18 +204,13 @@ impl<'a> ParseTableBuilder<'a> { // Each item in the item set contributes to either or a Shift action or a Reduce // action in this state. - for ParseItemSetEntry { - item, - lookaheads, - following_reserved_word_set: reserved_lookaheads, - } in &item_set.entries - { + for (item, lookaheads) in &item_set.entries { // If the item is unfinished, then this state has a transition for the item's // next symbol. Advance the item to its next step and insert the resulting // item into the successor item set. if let Some(next_symbol) = item.symbol() { let mut successor = item.successor(); - let successor_set = if next_symbol.is_non_terminal() { + if next_symbol.is_non_terminal() { let variable = &self.syntax_grammar.variables[next_symbol.index]; // Keep track of where auxiliary non-terminals (repeat symbols) are @@ -461,16 +239,13 @@ impl<'a> ParseTableBuilder<'a> { non_terminal_successors .entry(next_symbol) .or_insert_with(ParseItemSet::default) + .insert(successor, lookaheads); } else { terminal_successors .entry(next_symbol) .or_insert_with(ParseItemSet::default) - }; - let successor_entry = successor_set.insert(successor); - successor_entry.lookaheads.insert_all(lookaheads); - successor_entry.following_reserved_word_set = successor_entry - .following_reserved_word_set - .max(*reserved_lookaheads); + .insert(successor, lookaheads); + } } // If the item is finished, then add a Reduce action to this state based // on this item. @@ -597,7 +372,7 @@ impl<'a> ParseTableBuilder<'a> { )?; } - // Add actions for the grammar's `extra` symbols. + // Finally, add actions for the grammar's `extra` symbols. let state = &mut self.parse_table.states[state_id]; let is_end_of_non_terminal_extra = state.is_end_of_non_terminal_extra(); @@ -609,7 +384,7 @@ impl<'a> ParseTableBuilder<'a> { let parent_symbols = item_set .entries .iter() - .filter_map(|ParseItemSetEntry { item, .. }| { + .filter_map(|(item, _)| { if !item.is_augmented() && item.step_index > 0 { Some(item.variable_index) } else { @@ -617,18 +392,15 @@ impl<'a> ParseTableBuilder<'a> { } }) .collect::>(); - let parent_symbol_names = parent_symbols - .iter() - .map(|&variable_index| { - self.syntax_grammar.variables[variable_index as usize] - .name - .clone() - }) - .collect::>(); - - Err(AmbiguousExtraError { - parent_symbols: parent_symbol_names, - })?; + let mut message = + "Extra rules must have unambiguous endings. Conflicting rules: ".to_string(); + for (i, variable_index) in parent_symbols.iter().enumerate() { + if i > 0 { + message += ", "; + } + message += &self.syntax_grammar.variables[*variable_index as usize].name; + } + return Err(anyhow!(message)); } } // Add actions for the start tokens of each non-terminal extra rule. @@ -666,30 +438,6 @@ impl<'a> ParseTableBuilder<'a> { } } - if let Some(keyword_capture_token) = self.syntax_grammar.word_token { - let reserved_word_set_id = item_set - .entries - .iter() - .filter_map(|entry| { - if let Some(next_step) = entry.item.step() { - if next_step.symbol == keyword_capture_token { - Some(next_step.reserved_word_set_id) - } else { - None - } - } else if entry.lookaheads.contains(&keyword_capture_token) { - Some(entry.following_reserved_word_set) - } else { - None - } - }) - .max(); - if let Some(reserved_word_set_id) = reserved_word_set_id { - state.reserved_words = - self.syntax_grammar.reserved_word_sets[reserved_word_set_id.0].clone(); - } - } - Ok(()) } @@ -701,7 +449,7 @@ impl<'a> ParseTableBuilder<'a> { preceding_auxiliary_symbols: &[AuxiliarySymbolInfo], conflicting_lookahead: Symbol, reduction_info: &ReductionInfo, - ) -> BuildTableResult<()> { + ) -> Result<()> { let entry = self.parse_table.states[state_id] .terminal_entries .get_mut(&conflicting_lookahead) @@ -715,11 +463,8 @@ impl<'a> ParseTableBuilder<'a> { // precedence, and there can still be SHIFT/REDUCE conflicts. let mut considered_associativity = false; let mut shift_precedence = Vec::<(&Precedence, Symbol)>::new(); - let mut conflicting_items = BTreeSet::new(); - for ParseItemSetEntry { - item, lookaheads, .. - } in &item_set.entries - { + let mut conflicting_items = HashSet::new(); + for (item, lookaheads) in &item_set.entries { if let Some(step) = item.step() { if item.step_index > 0 && self @@ -856,55 +601,93 @@ impl<'a> ParseTableBuilder<'a> { return Ok(()); } - let mut conflict_error = ConflictError::default(); + let mut msg = "Unresolved conflict for symbol sequence:\n\n".to_string(); for symbol in preceding_symbols { - conflict_error - .symbol_sequence - .push(self.symbol_name(symbol)); + write!(&mut msg, " {}", self.symbol_name(symbol)).unwrap(); } - conflict_error.conflicting_lookahead = self.symbol_name(&conflicting_lookahead); - let interpretations = conflicting_items + writeln!( + &mut msg, + " • {} …\n", + self.symbol_name(&conflicting_lookahead) + ) + .unwrap(); + writeln!(&mut msg, "Possible interpretations:\n").unwrap(); + + let mut interpretations = conflicting_items .iter() .map(|item| { - let preceding_symbols = preceding_symbols + let mut line = String::new(); + for preceding_symbol in preceding_symbols .iter() .take(preceding_symbols.len() - item.step_index as usize) - .map(|symbol| self.symbol_name(symbol)) - .collect::>(); + { + write!(&mut line, " {}", self.symbol_name(preceding_symbol)).unwrap(); + } - let variable_name = self.syntax_grammar.variables[item.variable_index as usize] - .name - .clone(); + write!( + &mut line, + " ({}", + &self.syntax_grammar.variables[item.variable_index as usize].name + ) + .unwrap(); - let production_step_symbols = item - .production - .steps - .iter() - .map(|step| self.symbol_name(&step.symbol)) - .collect::>(); + for (j, step) in item.production.steps.iter().enumerate() { + if j as u32 == item.step_index { + write!(&mut line, " •").unwrap(); + } + write!(&mut line, " {}", self.symbol_name(&step.symbol)).unwrap(); + } - let precedence = match item.precedence() { - Precedence::None => None, - _ => Some(item.precedence().to_string()), + write!(&mut line, ")").unwrap(); + + if item.is_done() { + write!( + &mut line, + " • {} …", + self.symbol_name(&conflicting_lookahead) + ) + .unwrap(); + } + + let precedence = item.precedence(); + let associativity = item.associativity(); + + let prec_line = if let Some(associativity) = associativity { + Some(format!( + "(precedence: {precedence}, associativity: {associativity:?})", + )) + } else if !precedence.is_none() { + Some(format!("(precedence: {precedence})")) + } else { + None }; - let associativity = item.associativity().map(|assoc| format!("{assoc:?}")); - - Interpretation { - preceding_symbols, - variable_name, - production_step_symbols, - step_index: item.step_index, - done: item.is_done(), - conflicting_lookahead: self.symbol_name(&conflicting_lookahead), - precedence, - associativity, - } + (line, prec_line) }) .collect::>(); - conflict_error.possible_interpretations = interpretations; + let max_interpretation_length = interpretations + .iter() + .map(|i| i.0.chars().count()) + .max() + .unwrap(); + interpretations.sort_unstable(); + for (i, (line, prec_suffix)) in interpretations.into_iter().enumerate() { + write!(&mut msg, " {}:", i + 1).unwrap(); + msg += &line; + if let Some(prec_suffix) = prec_suffix { + for _ in line.chars().count()..max_interpretation_length { + msg.push(' '); + } + msg += " "; + msg += &prec_suffix; + } + msg.push('\n'); + } + + let mut resolution_count = 0; + writeln!(&mut msg, "\nPossible resolutions:\n").unwrap(); let mut shift_items = Vec::new(); let mut reduce_items = Vec::new(); for item in conflicting_items { @@ -917,57 +700,76 @@ impl<'a> ParseTableBuilder<'a> { shift_items.sort_unstable(); reduce_items.sort_unstable(); - let get_rule_names = |items: &[&ParseItem]| -> Vec { + let list_rule_names = |mut msg: &mut String, items: &[&ParseItem]| { let mut last_rule_id = None; - let mut result = Vec::with_capacity(items.len()); for item in items { if last_rule_id == Some(item.variable_index) { continue; } - last_rule_id = Some(item.variable_index); - result.push(self.symbol_name(&Symbol::non_terminal(item.variable_index as usize))); - } - result + if last_rule_id.is_some() { + write!(&mut msg, " and").unwrap(); + } + + last_rule_id = Some(item.variable_index); + write!( + msg, + " `{}`", + self.symbol_name(&Symbol::non_terminal(item.variable_index as usize)) + ) + .unwrap(); + } }; if actual_conflict.len() > 1 { if !shift_items.is_empty() { - let names = get_rule_names(&shift_items); - conflict_error - .possible_resolutions - .push(Resolution::Precedence { symbols: names }); + resolution_count += 1; + write!( + &mut msg, + " {resolution_count}: Specify a higher precedence in", + ) + .unwrap(); + list_rule_names(&mut msg, &shift_items); + writeln!(&mut msg, " than in the other rules.").unwrap(); } for item in &reduce_items { - let name = self.symbol_name(&Symbol::non_terminal(item.variable_index as usize)); - conflict_error - .possible_resolutions - .push(Resolution::Precedence { - symbols: vec![name], - }); + resolution_count += 1; + writeln!( + &mut msg, + " {resolution_count}: Specify a higher precedence in `{}` than in the other rules.", + self.symbol_name(&Symbol::non_terminal(item.variable_index as usize)) + ) + .unwrap(); } } if considered_associativity { - let names = get_rule_names(&reduce_items); - conflict_error - .possible_resolutions - .push(Resolution::Associativity { symbols: names }); + resolution_count += 1; + write!( + &mut msg, + " {resolution_count}: Specify a left or right associativity in", + ) + .unwrap(); + list_rule_names(&mut msg, &reduce_items); + writeln!(&mut msg).unwrap(); } - conflict_error - .possible_resolutions - .push(Resolution::AddConflict { - symbols: actual_conflict - .iter() - .map(|s| self.symbol_name(s)) - .collect(), - }); + resolution_count += 1; + write!( + &mut msg, + " {resolution_count}: Add a conflict for these rules: ", + ) + .unwrap(); + for (i, symbol) in actual_conflict.iter().enumerate() { + if i > 0 { + write!(&mut msg, ", ").unwrap(); + } + write!(&mut msg, "`{}`", self.symbol_name(symbol)).unwrap(); + } + writeln!(&mut msg).unwrap(); - self.actual_conflicts.insert(actual_conflict); - - Err(conflict_error)? + Err(anyhow!(msg)) } fn compare_precedence( @@ -1036,7 +838,7 @@ impl<'a> ParseTableBuilder<'a> { let parent_symbols = item_set .entries .iter() - .filter_map(|ParseItemSetEntry { item, .. }| { + .filter_map(|(item, _)| { let variable_index = item.variable_index as usize; if item.symbol() == Some(symbol) && !self.syntax_grammar.variables[variable_index].is_auxiliary() @@ -1124,24 +926,84 @@ impl<'a> ParseTableBuilder<'a> { if variable.kind == VariableType::Named { variable.name.clone() } else { - format!("'{}'", variable.name) + format!("'{}'", &variable.name) } } } } } +fn populate_following_tokens( + result: &mut [TokenSet], + grammar: &SyntaxGrammar, + inlines: &InlinedProductionMap, + builder: &ParseItemSetBuilder, +) { + let productions = grammar + .variables + .iter() + .flat_map(|v| &v.productions) + .chain(&inlines.productions); + let all_tokens = (0..result.len()) + .map(Symbol::terminal) + .collect::(); + for production in productions { + for i in 1..production.steps.len() { + let left_tokens = builder.last_set(&production.steps[i - 1].symbol); + let right_tokens = builder.first_set(&production.steps[i].symbol); + for left_token in left_tokens.iter() { + if left_token.is_terminal() { + result[left_token.index].insert_all_terminals(right_tokens); + } + } + } + } + for extra in &grammar.extra_symbols { + if extra.is_terminal() { + for entry in result.iter_mut() { + entry.insert(*extra); + } + result[extra.index].clone_from(&all_tokens); + } + } +} + pub fn build_parse_table<'a>( syntax_grammar: &'a SyntaxGrammar, lexical_grammar: &'a LexicalGrammar, - item_set_builder: ParseItemSetBuilder<'a>, + inlines: &'a InlinedProductionMap, variable_info: &'a [VariableInfo], -) -> BuildTableResult<(ParseTable, Vec>)> { - ParseTableBuilder::new( +) -> Result<(ParseTable, Vec, Vec>)> { + let actual_conflicts = syntax_grammar.expected_conflicts.iter().cloned().collect(); + let item_set_builder = ParseItemSetBuilder::new(syntax_grammar, lexical_grammar, inlines); + let mut following_tokens = vec![TokenSet::new(); lexical_grammar.variables.len()]; + populate_following_tokens( + &mut following_tokens, + syntax_grammar, + inlines, + &item_set_builder, + ); + + let (table, item_sets) = ParseTableBuilder { syntax_grammar, lexical_grammar, item_set_builder, variable_info, - ) - .build() + non_terminal_extra_states: Vec::new(), + actual_conflicts, + state_ids_by_item_set: IndexMap::default(), + core_ids_by_core: HashMap::new(), + parse_state_info_by_id: Vec::new(), + parse_state_queue: VecDeque::new(), + parse_table: ParseTable { + states: Vec::new(), + symbols: Vec::new(), + external_lex_states: Vec::new(), + production_infos: Vec::new(), + max_aliased_production_length: 1, + }, + } + .build()?; + + Ok((table, following_tokens, item_sets)) } diff --git a/crates/generate/src/build_tables/coincident_tokens.rs b/cli/src/generate/build_tables/coincident_tokens.rs similarity index 96% rename from crates/generate/src/build_tables/coincident_tokens.rs rename to cli/src/generate/build_tables/coincident_tokens.rs index d1e40741..9341145d 100644 --- a/crates/generate/src/build_tables/coincident_tokens.rs +++ b/cli/src/generate/build_tables/coincident_tokens.rs @@ -1,6 +1,6 @@ use std::fmt; -use crate::{ +use crate::generate::{ grammars::LexicalGrammar, rules::Symbol, tables::{ParseStateId, ParseTable}, @@ -55,7 +55,7 @@ impl<'a> CoincidentTokenIndex<'a> { } } -impl fmt::Debug for CoincidentTokenIndex<'_> { +impl<'a> fmt::Debug for CoincidentTokenIndex<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { writeln!(f, "CoincidentTokenIndex {{")?; diff --git a/crates/generate/src/build_tables/item.rs b/cli/src/generate/build_tables/item.rs similarity index 72% rename from crates/generate/src/build_tables/item.rs rename to cli/src/generate/build_tables/item.rs index cd70ce74..cfc72540 100644 --- a/crates/generate/src/build_tables/item.rs +++ b/cli/src/generate/build_tables/item.rs @@ -2,31 +2,30 @@ use std::{ cmp::Ordering, fmt, hash::{Hash, Hasher}, - sync::LazyLock, }; -use crate::{ - grammars::{ - LexicalGrammar, Production, ProductionStep, ReservedWordSetId, SyntaxGrammar, - NO_RESERVED_WORDS, - }, +use lazy_static::lazy_static; + +use crate::generate::{ + grammars::{LexicalGrammar, Production, ProductionStep, SyntaxGrammar}, rules::{Associativity, Precedence, Symbol, SymbolType, TokenSet}, }; -static START_PRODUCTION: LazyLock = LazyLock::new(|| Production { - dynamic_precedence: 0, - steps: vec![ProductionStep { - symbol: Symbol { - index: 0, - kind: SymbolType::NonTerminal, - }, - precedence: Precedence::None, - associativity: None, - alias: None, - field_name: None, - reserved_word_set_id: NO_RESERVED_WORDS, - }], -}); +lazy_static! { + static ref START_PRODUCTION: Production = Production { + dynamic_precedence: 0, + steps: vec![ProductionStep { + symbol: Symbol { + index: 0, + kind: SymbolType::NonTerminal, + }, + precedence: Precedence::None, + associativity: None, + alias: None, + field_name: None, + }], + }; +} /// A [`ParseItem`] represents an in-progress match of a single production in a grammar. #[derive(Clone, Copy, Debug)] @@ -59,14 +58,7 @@ pub struct ParseItem<'a> { /// to a state in the final parse table. #[derive(Clone, Debug, PartialEq, Eq, Default)] pub struct ParseItemSet<'a> { - pub entries: Vec>, -} - -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct ParseItemSetEntry<'a> { - pub item: ParseItem<'a>, - pub lookaheads: TokenSet, - pub following_reserved_word_set: ReservedWordSetId, + pub entries: Vec<(ParseItem<'a>, TokenSet)>, } /// A [`ParseItemSetCore`] is like a [`ParseItemSet`], but without the lookahead @@ -160,31 +152,35 @@ impl<'a> ParseItem<'a> { } impl<'a> ParseItemSet<'a> { - pub fn insert(&mut self, item: ParseItem<'a>) -> &mut ParseItemSetEntry<'a> { - match self.entries.binary_search_by(|e| e.item.cmp(&item)) { + pub fn with(elements: impl IntoIterator, TokenSet)>) -> Self { + let mut result = Self::default(); + for (item, lookaheads) in elements { + result.insert(item, &lookaheads); + } + result + } + + pub fn insert(&mut self, item: ParseItem<'a>, lookaheads: &TokenSet) -> &mut TokenSet { + match self.entries.binary_search_by(|(i, _)| i.cmp(&item)) { Err(i) => { - self.entries.insert( - i, - ParseItemSetEntry { - item, - lookaheads: TokenSet::new(), - following_reserved_word_set: ReservedWordSetId::default(), - }, - ); - &mut self.entries[i] + self.entries.insert(i, (item, lookaheads.clone())); + &mut self.entries[i].1 + } + Ok(i) => { + self.entries[i].1.insert_all(lookaheads); + &mut self.entries[i].1 } - Ok(i) => &mut self.entries[i], } } pub fn core(&self) -> ParseItemSetCore<'a> { ParseItemSetCore { - entries: self.entries.iter().map(|e| e.item).collect(), + entries: self.entries.iter().map(|e| e.0).collect(), } } } -impl fmt::Display for ParseItemDisplay<'_> { +impl<'a> fmt::Display for ParseItemDisplay<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { if self.0.is_augmented() { write!(f, "START →")?; @@ -192,42 +188,35 @@ impl fmt::Display for ParseItemDisplay<'_> { write!( f, "{} →", - self.1.variables[self.0.variable_index as usize].name + &self.1.variables[self.0.variable_index as usize].name )?; } for (i, step) in self.0.production.steps.iter().enumerate() { if i == self.0.step_index as usize { write!(f, " •")?; - if !step.precedence.is_none() - || step.associativity.is_some() - || step.reserved_word_set_id != ReservedWordSetId::default() - { - write!(f, " (")?; - if !step.precedence.is_none() { - write!(f, " {}", step.precedence)?; + if let Some(associativity) = step.associativity { + if step.precedence.is_none() { + write!(f, " ({associativity:?})")?; + } else { + write!(f, " ({} {associativity:?})", step.precedence)?; } - if let Some(associativity) = step.associativity { - write!(f, " {associativity:?}")?; - } - if step.reserved_word_set_id != ReservedWordSetId::default() { - write!(f, "reserved: {}", step.reserved_word_set_id)?; - } - write!(f, " )")?; + } else if !step.precedence.is_none() { + write!(f, " ({})", step.precedence)?; } } write!(f, " ")?; if step.symbol.is_terminal() { if let Some(variable) = self.2.variables.get(step.symbol.index) { - write!(f, "{}", variable.name)?; + write!(f, "{}", &variable.name)?; } else { write!(f, "terminal-{}", step.symbol.index)?; } } else if step.symbol.is_external() { - write!(f, "{}", self.1.external_tokens[step.symbol.index].name)?; + write!(f, "{}", &self.1.external_tokens[step.symbol.index].name)?; } else { - write!(f, "{}", self.1.variables[step.symbol.index].name)?; + write!(f, "{}", &self.1.variables[step.symbol.index].name)?; } if let Some(alias) = &step.alias { @@ -254,33 +243,7 @@ impl fmt::Display for ParseItemDisplay<'_> { } } -const fn escape_invisible(c: char) -> Option<&'static str> { - Some(match c { - '\n' => "\\n", - '\r' => "\\r", - '\t' => "\\t", - '\0' => "\\0", - '\\' => "\\\\", - '\x0b' => "\\v", - '\x0c' => "\\f", - _ => return None, - }) -} - -fn display_variable_name(source: &str) -> String { - source - .chars() - .fold(String::with_capacity(source.len()), |mut acc, c| { - if let Some(esc) = escape_invisible(c) { - acc.push_str(esc); - } else { - acc.push(c); - } - acc - }) -} - -impl fmt::Display for TokenSetDisplay<'_> { +impl<'a> fmt::Display for TokenSetDisplay<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { write!(f, "[")?; for (i, symbol) in self.0.iter().enumerate() { @@ -290,14 +253,14 @@ impl fmt::Display for TokenSetDisplay<'_> { if symbol.is_terminal() { if let Some(variable) = self.2.variables.get(symbol.index) { - write!(f, "{}", display_variable_name(&variable.name))?; + write!(f, "{}", &variable.name)?; } else { write!(f, "terminal-{}", symbol.index)?; } } else if symbol.is_external() { - write!(f, "{}", self.1.external_tokens[symbol.index].name)?; + write!(f, "{}", &self.1.external_tokens[symbol.index].name)?; } else { - write!(f, "{}", self.1.variables[symbol.index].name)?; + write!(f, "{}", &self.1.variables[symbol.index].name)?; } } write!(f, "]")?; @@ -305,29 +268,21 @@ impl fmt::Display for TokenSetDisplay<'_> { } } -impl fmt::Display for ParseItemSetDisplay<'_> { +impl<'a> fmt::Display for ParseItemSetDisplay<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - for entry in &self.0.entries { - write!( + for (item, lookaheads) in &self.0.entries { + writeln!( f, "{}\t{}", - ParseItemDisplay(&entry.item, self.1, self.2), - TokenSetDisplay(&entry.lookaheads, self.1, self.2), + ParseItemDisplay(item, self.1, self.2), + TokenSetDisplay(lookaheads, self.1, self.2) )?; - if entry.following_reserved_word_set != ReservedWordSetId::default() { - write!( - f, - "\treserved word set: {}", - entry.following_reserved_word_set - )?; - } - writeln!(f)?; } Ok(()) } } -impl Hash for ParseItem<'_> { +impl<'a> Hash for ParseItem<'a> { fn hash(&self, hasher: &mut H) { hasher.write_u32(self.variable_index); hasher.write_u32(self.step_index); @@ -341,7 +296,7 @@ impl Hash for ParseItem<'_> { // this item, unless any of the following are true: // * the children have fields // * the children have aliases - // * the children are hidden and represent rules that have fields. + // * the children are hidden and // See the docs for `has_preceding_inherited_fields`. for step in &self.production.steps[0..self.step_index as usize] { step.alias.hash(hasher); @@ -356,7 +311,7 @@ impl Hash for ParseItem<'_> { } } -impl PartialEq for ParseItem<'_> { +impl<'a> PartialEq for ParseItem<'a> { fn eq(&self, other: &Self) -> bool { if self.variable_index != other.variable_index || self.step_index != other.step_index @@ -393,7 +348,7 @@ impl PartialEq for ParseItem<'_> { } } -impl Ord for ParseItem<'_> { +impl<'a> Ord for ParseItem<'a> { fn cmp(&self, other: &Self) -> Ordering { self.step_index .cmp(&other.step_index) @@ -433,26 +388,25 @@ impl Ord for ParseItem<'_> { } } -impl PartialOrd for ParseItem<'_> { +impl<'a> PartialOrd for ParseItem<'a> { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl Eq for ParseItem<'_> {} +impl<'a> Eq for ParseItem<'a> {} -impl Hash for ParseItemSet<'_> { +impl<'a> Hash for ParseItemSet<'a> { fn hash(&self, hasher: &mut H) { hasher.write_usize(self.entries.len()); - for entry in &self.entries { - entry.item.hash(hasher); - entry.lookaheads.hash(hasher); - entry.following_reserved_word_set.hash(hasher); + for (item, lookaheads) in &self.entries { + item.hash(hasher); + lookaheads.hash(hasher); } } } -impl Hash for ParseItemSetCore<'_> { +impl<'a> Hash for ParseItemSetCore<'a> { fn hash(&self, hasher: &mut H) { hasher.write_usize(self.entries.len()); for item in &self.entries { diff --git a/crates/generate/src/build_tables/item_set_builder.rs b/cli/src/generate/build_tables/item_set_builder.rs similarity index 54% rename from crates/generate/src/build_tables/item_set_builder.rs rename to cli/src/generate/build_tables/item_set_builder.rs index 44e05702..16305bd3 100644 --- a/crates/generate/src/build_tables/item_set_builder.rs +++ b/cli/src/generate/build_tables/item_set_builder.rs @@ -3,9 +3,9 @@ use std::{ fmt, }; -use super::item::{ParseItem, ParseItemDisplay, ParseItemSet, ParseItemSetEntry, TokenSetDisplay}; -use crate::{ - grammars::{InlinedProductionMap, LexicalGrammar, ReservedWordSetId, SyntaxGrammar}, +use super::item::{ParseItem, ParseItemDisplay, ParseItemSet, TokenSetDisplay}; +use crate::generate::{ + grammars::{InlinedProductionMap, LexicalGrammar, SyntaxGrammar}, rules::{Symbol, SymbolType, TokenSet}, }; @@ -15,10 +15,9 @@ struct TransitiveClosureAddition<'a> { info: FollowSetInfo, } -#[derive(Clone, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] struct FollowSetInfo { lookaheads: TokenSet, - reserved_lookaheads: ReservedWordSetId, propagates_lookaheads: bool, } @@ -26,7 +25,6 @@ pub struct ParseItemSetBuilder<'a> { syntax_grammar: &'a SyntaxGrammar, lexical_grammar: &'a LexicalGrammar, first_sets: HashMap, - reserved_first_sets: HashMap, last_sets: HashMap, inlines: &'a InlinedProductionMap, transitive_closure_additions: Vec>>, @@ -48,7 +46,6 @@ impl<'a> ParseItemSetBuilder<'a> { syntax_grammar, lexical_grammar, first_sets: HashMap::new(), - reserved_first_sets: HashMap::new(), last_sets: HashMap::new(), inlines, transitive_closure_additions: vec![Vec::new(); syntax_grammar.variables.len()], @@ -57,7 +54,8 @@ impl<'a> ParseItemSetBuilder<'a> { // For each grammar symbol, populate the FIRST and LAST sets: the set of // terminals that appear at the beginning and end that symbol's productions, // respectively. - // For a terminal symbol, the FIRST and LAST sets just consist of the + // + // For a terminal symbol, the FIRST and LAST set just consists of the // terminal itself. for i in 0..lexical_grammar.variables.len() { let symbol = Symbol::terminal(i); @@ -65,9 +63,6 @@ impl<'a> ParseItemSetBuilder<'a> { set.insert(symbol); result.first_sets.insert(symbol, set.clone()); result.last_sets.insert(symbol, set); - result - .reserved_first_sets - .insert(symbol, ReservedWordSetId::default()); } for i in 0..syntax_grammar.external_tokens.len() { @@ -76,15 +71,12 @@ impl<'a> ParseItemSetBuilder<'a> { set.insert(symbol); result.first_sets.insert(symbol, set.clone()); result.last_sets.insert(symbol, set); - result - .reserved_first_sets - .insert(symbol, ReservedWordSetId::default()); } - // The FIRST set of a non-terminal `i` is the union of the FIRST sets - // of all the symbols that appear at the beginnings of i's productions. Some - // of these symbols may themselves be non-terminals, so this is a recursive - // definition. + // The FIRST set of a non-terminal `i` is the union of the following sets: + // * the set of all terminals that appear at the beginnings of i's productions + // * the FIRST sets of all the non-terminals that appear at the beginnings of i's + // productions // // Rather than computing these sets using recursion, we use an explicit stack // called `symbols_to_process`. @@ -92,36 +84,37 @@ impl<'a> ParseItemSetBuilder<'a> { let mut processed_non_terminals = HashSet::new(); for i in 0..syntax_grammar.variables.len() { let symbol = Symbol::non_terminal(i); - let first_set = result.first_sets.entry(symbol).or_default(); - let reserved_first_set = result.reserved_first_sets.entry(symbol).or_default(); + let first_set = result + .first_sets + .entry(symbol) + .or_insert_with(TokenSet::new); processed_non_terminals.clear(); symbols_to_process.clear(); symbols_to_process.push(symbol); - while let Some(sym) = symbols_to_process.pop() { - for production in &syntax_grammar.variables[sym.index].productions { - if let Some(step) = production.steps.first() { - if step.symbol.is_terminal() || step.symbol.is_external() { - first_set.insert(step.symbol); - } else if processed_non_terminals.insert(step.symbol) { + while let Some(current_symbol) = symbols_to_process.pop() { + if current_symbol.is_terminal() || current_symbol.is_external() { + first_set.insert(current_symbol); + } else if processed_non_terminals.insert(current_symbol) { + for production in &syntax_grammar.variables[current_symbol.index].productions { + if let Some(step) = production.steps.first() { symbols_to_process.push(step.symbol); } - *reserved_first_set = (*reserved_first_set).max(step.reserved_word_set_id); } } } // The LAST set is defined in a similar way to the FIRST set. - let last_set = result.last_sets.entry(symbol).or_default(); + let last_set = result.last_sets.entry(symbol).or_insert_with(TokenSet::new); processed_non_terminals.clear(); symbols_to_process.clear(); symbols_to_process.push(symbol); - while let Some(sym) = symbols_to_process.pop() { - for production in &syntax_grammar.variables[sym.index].productions { - if let Some(step) = production.steps.last() { - if step.symbol.is_terminal() || step.symbol.is_external() { - last_set.insert(step.symbol); - } else if processed_non_terminals.insert(step.symbol) { + while let Some(current_symbol) = symbols_to_process.pop() { + if current_symbol.is_terminal() || current_symbol.is_external() { + last_set.insert(current_symbol); + } else if processed_non_terminals.insert(current_symbol) { + for production in &syntax_grammar.variables[current_symbol.index].productions { + if let Some(step) = production.steps.last() { symbols_to_process.push(step.symbol); } } @@ -131,75 +124,67 @@ impl<'a> ParseItemSetBuilder<'a> { // To compute an item set's transitive closure, we find each item in the set // whose next symbol is a non-terminal, and we add new items to the set for - // each of that symbol's productions. These productions might themselves begin + // each of that symbols' productions. These productions might themselves begin // with non-terminals, so the process continues recursively. In this process, // the total set of entries that get added depends only on two things: - // - // * the non-terminal symbol that occurs next in each item - // - // * the set of terminals that can follow that non-terminal symbol in the item + // * the set of non-terminal symbols that occur at each item's current position + // * the set of terminals that occurs after each of these non-terminal symbols // // So we can avoid a lot of duplicated recursive work by precomputing, for each // non-terminal symbol `i`, a final list of *additions* that must be made to an - // item set when symbol `i` occurs as the next symbol in one if its core items. - // The structure of a precomputed *addition* is as follows: - // - // * `item` - the new item that must be added as part of the expansion of the symbol `i`. - // - // * `lookaheads` - the set of possible lookahead tokens that can always come after `item` - // in an expansion of symbol `i`. - // - // * `reserved_lookaheads` - the set of reserved lookahead lookahead tokens that can - // always come after `item` in the expansion of symbol `i`. - // + // item set when `i` occurs as the next symbol in one if its core items. The + // structure of an *addition* is as follows: + // * `item` - the new item that must be added as part of the expansion of `i` + // * `lookaheads` - lookahead tokens that can always come after that item in the expansion + // of `i` // * `propagates_lookaheads` - a boolean indicating whether or not `item` can occur at the - // *end* of the expansion of symbol `i`, so that i's own current lookahead tokens can - // occur after `item`. + // *end* of the expansion of `i`, so that i's own current lookahead tokens can occur + // after `item`. // - // Rather than computing these additions recursively, we use an explicit stack. - let empty_lookaheads = TokenSet::new(); - let mut stack = Vec::new(); - let mut follow_set_info_by_non_terminal = HashMap::::new(); + // Again, rather than computing these additions recursively, we use an explicit + // stack called `entries_to_process`. for i in 0..syntax_grammar.variables.len() { + let empty_lookaheads = TokenSet::new(); + let mut entries_to_process = vec![(i, &empty_lookaheads, true)]; + // First, build up a map whose keys are all of the non-terminals that can // appear at the beginning of non-terminal `i`, and whose values store - // information about the tokens that can follow those non-terminals. - stack.clear(); - stack.push((i, &empty_lookaheads, ReservedWordSetId::default(), true)); - follow_set_info_by_non_terminal.clear(); - while let Some((sym_ix, lookaheads, reserved_word_set_id, propagates_lookaheads)) = - stack.pop() - { - let mut did_add = false; - let info = follow_set_info_by_non_terminal.entry(sym_ix).or_default(); - did_add |= info.lookaheads.insert_all(lookaheads); - if reserved_word_set_id > info.reserved_lookaheads { - info.reserved_lookaheads = reserved_word_set_id; - did_add = true; - } - did_add |= propagates_lookaheads && !info.propagates_lookaheads; - info.propagates_lookaheads |= propagates_lookaheads; - if !did_add { - continue; + // information about the tokens that can follow each non-terminal. + let mut follow_set_info_by_non_terminal = HashMap::new(); + while let Some(entry) = entries_to_process.pop() { + let (variable_index, lookaheads, propagates_lookaheads) = entry; + let existing_info = follow_set_info_by_non_terminal + .entry(variable_index) + .or_insert_with(|| FollowSetInfo { + lookaheads: TokenSet::new(), + propagates_lookaheads: false, + }); + + let did_add_follow_set_info; + if propagates_lookaheads { + did_add_follow_set_info = !existing_info.propagates_lookaheads; + existing_info.propagates_lookaheads = true; + } else { + did_add_follow_set_info = existing_info.lookaheads.insert_all(lookaheads); } - for production in &syntax_grammar.variables[sym_ix].productions { - if let Some(symbol) = production.first_symbol() { - if symbol.is_non_terminal() { - if let Some(next_step) = production.steps.get(1) { - stack.push(( - symbol.index, - &result.first_sets[&next_step.symbol], - result.reserved_first_sets[&next_step.symbol], - false, - )); - } else { - stack.push(( - symbol.index, - lookaheads, - reserved_word_set_id, - propagates_lookaheads, - )); + if did_add_follow_set_info { + for production in &syntax_grammar.variables[variable_index].productions { + if let Some(symbol) = production.first_symbol() { + if symbol.is_non_terminal() { + if production.steps.len() == 1 { + entries_to_process.push(( + symbol.index, + lookaheads, + propagates_lookaheads, + )); + } else { + entries_to_process.push(( + symbol.index, + &result.first_sets[&production.steps[1].symbol], + false, + )); + } } } } @@ -209,7 +194,7 @@ impl<'a> ParseItemSetBuilder<'a> { // Store all of those non-terminals' productions, along with their associated // lookahead info, as *additions* associated with non-terminal `i`. let additions_for_non_terminal = &mut result.transitive_closure_additions[i]; - for (&variable_index, follow_set_info) in &follow_set_info_by_non_terminal { + for (variable_index, follow_set_info) in follow_set_info_by_non_terminal { let variable = &syntax_grammar.variables[variable_index]; let non_terminal = Symbol::non_terminal(variable_index); let variable_index = variable_index as u32; @@ -254,23 +239,20 @@ impl<'a> ParseItemSetBuilder<'a> { pub fn transitive_closure(&self, item_set: &ParseItemSet<'a>) -> ParseItemSet<'a> { let mut result = ParseItemSet::default(); - for entry in &item_set.entries { + for (item, lookaheads) in &item_set.entries { if let Some(productions) = self .inlines - .inlined_productions(entry.item.production, entry.item.step_index) + .inlined_productions(item.production, item.step_index) { for production in productions { self.add_item( &mut result, - &ParseItemSetEntry { - item: entry.item.substitute_production(production), - lookaheads: entry.lookaheads.clone(), - following_reserved_word_set: entry.following_reserved_word_set, - }, + item.substitute_production(production), + lookaheads, ); } } else { - self.add_item(&mut result, entry); + self.add_item(&mut result, *item, lookaheads); } } result @@ -280,68 +262,34 @@ impl<'a> ParseItemSetBuilder<'a> { &self.first_sets[symbol] } - pub fn reserved_first_set(&self, symbol: &Symbol) -> Option<&TokenSet> { - let id = *self.reserved_first_sets.get(symbol)?; - Some(&self.syntax_grammar.reserved_word_sets[id.0]) - } - pub fn last_set(&self, symbol: &Symbol) -> &TokenSet { &self.last_sets[symbol] } - fn add_item(&self, set: &mut ParseItemSet<'a>, entry: &ParseItemSetEntry<'a>) { - if let Some(step) = entry.item.step() { + fn add_item(&self, set: &mut ParseItemSet<'a>, item: ParseItem<'a>, lookaheads: &TokenSet) { + if let Some(step) = item.step() { if step.symbol.is_non_terminal() { - let next_step = entry.item.successor().step(); + let next_step = item.successor().step(); // Determine which tokens can follow this non-terminal. - let (following_tokens, following_reserved_tokens) = - if let Some(next_step) = next_step { - ( - self.first_sets.get(&next_step.symbol).unwrap(), - *self.reserved_first_sets.get(&next_step.symbol).unwrap(), - ) - } else { - (&entry.lookaheads, entry.following_reserved_word_set) - }; + let following_tokens = next_step.map_or(lookaheads, |next_step| { + self.first_sets.get(&next_step.symbol).unwrap() + }); // Use the pre-computed *additions* to expand the non-terminal. for addition in &self.transitive_closure_additions[step.symbol.index] { - let entry = set.insert(addition.item); - entry.lookaheads.insert_all(&addition.info.lookaheads); - - if let Some(word_token) = self.syntax_grammar.word_token { - if addition.info.lookaheads.contains(&word_token) { - entry.following_reserved_word_set = entry - .following_reserved_word_set - .max(addition.info.reserved_lookaheads); - } - } - + let lookaheads = set.insert(addition.item, &addition.info.lookaheads); if addition.info.propagates_lookaheads { - entry.lookaheads.insert_all(following_tokens); - - if let Some(word_token) = self.syntax_grammar.word_token { - if following_tokens.contains(&word_token) { - entry.following_reserved_word_set = entry - .following_reserved_word_set - .max(following_reserved_tokens); - } - } + lookaheads.insert_all(following_tokens); } } } } - - let e = set.insert(entry.item); - e.lookaheads.insert_all(&entry.lookaheads); - e.following_reserved_word_set = e - .following_reserved_word_set - .max(entry.following_reserved_word_set); + set.insert(item, lookaheads); } } -impl fmt::Debug for ParseItemSetBuilder<'_> { +impl<'a> fmt::Debug for ParseItemSetBuilder<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { writeln!(f, "ParseItemSetBuilder {{")?; diff --git a/crates/generate/src/build_tables/minimize_parse_table.rs b/cli/src/generate/build_tables/minimize_parse_table.rs similarity index 83% rename from crates/generate/src/build_tables/minimize_parse_table.rs rename to cli/src/generate/build_tables/minimize_parse_table.rs index 6c26f1c4..5eb6260b 100644 --- a/crates/generate/src/build_tables/minimize_parse_table.rs +++ b/cli/src/generate/build_tables/minimize_parse_table.rs @@ -3,15 +3,14 @@ use std::{ mem, }; -use log::debug; +use log::info; use super::token_conflicts::TokenConflictMap; -use crate::{ +use crate::generate::{ dedup::split_state_id_groups, grammars::{LexicalGrammar, SyntaxGrammar, VariableType}, rules::{AliasMap, Symbol, TokenSet}, tables::{GotoAction, ParseAction, ParseState, ParseStateId, ParseTable, ParseTableEntry}, - OptLevel, }; pub fn minimize_parse_table( @@ -21,7 +20,6 @@ pub fn minimize_parse_table( simple_aliases: &AliasMap, token_conflict_map: &TokenConflictMap, keywords: &TokenSet, - optimizations: OptLevel, ) { let mut minimizer = Minimizer { parse_table, @@ -31,9 +29,7 @@ pub fn minimize_parse_table( keywords, simple_aliases, }; - if optimizations.contains(OptLevel::MergeStates) { - minimizer.merge_compatible_states(); - } + minimizer.merge_compatible_states(); minimizer.remove_unit_reductions(); minimizer.remove_unused_states(); minimizer.reorder_states_by_descending_size(); @@ -48,7 +44,7 @@ struct Minimizer<'a> { simple_aliases: &'a AliasMap, } -impl Minimizer<'_> { +impl<'a> Minimizer<'a> { fn remove_unit_reductions(&mut self) { let mut aliased_symbols = HashSet::new(); for variable in &self.syntax_grammar.variables { @@ -74,17 +70,18 @@ impl Minimizer<'_> { production_id: 0, symbol, .. - } if !self.simple_aliases.contains_key(symbol) - && !self.syntax_grammar.supertype_symbols.contains(symbol) - && !self.syntax_grammar.extra_symbols.contains(symbol) - && !aliased_symbols.contains(symbol) - && self.syntax_grammar.variables[symbol.index].kind - != VariableType::Named - && (unit_reduction_symbol.is_none() - || unit_reduction_symbol == Some(symbol)) => - { - unit_reduction_symbol = Some(symbol); - continue; + } => { + if !self.simple_aliases.contains_key(symbol) + && !self.syntax_grammar.supertype_symbols.contains(symbol) + && !aliased_symbols.contains(symbol) + && self.syntax_grammar.variables[symbol.index].kind + != VariableType::Named + && (unit_reduction_symbol.is_none() + || unit_reduction_symbol == Some(symbol)) + { + unit_reduction_symbol = Some(symbol); + continue; + } } _ => {} } @@ -155,7 +152,9 @@ impl Minimizer<'_> { &mut group_ids_by_state_id, 0, |left, right, groups| self.state_successors_differ(left, right, groups), - ) {} + ) { + continue; + } let error_group_index = state_ids_by_group_id .iter() @@ -172,12 +171,17 @@ impl Minimizer<'_> { let mut new_states = Vec::with_capacity(state_ids_by_group_id.len()); for state_ids in &state_ids_by_group_id { // Initialize the new state based on the first old state in the group. - let mut parse_state = mem::take(&mut self.parse_table.states[state_ids[0]]); + let mut parse_state = ParseState::default(); + mem::swap(&mut parse_state, &mut self.parse_table.states[state_ids[0]]); // Extend the new state with all of the actions from the other old states // in the group. for state_id in &state_ids[1..] { - let other_parse_state = mem::take(&mut self.parse_table.states[*state_id]); + let mut other_parse_state = ParseState::default(); + mem::swap( + &mut other_parse_state, + &mut self.parse_table.states[*state_id], + ); parse_state .terminal_entries @@ -185,12 +189,6 @@ impl Minimizer<'_> { parse_state .nonterminal_entries .extend(other_parse_state.nonterminal_entries); - parse_state - .reserved_words - .insert_all(&other_parse_state.reserved_words); - for symbol in parse_state.terminal_entries.keys() { - parse_state.reserved_words.remove(symbol); - } } // Update the new state's outgoing references using the new grouping. @@ -219,14 +217,24 @@ impl Minimizer<'_> { ) { return true; } - } else if self.token_conflicts(left_state.id, right_state.id, right_state, *token) { + } else if self.token_conflicts( + left_state.id, + right_state.id, + right_state.terminal_entries.keys(), + *token, + ) { return true; } } for token in right_state.terminal_entries.keys() { if !left_state.terminal_entries.contains_key(token) - && self.token_conflicts(left_state.id, right_state.id, left_state, *token) + && self.token_conflicts( + left_state.id, + right_state.id, + left_state.terminal_entries.keys(), + *token, + ) { return true; } @@ -248,7 +256,7 @@ impl Minimizer<'_> { let group1 = group_ids_by_state_id[*s1]; let group2 = group_ids_by_state_id[*s2]; if group1 != group2 { - debug!( + info!( "split states {} {} - successors for {} are split: {s1} {s2}", state1.id, state2.id, @@ -264,12 +272,12 @@ impl Minimizer<'_> { for (symbol, s1) in &state1.nonterminal_entries { if let Some(s2) = state2.nonterminal_entries.get(symbol) { match (s1, s2) { - (GotoAction::ShiftExtra, GotoAction::ShiftExtra) => {} + (GotoAction::ShiftExtra, GotoAction::ShiftExtra) => continue, (GotoAction::Goto(s1), GotoAction::Goto(s2)) => { let group1 = group_ids_by_state_id[*s1]; let group2 = group_ids_by_state_id[*s2]; if group1 != group2 { - debug!( + info!( "split states {} {} - successors for {} are split: {s1} {s2}", state1.id, state2.id, @@ -299,14 +307,16 @@ impl Minimizer<'_> { let actions1 = &entry1.actions; let actions2 = &entry2.actions; if actions1.len() != actions2.len() { - debug!( + info!( "split states {state_id1} {state_id2} - differing action counts for token {}", self.symbol_name(token) ); return true; } - for (action1, action2) in actions1.iter().zip(actions2.iter()) { + for (i, action1) in actions1.iter().enumerate() { + let action2 = &actions2[i]; + // Two shift actions are equivalent if their destinations are in the same group. if let ( ParseAction::Shift { @@ -324,13 +334,13 @@ impl Minimizer<'_> { if group1 == group2 && is_repetition1 == is_repetition2 { continue; } - debug!( + info!( "split states {state_id1} {state_id2} - successors for {} are split: {s1} {s2}", self.symbol_name(token), ); return true; } else if action1 != action2 { - debug!( + info!( "split states {state_id1} {state_id2} - unequal actions for {}", self.symbol_name(token), ); @@ -341,32 +351,28 @@ impl Minimizer<'_> { false } - fn token_conflicts( + fn token_conflicts<'b>( &self, left_id: ParseStateId, right_id: ParseStateId, - right_state: &ParseState, + existing_tokens: impl Iterator, new_token: Symbol, ) -> bool { if new_token == Symbol::end_of_nonterminal_extra() { - debug!("split states {left_id} {right_id} - end of non-terminal extra",); + info!("split states {left_id} {right_id} - end of non-terminal extra",); return true; } // Do not add external tokens; they could conflict lexically with any of the state's // existing lookahead tokens. if new_token.is_external() { - debug!( + info!( "split states {left_id} {right_id} - external token {}", self.symbol_name(&new_token), ); return true; } - if right_state.reserved_words.contains(&new_token) { - return false; - } - // Do not add tokens which are both internal and external. Their validity could // influence the behavior of the external scanner. if self @@ -375,7 +381,7 @@ impl Minimizer<'_> { .iter() .any(|external| external.corresponding_internal_token == Some(new_token)) { - debug!( + info!( "split states {left_id} {right_id} - internal/external token {}", self.symbol_name(&new_token), ); @@ -383,30 +389,23 @@ impl Minimizer<'_> { } // Do not add a token if it conflicts with an existing token. - for token in right_state.terminal_entries.keys().copied() { - if !token.is_terminal() { - continue; - } - if self.syntax_grammar.word_token == Some(token) && self.keywords.contains(&new_token) { - continue; - } - if self.syntax_grammar.word_token == Some(new_token) && self.keywords.contains(&token) { - continue; - } - - if self - .token_conflict_map - .does_conflict(new_token.index, token.index) - || self + for token in existing_tokens { + if token.is_terminal() + && !(self.syntax_grammar.word_token == Some(*token) + && self.keywords.contains(&new_token)) + && !(self.syntax_grammar.word_token == Some(new_token) + && self.keywords.contains(token)) + && (self .token_conflict_map - .does_match_same_string(new_token.index, token.index) + .does_conflict(new_token.index, token.index) + || self + .token_conflict_map + .does_match_same_string(new_token.index, token.index)) { - debug!( - "split states {} {} - token {} conflicts with {}", - left_id, - right_id, + info!( + "split states {left_id} {right_id} - token {} conflicts with {}", self.symbol_name(&new_token), - self.symbol_name(&token), + self.symbol_name(token), ); return true; } diff --git a/crates/generate/src/build_tables.rs b/cli/src/generate/build_tables/mod.rs similarity index 81% rename from crates/generate/src/build_tables.rs rename to cli/src/generate/build_tables/mod.rs index 8c6ef2a4..34fa3fa1 100644 --- a/crates/generate/src/build_tables.rs +++ b/cli/src/generate/build_tables/mod.rs @@ -8,32 +8,30 @@ mod token_conflicts; use std::collections::{BTreeSet, HashMap}; +use anyhow::Result; pub use build_lex_table::LARGE_CHARACTER_RANGE_COUNT; -use build_parse_table::BuildTableResult; -pub use build_parse_table::ParseTableBuilderError; -use log::{debug, info}; +use log::info; use self::{ build_lex_table::build_lex_table, build_parse_table::{build_parse_table, ParseStateInfo}, coincident_tokens::CoincidentTokenIndex, - item_set_builder::ParseItemSetBuilder, minimize_parse_table::minimize_parse_table, token_conflicts::TokenConflictMap, }; -use crate::{ +use crate::generate::{ grammars::{InlinedProductionMap, LexicalGrammar, SyntaxGrammar}, nfa::{CharacterSet, NfaCursor}, node_types::VariableInfo, rules::{AliasMap, Symbol, SymbolType, TokenSet}, tables::{LexTable, ParseAction, ParseTable, ParseTableEntry}, - OptLevel, }; pub struct Tables { pub parse_table: ParseTable, pub main_lex_table: LexTable, pub keyword_lex_table: LexTable, + pub word_token: Option, pub large_character_sets: Vec<(Option, CharacterSet)>, } @@ -44,17 +42,9 @@ pub fn build_tables( variable_info: &[VariableInfo], inlines: &InlinedProductionMap, report_symbol_name: Option<&str>, - optimizations: OptLevel, -) -> BuildTableResult { - let item_set_builder = ParseItemSetBuilder::new(syntax_grammar, lexical_grammar, inlines); - let following_tokens = - get_following_tokens(syntax_grammar, lexical_grammar, inlines, &item_set_builder); - let (mut parse_table, parse_state_info) = build_parse_table( - syntax_grammar, - lexical_grammar, - item_set_builder, - variable_info, - )?; +) -> Result { + let (mut parse_table, following_tokens, parse_state_info) = + build_parse_table(syntax_grammar, lexical_grammar, inlines, variable_info)?; let token_conflict_map = TokenConflictMap::new(lexical_grammar, following_tokens); let coincident_token_index = CoincidentTokenIndex::new(&parse_table, lexical_grammar); let keywords = identify_keywords( @@ -80,7 +70,6 @@ pub fn build_tables( simple_aliases, &token_conflict_map, &keywords, - optimizations, ); let lex_tables = build_lex_table( &mut parse_table, @@ -103,59 +92,15 @@ pub fn build_tables( ); } - if parse_table.states.len() > u16::MAX as usize { - Err(ParseTableBuilderError::StateCount(parse_table.states.len()))?; - } - Ok(Tables { parse_table, main_lex_table: lex_tables.main_lex_table, keyword_lex_table: lex_tables.keyword_lex_table, large_character_sets: lex_tables.large_character_sets, + word_token: syntax_grammar.word_token, }) } -fn get_following_tokens( - syntax_grammar: &SyntaxGrammar, - lexical_grammar: &LexicalGrammar, - inlines: &InlinedProductionMap, - builder: &ParseItemSetBuilder, -) -> Vec { - let mut result = vec![TokenSet::new(); lexical_grammar.variables.len()]; - let productions = syntax_grammar - .variables - .iter() - .flat_map(|v| &v.productions) - .chain(&inlines.productions); - let all_tokens = (0..result.len()) - .map(Symbol::terminal) - .collect::(); - for production in productions { - for i in 1..production.steps.len() { - let left_tokens = builder.last_set(&production.steps[i - 1].symbol); - let right_tokens = builder.first_set(&production.steps[i].symbol); - let right_reserved_tokens = builder.reserved_first_set(&production.steps[i].symbol); - for left_token in left_tokens.iter() { - if left_token.is_terminal() { - result[left_token.index].insert_all_terminals(right_tokens); - if let Some(reserved_tokens) = right_reserved_tokens { - result[left_token.index].insert_all_terminals(reserved_tokens); - } - } - } - } - } - for extra in &syntax_grammar.extra_symbols { - if extra.is_terminal() { - for entry in &mut result { - entry.insert(*extra); - } - result[extra.index] = all_tokens.clone(); - } - } - result -} - fn populate_error_state( parse_table: &mut ParseTable, syntax_grammar: &SyntaxGrammar, @@ -179,7 +124,7 @@ fn populate_error_state( if conflicts_with_other_tokens { None } else { - debug!( + info!( "error recovery - token {} has no conflicts", lexical_grammar.variables[i].name ); @@ -205,14 +150,14 @@ fn populate_error_state( !coincident_token_index.contains(symbol, *t) && token_conflict_map.does_conflict(symbol.index, t.index) }) { - debug!( + info!( "error recovery - exclude token {} because of conflict with {}", lexical_grammar.variables[i].name, lexical_grammar.variables[t.index].name ); continue; } } - debug!( + info!( "error recovery - include token {}", lexical_grammar.variables[i].name ); @@ -263,7 +208,7 @@ fn populate_used_symbols( // ensure that a subtree's symbol can be successfully reassigned to the word token // without having to move the subtree to the heap. // See https://github.com/tree-sitter/tree-sitter/issues/258 - if syntax_grammar.word_token.is_some_and(|t| t.index == i) { + if syntax_grammar.word_token.map_or(false, |t| t.index == i) { parse_table.symbols.insert(1, Symbol::terminal(i)); } else { parse_table.symbols.push(Symbol::terminal(i)); @@ -345,7 +290,7 @@ fn identify_keywords( && token_conflict_map.does_match_same_string(i, word_token.index) && !token_conflict_map.does_match_different_string(i, word_token.index) { - debug!( + info!( "Keywords - add candidate {}", lexical_grammar.variables[i].name ); @@ -364,7 +309,7 @@ fn identify_keywords( if other_token != *token && token_conflict_map.does_match_same_string(other_token.index, token.index) { - debug!( + info!( "Keywords - exclude {} because it matches the same string as {}", lexical_grammar.variables[token.index].name, lexical_grammar.variables[other_token.index].name @@ -406,7 +351,7 @@ fn identify_keywords( word_token.index, other_index, ) { - debug!( + info!( "Keywords - exclude {} because of conflict with {}", lexical_grammar.variables[token.index].name, lexical_grammar.variables[other_index].name @@ -415,7 +360,7 @@ fn identify_keywords( } } - debug!( + info!( "Keywords - include {}", lexical_grammar.variables[token.index].name, ); @@ -469,9 +414,9 @@ fn report_state_info<'a>( for (i, state) in parse_table.states.iter().enumerate() { all_state_indices.insert(i); let item_set = &parse_state_info[state.id]; - for entry in &item_set.1.entries { - if !entry.item.is_augmented() { - symbols_with_state_indices[entry.item.variable_index as usize] + for (item, _) in &item_set.1.entries { + if !item.is_augmented() { + symbols_with_state_indices[item.variable_index as usize] .1 .insert(i); } @@ -487,14 +432,14 @@ fn report_state_info<'a>( .max() .unwrap(); for (symbol, states) in &symbols_with_state_indices { - info!( + eprintln!( "{:width$}\t{}", syntax_grammar.variables[symbol.index].name, states.len(), width = max_symbol_name_length ); } - info!(""); + eprintln!(); let state_indices = if report_symbol_name == "*" { Some(&all_state_indices) @@ -517,27 +462,22 @@ fn report_state_info<'a>( for state_index in state_indices { let id = parse_table.states[state_index].id; let (preceding_symbols, item_set) = &parse_state_info[id]; - info!("state index: {state_index}"); - info!("state id: {id}"); - info!( - "symbol sequence: {}", - preceding_symbols - .iter() - .map(|symbol| { - if symbol.is_terminal() { - lexical_grammar.variables[symbol.index].name.clone() - } else if symbol.is_external() { - syntax_grammar.external_tokens[symbol.index].name.clone() - } else { - syntax_grammar.variables[symbol.index].name.clone() - } - }) - .collect::>() - .join(" ") - ); - info!( + eprintln!("state index: {state_index}"); + eprintln!("state id: {id}"); + eprint!("symbol sequence:"); + for symbol in preceding_symbols { + let name = if symbol.is_terminal() { + &lexical_grammar.variables[symbol.index].name + } else if symbol.is_external() { + &syntax_grammar.external_tokens[symbol.index].name + } else { + &syntax_grammar.variables[symbol.index].name + }; + eprint!(" {name}"); + } + eprintln!( "\nitems:\n{}", - item::ParseItemSetDisplay(item_set, syntax_grammar, lexical_grammar), + self::item::ParseItemSetDisplay(item_set, syntax_grammar, lexical_grammar,), ); } } diff --git a/crates/generate/src/build_tables/token_conflicts.rs b/cli/src/generate/build_tables/token_conflicts.rs similarity index 99% rename from crates/generate/src/build_tables/token_conflicts.rs rename to cli/src/generate/build_tables/token_conflicts.rs index d72effd4..47a114d6 100644 --- a/crates/generate/src/build_tables/token_conflicts.rs +++ b/cli/src/generate/build_tables/token_conflicts.rs @@ -1,6 +1,6 @@ use std::{cmp::Ordering, collections::HashSet, fmt}; -use crate::{ +use crate::generate::{ build_tables::item::TokenSetDisplay, grammars::{LexicalGrammar, SyntaxGrammar}, nfa::{CharacterSet, NfaCursor, NfaTransition}, @@ -28,7 +28,7 @@ pub struct TokenConflictMap<'a> { impl<'a> TokenConflictMap<'a> { /// Create a token conflict map based on a lexical grammar, which describes the structure - /// of each token, and a `following_token` map, which indicates which tokens may be appear + /// each token, and a `following_token` map, which indicates which tokens may be appear /// immediately after each other token. /// /// This analyzes the possible kinds of overlap between each pair of tokens and stores @@ -145,7 +145,7 @@ impl<'a> TokenConflictMap<'a> { } } -impl fmt::Debug for TokenConflictMap<'_> { +impl<'a> fmt::Debug for TokenConflictMap<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { writeln!(f, "TokenConflictMap {{")?; @@ -373,7 +373,7 @@ fn compute_conflict_status( #[cfg(test)] mod tests { use super::*; - use crate::{ + use crate::generate::{ grammars::{Variable, VariableType}, prepare_grammar::{expand_tokens, ExtractedLexicalGrammar}, rules::{Precedence, Rule, Symbol}, diff --git a/crates/generate/src/dedup.rs b/cli/src/generate/dedup.rs similarity index 92% rename from crates/generate/src/dedup.rs rename to cli/src/generate/dedup.rs index c49c73d0..fffe2675 100644 --- a/crates/generate/src/dedup.rs +++ b/cli/src/generate/dedup.rs @@ -3,7 +3,7 @@ pub fn split_state_id_groups( state_ids_by_group_id: &mut Vec>, group_ids_by_state_id: &mut [usize], start_group_id: usize, - mut should_split: impl FnMut(&S, &S, &[usize]) -> bool, + mut f: impl FnMut(&S, &S, &[usize]) -> bool, ) -> bool { let mut result = false; @@ -33,7 +33,7 @@ pub fn split_state_id_groups( } let right_state = &states[right_state_id]; - if should_split(left_state, right_state, group_ids_by_state_id) { + if f(left_state, right_state, group_ids_by_state_id) { split_state_ids.push(right_state_id); } diff --git a/crates/generate/src/dsl.js b/cli/src/generate/dsl.js similarity index 84% rename from crates/generate/src/dsl.js rename to cli/src/generate/dsl.js index f522fd7f..535224e1 100644 --- a/crates/generate/src/dsl.js +++ b/cli/src/generate/dsl.js @@ -16,7 +16,6 @@ function alias(rule, value) { result.value = value.symbol.name; return result; case Object: - case GrammarSymbol: if (typeof value.type === 'string' && value.type === 'SYMBOL') { result.named = true; result.value = value.name; @@ -70,7 +69,7 @@ function prec(number, rule) { }; } -prec.left = function (number, rule) { +prec.left = function(number, rule) { if (rule == null) { rule = number; number = 0; @@ -92,7 +91,7 @@ prec.left = function (number, rule) { }; } -prec.right = function (number, rule) { +prec.right = function(number, rule) { if (rule == null) { rule = number; number = 0; @@ -114,7 +113,7 @@ prec.right = function (number, rule) { }; } -prec.dynamic = function (number, rule) { +prec.dynamic = function(number, rule) { checkPrecedence(number); checkArguments( arguments, @@ -154,26 +153,11 @@ function seq(...elements) { }; } -class GrammarSymbol { - constructor(name) { - this.type = "SYMBOL"; - this.name = name; - } -} - -function reserved(wordset, rule) { - if (typeof wordset !== 'string') { - throw new Error('Invalid reserved word set name: ' + wordset) - } - return { - type: "RESERVED", - content: normalize(rule), - context_name: wordset, - } -} - function sym(name) { - return new GrammarSymbol(name); + return { + type: "SYMBOL", + name + }; } function token(value) { @@ -184,7 +168,7 @@ function token(value) { }; } -token.immediate = function (value) { +token.immediate = function(value) { checkArguments(arguments, arguments.length, token.immediate, 'token.immediate', '', 'literal'); return { type: "IMMEDIATE_TOKEN", @@ -211,11 +195,6 @@ function normalize(value) { type: 'PATTERN', value: value.source }; - case RustRegex: - return { - type: 'PATTERN', - value: value.value - }; case ReferenceError: throw value default: @@ -257,7 +236,6 @@ function grammar(baseGrammar, options) { inline: [], supertypes: [], precedences: [], - reserved: {}, }; } else { baseGrammar = baseGrammar.grammar; @@ -331,28 +309,6 @@ function grammar(baseGrammar, options) { } } - let reserved = baseGrammar.reserved; - if (options.reserved) { - if (typeof options.reserved !== "object") { - throw new Error("Grammar's 'reserved' property must be an object."); - } - - for (const reservedWordSetName of Object.keys(options.reserved)) { - const reservedWordSetFn = options.reserved[reservedWordSetName] - if (typeof reservedWordSetFn !== "function") { - throw new Error(`Grammar reserved word sets must all be functions. '${reservedWordSetName}' is not.`); - } - - const reservedTokens = reservedWordSetFn.call(ruleBuilder, ruleBuilder, baseGrammar.reserved[reservedWordSetName]); - - if (!Array.isArray(reservedTokens)) { - throw new Error(`Grammar's reserved word set functions must all return arrays of rules. '${reservedWordSetName}' does not.`); - } - - reserved[reservedWordSetName] = reservedTokens.map(normalize); - } - } - let extras = baseGrammar.extras.slice(); if (options.extras) { if (typeof options.extras !== "function") { @@ -483,17 +439,10 @@ function grammar(baseGrammar, options) { externals, inline, supertypes, - reserved, }, }; } -class RustRegex { - constructor(value) { - this.value = value; - } -} - function checkArguments(args, ruleCount, caller, callerName, suffix = '', argType = 'rule') { // Allow for .map() usage where additional arguments are index and the entire array. const isMapCall = ruleCount === 3 && typeof args[1] === 'number' && Array.isArray(args[2]); @@ -517,7 +466,6 @@ function checkPrecedence(value) { } function getEnv(name) { - if (globalThis.native) return globalThis.__ts_grammar_path; if (globalThis.process) return process.env[name]; // Node/Bun if (globalThis.Deno) return Deno.env.get(name); // Deno throw Error("Unsupported JS runtime"); @@ -530,31 +478,16 @@ globalThis.optional = optional; globalThis.prec = prec; globalThis.repeat = repeat; globalThis.repeat1 = repeat1; -globalThis.reserved = reserved; globalThis.seq = seq; globalThis.sym = sym; globalThis.token = token; globalThis.grammar = grammar; globalThis.field = field; -globalThis.RustRegex = RustRegex; -const grammarPath = getEnv("TREE_SITTER_GRAMMAR_PATH"); -let result = await import(grammarPath); -let grammarObj = result.default?.grammar ?? result.grammar; +const result = await import(getEnv("TREE_SITTER_GRAMMAR_PATH")); +const output = JSON.stringify(result.default?.grammar ?? result.grammar); -if (globalThis.native && !grammarObj) { - grammarObj = module.exports.grammar; -} - -const object = { - "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json", - ...grammarObj, -}; -const output = JSON.stringify(object); - -if (globalThis.native) { - globalThis.output = output; -} else if (globalThis.process) { // Node/Bun +if (globalThis.process) { // Node/Bun process.stdout.write(output); } else if (globalThis.Deno) { // Deno Deno.stdout.writeSync(new TextEncoder().encode(output)); diff --git a/docs/src/assets/schemas/grammar.schema.json b/cli/src/generate/grammar-schema.json similarity index 78% rename from docs/src/assets/schemas/grammar.schema.json rename to cli/src/generate/grammar-schema.json index e30c7ba0..4752f21f 100644 --- a/docs/src/assets/schemas/grammar.schema.json +++ b/cli/src/generate/grammar-schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Tree-sitter grammar specification", + "title": "tree-sitter grammar specification", "type": "object", "required": ["name", "rules"], @@ -8,18 +8,14 @@ "additionalProperties": false, "properties": { - "$schema": { - "type": "string" - }, - "name": { - "description": "The name of the grammar", + "description": "the name of the grammar", "type": "string", "pattern": "^[a-zA-Z_]\\w*" }, "inherits": { - "description": "The name of the parent grammar", + "description": "the name of the parent grammar", "type": "string", "pattern": "^[a-zA-Z_]\\w*" }, @@ -57,20 +53,6 @@ } }, - "reserved": { - "type": "object", - "patternProperties": { - "^[a-zA-Z_]\\w*$": { - "type": "array", - "uniqueItems": true, - "items": { - "$ref": "#/definitions/rule" - } - } - }, - "additionalProperties": false - }, - "externals": { "type": "array", "uniqueItems": true, @@ -107,11 +89,11 @@ }, "supertypes": { - "description": "A list of hidden rule names that should be considered supertypes in the generated node types file. See https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.", + "description": "A list of hidden rule names that should be considered supertypes in the generated node types file. See https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types.", "type": "array", "uniqueItems": true, "items": { - "description": "The name of a rule in `rules` or `extras`", + "description": "the name of a rule in `rules` or `extras`", "type": "string" } } @@ -123,7 +105,7 @@ "properties": { "type": { "type": "string", - "const": "BLANK" + "pattern": "^BLANK$" } }, "required": ["type"] @@ -134,7 +116,7 @@ "properties": { "type": { "type": "string", - "const": "STRING" + "pattern": "^STRING$" }, "value": { "type": "string" @@ -148,7 +130,7 @@ "properties": { "type": { "type": "string", - "const": "PATTERN" + "pattern": "^PATTERN$" }, "value": { "type": "string" }, "flags": { "type": "string" } @@ -161,7 +143,7 @@ "properties": { "type": { "type": "string", - "const": "SYMBOL" + "pattern": "^SYMBOL$" }, "name": { "type": "string" } }, @@ -173,7 +155,7 @@ "properties": { "type": { "type": "string", - "const": "SEQ" + "pattern": "^SEQ$" }, "members": { "type": "array", @@ -190,7 +172,7 @@ "properties": { "type": { "type": "string", - "const": "CHOICE" + "pattern": "^CHOICE$" }, "members": { "type": "array", @@ -207,10 +189,14 @@ "properties": { "type": { "type": "string", - "const": "ALIAS" + "pattern": "^ALIAS$" + }, + "value": { + "type": "string" + }, + "named": { + "type": "boolean" }, - "value": { "type": "string" }, - "named": { "type": "boolean" }, "content": { "$ref": "#/definitions/rule" } @@ -223,7 +209,7 @@ "properties": { "type": { "type": "string", - "const": "REPEAT" + "pattern": "^REPEAT$" }, "content": { "$ref": "#/definitions/rule" @@ -237,7 +223,7 @@ "properties": { "type": { "type": "string", - "const": "REPEAT1" + "pattern": "^REPEAT1$" }, "content": { "$ref": "#/definitions/rule" @@ -246,30 +232,12 @@ "required": ["type", "content"] }, - "reserved-rule": { - "type": "object", - "properties": { - "type": { - "type": "string", - "const": "RESERVED" - }, - "context_name": { "type": "string" }, - "content": { - "$ref": "#/definitions/rule" - } - }, - "required": ["type", "context_name", "content"] - }, - "token-rule": { "type": "object", "properties": { "type": { "type": "string", - "enum": [ - "TOKEN", - "IMMEDIATE_TOKEN" - ] + "pattern": "^(TOKEN|IMMEDIATE_TOKEN)$" }, "content": { "$ref": "#/definitions/rule" @@ -283,7 +251,7 @@ "name": { "type": "string" }, "type": { "type": "string", - "const": "FIELD" + "pattern": "^FIELD$" }, "content": { "$ref": "#/definitions/rule" @@ -297,12 +265,7 @@ "properties": { "type": { "type": "string", - "enum": [ - "PREC", - "PREC_LEFT", - "PREC_RIGHT", - "PREC_DYNAMIC" - ] + "pattern": "^(PREC|PREC_LEFT|PREC_RIGHT|PREC_DYNAMIC)$" }, "value": { "oneof": [ @@ -328,7 +291,6 @@ { "$ref": "#/definitions/choice-rule" }, { "$ref": "#/definitions/repeat1-rule" }, { "$ref": "#/definitions/repeat-rule" }, - { "$ref": "#/definitions/reserved-rule" }, { "$ref": "#/definitions/token-rule" }, { "$ref": "#/definitions/field-rule" }, { "$ref": "#/definitions/prec-rule" } diff --git a/cli/src/generate/grammar_files.rs b/cli/src/generate/grammar_files.rs new file mode 100644 index 00000000..42690c36 --- /dev/null +++ b/cli/src/generate/grammar_files.rs @@ -0,0 +1,685 @@ +use std::{ + fs, + fs::File, + io::BufReader, + path::{Path, PathBuf}, + str, +}; + +use anyhow::{anyhow, Context, Result}; +use heck::{ToKebabCase, ToShoutySnakeCase, ToSnakeCase, ToUpperCamelCase}; +use indoc::indoc; +use serde::Deserialize; +use serde_json::{json, Map, Value}; + +use super::write_file; + +const CLI_VERSION: &str = env!("CARGO_PKG_VERSION"); +const CLI_VERSION_PLACEHOLDER: &str = "CLI_VERSION"; + +const PARSER_NAME_PLACEHOLDER: &str = "PARSER_NAME"; +const CAMEL_PARSER_NAME_PLACEHOLDER: &str = "CAMEL_PARSER_NAME"; +const UPPER_PARSER_NAME_PLACEHOLDER: &str = "UPPER_PARSER_NAME"; +const LOWER_PARSER_NAME_PLACEHOLDER: &str = "LOWER_PARSER_NAME"; + +const GRAMMAR_JS_TEMPLATE: &str = include_str!("./templates/grammar.js"); +const PACKAGE_JSON_TEMPLATE: &str = include_str!("./templates/package.json"); +const GITIGNORE_TEMPLATE: &str = include_str!("./templates/gitignore"); +const GITATTRIBUTES_TEMPLATE: &str = include_str!("./templates/gitattributes"); +const EDITORCONFIG_TEMPLATE: &str = include_str!("./templates/.editorconfig"); + +const RUST_BINDING_VERSION: &str = env!("CARGO_PKG_VERSION"); +const RUST_BINDING_VERSION_PLACEHOLDER: &str = "RUST_BINDING_VERSION"; + +const LIB_RS_TEMPLATE: &str = include_str!("./templates/lib.rs"); +const BUILD_RS_TEMPLATE: &str = include_str!("./templates/build.rs"); +const CARGO_TOML_TEMPLATE: &str = include_str!("./templates/_cargo.toml"); + +const INDEX_JS_TEMPLATE: &str = include_str!("./templates/index.js"); +const INDEX_D_TS_TEMPLATE: &str = include_str!("./templates/index.d.ts"); +const JS_BINDING_CC_TEMPLATE: &str = include_str!("./templates/js-binding.cc"); +const BINDING_GYP_TEMPLATE: &str = include_str!("./templates/binding.gyp"); +const BINDING_TEST_JS_TEMPLATE: &str = include_str!("./templates/binding_test.js"); + +const MAKEFILE_TEMPLATE: &str = include_str!("./templates/makefile"); +const PARSER_NAME_H_TEMPLATE: &str = include_str!("./templates/PARSER_NAME.h"); +const PARSER_NAME_PC_IN_TEMPLATE: &str = include_str!("./templates/PARSER_NAME.pc.in"); + +const GO_MOD_TEMPLATE: &str = include_str!("./templates/go.mod"); +const BINDING_GO_TEMPLATE: &str = include_str!("./templates/binding.go"); +const BINDING_TEST_GO_TEMPLATE: &str = include_str!("./templates/binding_test.go"); + +const SETUP_PY_TEMPLATE: &str = include_str!("./templates/setup.py"); +const INIT_PY_TEMPLATE: &str = include_str!("./templates/__init__.py"); +const INIT_PYI_TEMPLATE: &str = include_str!("./templates/__init__.pyi"); +const PYPROJECT_TOML_TEMPLATE: &str = include_str!("./templates/pyproject.toml"); +const PY_BINDING_C_TEMPLATE: &str = include_str!("./templates/py-binding.c"); +const TEST_BINDING_PY_TEMPLATE: &str = include_str!("./templates/test_binding.py"); + +const PACKAGE_SWIFT_TEMPLATE: &str = include_str!("./templates/package.swift"); +const TESTS_SWIFT_TEMPLATE: &str = include_str!("./templates/tests.swift"); + +#[derive(Deserialize, Debug)] +struct LanguageConfiguration {} + +#[derive(Deserialize, Debug)] +pub struct PackageJSON { + #[serde(rename = "tree-sitter")] + tree_sitter: Option>, +} + +pub fn path_in_ignore(repo_path: &Path) -> bool { + [ + "bindings", + "build", + "examples", + "node_modules", + "queries", + "script", + "src", + "target", + "test", + "types", + ] + .iter() + .any(|dir| repo_path.ends_with(dir)) +} + +fn insert_after( + map: Map, + after: &str, + key: &str, + value: Value, +) -> Map { + let mut entries = map.into_iter().collect::>(); + let after_index = entries + .iter() + .position(|(k, _)| k == after) + .unwrap_or(entries.len() - 1) + + 1; + entries.insert(after_index, (key.to_string(), value)); + entries.into_iter().collect() +} + +pub fn generate_grammar_files( + repo_path: &Path, + language_name: &str, + generate_bindings: bool, +) -> Result<()> { + let dashed_language_name = language_name.to_kebab_case(); + + // TODO: remove legacy code updates in v0.24.0 + + // Create or update package.json + let package_json_path_state = missing_path_else( + repo_path.join("package.json"), + |path| generate_file(path, PACKAGE_JSON_TEMPLATE, dashed_language_name.as_str()), + |path| { + let package_json_str = + fs::read_to_string(path).with_context(|| "Failed to read package.json")?; + let mut package_json = serde_json::from_str::>(&package_json_str) + .with_context(|| "Failed to parse package.json")?; + if generate_bindings { + let mut updated = false; + + let dependencies = package_json + .entry("dependencies".to_string()) + .or_insert_with(|| Value::Object(Map::new())) + .as_object_mut() + .unwrap(); + if dependencies.remove("nan").is_some() { + eprintln!("Replacing nan dependency with node-addon-api in package.json"); + dependencies.insert("node-addon-api".to_string(), "^8.0.0".into()); + updated = true; + } + if !dependencies.contains_key("node-gyp-build") { + eprintln!("Adding node-gyp-build dependency to package.json"); + dependencies.insert("node-gyp-build".to_string(), "^4.8.1".into()); + updated = true; + } + + let dev_dependencies = package_json + .entry("devDependencies".to_string()) + .or_insert_with(|| Value::Object(Map::new())) + .as_object_mut() + .unwrap(); + if !dev_dependencies.contains_key("prebuildify") { + eprintln!("Adding prebuildify devDependency to package.json"); + dev_dependencies.insert("prebuildify".to_string(), "^6.0.1".into()); + updated = true; + } + + let node_test = "node --test bindings/node/*_test.js"; + let scripts = package_json + .entry("scripts".to_string()) + .or_insert_with(|| Value::Object(Map::new())) + .as_object_mut() + .unwrap(); + if !scripts.get("test").is_some_and(|v| v == node_test) { + eprintln!("Updating package.json scripts"); + *scripts = Map::from_iter([ + ("install".to_string(), "node-gyp-build".into()), + ("prestart".to_string(), "tree-sitter build --wasm".into()), + ("start".to_string(), "tree-sitter playground".into()), + ("test".to_string(), node_test.into()), + ]); + updated = true; + } + + // insert `peerDependencies` after `dependencies` + if !package_json.contains_key("peerDependencies") { + eprintln!("Adding peerDependencies to package.json"); + package_json = insert_after( + package_json, + "dependencies", + "peerDependencies", + json!({"tree-sitter": "^0.21.1"}), + ); + + package_json = insert_after( + package_json, + "peerDependencies", + "peerDependenciesMeta", + json!({"tree_sitter": {"optional": true}}), + ); + updated = true; + } + + // insert `types` right after `main` + if !package_json.contains_key("types") { + eprintln!("Adding types to package.json"); + package_json = + insert_after(package_json, "main", "types", "bindings/node".into()); + updated = true; + } + + // insert `files` right after `keywords` + if !package_json.contains_key("files") { + eprintln!("Adding files to package.json"); + package_json = insert_after( + package_json, + "keywords", + "files", + json!([ + "grammar.js", + "binding.gyp", + "prebuilds/**", + "bindings/node/*", + "queries/*", + "src/**", + "*.wasm" + ]), + ); + updated = true; + } + + // insert `tree-sitter` at the end + if !package_json.contains_key("tree-sitter") { + eprintln!("Adding a `tree-sitter` section to package.json"); + package_json.insert( + "tree-sitter".to_string(), + json!([{ + "scope": format!("source.{language_name}"), + "injection-regex": format!("^{language_name}$"), + }]), + ); + updated = true; + } + + if updated { + let mut package_json_str = serde_json::to_string_pretty(&package_json)?; + package_json_str.push('\n'); + write_file(path, package_json_str)?; + } + } + + Ok(()) + }, + )?; + + let package_json = match lookup_package_json_for_path(package_json_path_state.as_path()) { + Ok((_, p)) => p, + Err(e) if generate_bindings => return Err(e), + _ => return Ok(()), + }; + + // Do not create a grammar.js file in a repo with multiple language configs + if !package_json.has_multiple_language_configs() { + missing_path(repo_path.join("grammar.js"), |path| { + generate_file(path, GRAMMAR_JS_TEMPLATE, language_name) + })?; + } + + if !generate_bindings { + // our job is done + return Ok(()); + } + + // Write .gitignore file + missing_path(repo_path.join(".gitignore"), |path| { + generate_file(path, GITIGNORE_TEMPLATE, language_name) + })?; + + // Write .gitattributes file + missing_path(repo_path.join(".gitattributes"), |path| { + generate_file(path, GITATTRIBUTES_TEMPLATE, language_name) + })?; + + // Write .editorconfig file + missing_path(repo_path.join(".editorconfig"), |path| { + generate_file(path, EDITORCONFIG_TEMPLATE, language_name) + })?; + + let bindings_dir = repo_path.join("bindings"); + + // Generate Rust bindings + missing_path(bindings_dir.join("rust"), create_dir)?.apply(|path| { + missing_path_else( + path.join("lib.rs"), + |path| generate_file(path, LIB_RS_TEMPLATE, language_name), + |path| { + let lib_rs = + fs::read_to_string(path).with_context(|| "Failed to read lib.rs")?; + if !lib_rs.contains("tree_sitter_language") { + generate_file(path, LIB_RS_TEMPLATE, language_name)?; + eprintln!("Updated lib.rs with `tree_sitter_language` dependency"); + } + Ok(()) + }, + )?; + + missing_path_else( + path.join("build.rs"), + |path| generate_file(path, BUILD_RS_TEMPLATE, language_name), + |path| { + let build_rs = + fs::read_to_string(path).with_context(|| "Failed to read build.rs")?; + if !build_rs.contains("-utf-8") { + let index = build_rs + .find(" let parser_path = src_dir.join(\"parser.c\")") + .ok_or_else(|| anyhow!(indoc!{ + "Failed to auto-update build.rs with the `/utf-8` flag for windows. + To fix this, remove `bindings/rust/build.rs` and re-run `tree-sitter generate`"}))?; + + let build_rs = format!( + "{}{}{}\n{}", + &build_rs[..index], + " #[cfg(target_env = \"msvc\")]\n", + " c_config.flag(\"-utf-8\");\n", + &build_rs[index..] + ); + + write_file(path, build_rs)?; + eprintln!("Updated build.rs with the /utf-8 flag for Windows compilation"); + } + Ok(()) + }, + )?; + + missing_path_else( + repo_path.join("Cargo.toml"), + |path| generate_file(path, CARGO_TOML_TEMPLATE, dashed_language_name.as_str()), + |path| { + let cargo_toml = + fs::read_to_string(path).with_context(|| "Failed to read Cargo.toml")?; + if !cargo_toml.contains("tree-sitter-language") { + let start_index = cargo_toml + .find("tree-sitter = \"") + .ok_or_else(|| anyhow!("Failed to find the `tree-sitter` dependency in Cargo.toml"))?; + + let version_start_index = start_index + "tree-sitter = \"".len(); + let version_end_index = cargo_toml[version_start_index..] + .find('\"') + .map(|i| i + version_start_index) + .ok_or_else(|| anyhow!("Failed to find the end of the `tree-sitter` version in Cargo.toml"))?; + + let cargo_toml = format!( + "{}{}{}\n{}\n{}", + &cargo_toml[..start_index], + "tree-sitter-language = \"0.1.0\"", + &cargo_toml[version_end_index + 1..], + "[dev-dependencies]", + "tree-sitter = \"0.23\"", + ); + + write_file(path, cargo_toml)?; + eprintln!("Updated Cargo.toml with the `tree-sitter-language` dependency"); + } + Ok(()) + }, + )?; + + Ok(()) + })?; + + // Generate Node bindings + missing_path(bindings_dir.join("node"), create_dir)?.apply(|path| { + missing_path_else( + path.join("index.js"), + |path| generate_file(path, INDEX_JS_TEMPLATE, language_name), + |path| { + let index_js = + fs::read_to_string(path).with_context(|| "Failed to read index.js")?; + if index_js.contains("../../build/Release") { + eprintln!("Replacing index.js with new binding API"); + generate_file(path, INDEX_JS_TEMPLATE, language_name)?; + } + Ok(()) + }, + )?; + + missing_path(path.join("index.d.ts"), |path| { + generate_file(path, INDEX_D_TS_TEMPLATE, language_name) + })?; + + missing_path(path.join("binding_test.js"), |path| { + generate_file(path, BINDING_TEST_JS_TEMPLATE, language_name) + })?; + + missing_path_else( + path.join("binding.cc"), + |path| generate_file(path, JS_BINDING_CC_TEMPLATE, language_name), + |path| { + let binding_cc = + fs::read_to_string(path).with_context(|| "Failed to read binding.cc")?; + if binding_cc.contains("NAN_METHOD(New) {}") { + eprintln!("Replacing binding.cc with new binding API"); + generate_file(path, JS_BINDING_CC_TEMPLATE, language_name)?; + } + Ok(()) + }, + )?; + + // Create binding.gyp, or update it with new binding API. + missing_path_else( + repo_path.join("binding.gyp"), + |path| generate_file(path, BINDING_GYP_TEMPLATE, language_name), + |path| { + let binding_gyp = + fs::read_to_string(path).with_context(|| "Failed to read binding.gyp")?; + if binding_gyp.contains("require('nan')") { + eprintln!("Replacing binding.gyp with new binding API"); + generate_file(path, BINDING_GYP_TEMPLATE, language_name)?; + } + Ok(()) + }, + )?; + + Ok(()) + })?; + + // Generate C bindings + missing_path(bindings_dir.join("c"), create_dir)?.apply(|path| { + missing_path( + path.join(format!("tree-sitter-{language_name}.h")), + |path| generate_file(path, PARSER_NAME_H_TEMPLATE, language_name), + )?; + + missing_path( + path.join(format!("tree-sitter-{language_name}.pc.in")), + |path| generate_file(path, PARSER_NAME_PC_IN_TEMPLATE, language_name), + )?; + + missing_path(repo_path.join("Makefile"), |path| { + generate_file(path, MAKEFILE_TEMPLATE, language_name) + })?; + + Ok(()) + })?; + + // Generate Go bindings + missing_path(bindings_dir.join("go"), create_dir)?.apply(|path| { + missing_path(path.join("binding.go"), |path| { + generate_file(path, BINDING_GO_TEMPLATE, language_name) + })?; + + missing_path_else( + path.join("binding_test.go"), + |path| generate_file(path, BINDING_TEST_GO_TEMPLATE, language_name), + |path| { + let binding_test_go = + fs::read_to_string(path).with_context(|| "Failed to read binding_test.go")?; + if binding_test_go.contains("smacker") { + eprintln!("Replacing binding_test.go with new binding API"); + generate_file(path, BINDING_TEST_GO_TEMPLATE, language_name)?; + } + Ok(()) + }, + )?; + + // Delete the old go.mod file that lives inside bindings/go, it now lives in the root dir + let go_mod_path = path.join("go.mod"); + if go_mod_path.exists() { + fs::remove_file(go_mod_path).with_context(|| "Failed to remove old go.mod file")?; + } + + missing_path(repo_path.join("go.mod"), |path| { + generate_file(path, GO_MOD_TEMPLATE, language_name) + })?; + + Ok(()) + })?; + + // Generate Python bindings + missing_path(bindings_dir.join("python"), create_dir)?.apply(|path| { + let lang_path = path.join(format!("tree_sitter_{}", language_name.to_snake_case())); + missing_path(&lang_path, create_dir)?; + + missing_path_else( + lang_path.join("binding.c"), + |path| generate_file(path, PY_BINDING_C_TEMPLATE, language_name), + |path| { + let binding_c = fs::read_to_string(path) + .with_context(|| "Failed to read bindings/python/binding.c")?; + if !binding_c.contains("PyCapsule_New") { + eprintln!("Replacing bindings/python/binding.c with new binding API"); + generate_file(path, PY_BINDING_C_TEMPLATE, language_name)?; + } + Ok(()) + }, + )?; + + missing_path(lang_path.join("__init__.py"), |path| { + generate_file(path, INIT_PY_TEMPLATE, language_name) + })?; + + missing_path(lang_path.join("__init__.pyi"), |path| { + generate_file(path, INIT_PYI_TEMPLATE, language_name) + })?; + + missing_path(lang_path.join("py.typed"), |path| { + generate_file(path, "", language_name) // py.typed is empty + })?; + + missing_path(path.join("tests"), create_dir)?.apply(|path| { + missing_path(path.join("test_binding.py"), |path| { + generate_file(path, TEST_BINDING_PY_TEMPLATE, language_name) + })?; + Ok(()) + })?; + + missing_path(repo_path.join("setup.py"), |path| { + generate_file(path, SETUP_PY_TEMPLATE, language_name) + })?; + + missing_path(repo_path.join("pyproject.toml"), |path| { + generate_file(path, PYPROJECT_TOML_TEMPLATE, dashed_language_name.as_str()) + })?; + + Ok(()) + })?; + + // Generate Swift bindings + missing_path(bindings_dir.join("swift"), create_dir)?.apply(|path| { + let lang_path = path.join(format!("TreeSitter{}", language_name.to_upper_camel_case())); + missing_path(&lang_path, create_dir)?; + + missing_path(lang_path.join(format!("{language_name}.h")), |path| { + generate_file(path, PARSER_NAME_H_TEMPLATE, language_name) + })?; + + missing_path( + path.join(format!( + "TreeSitter{}Tests", + language_name.to_upper_camel_case() + )), + create_dir, + )? + .apply(|path| { + missing_path( + path.join(format!( + "TreeSitter{}Tests.swift", + language_name.to_upper_camel_case() + )), + |path| generate_file(path, TESTS_SWIFT_TEMPLATE, language_name), + )?; + + Ok(()) + })?; + + missing_path(repo_path.join("Package.swift"), |path| { + generate_file(path, PACKAGE_SWIFT_TEMPLATE, language_name) + })?; + + Ok(()) + })?; + + Ok(()) +} + +pub fn lookup_package_json_for_path(path: &Path) -> Result<(PathBuf, PackageJSON)> { + let mut pathbuf = path.to_owned(); + loop { + let package_json = pathbuf + .exists() + .then(|| -> Result { + let file = + File::open(pathbuf.as_path()).with_context(|| "Failed to open package.json")?; + serde_json::from_reader(BufReader::new(file)).context( + "Failed to parse package.json, is the `tree-sitter` section malformed?", + ) + }) + .transpose()?; + if let Some(package_json) = package_json { + if package_json.tree_sitter.is_some() { + return Ok((pathbuf, package_json)); + } + } + pathbuf.pop(); // package.json + if !pathbuf.pop() { + return Err(anyhow!(concat!( + "Failed to locate a package.json file that has a \"tree-sitter\" section,", + " please ensure you have one, and if you don't then consult the docs", + ))); + } + pathbuf.push("package.json"); + } +} + +fn generate_file(path: &Path, template: &str, language_name: &str) -> Result<()> { + write_file( + path, + template + .replace( + CAMEL_PARSER_NAME_PLACEHOLDER, + &language_name.to_upper_camel_case(), + ) + .replace( + UPPER_PARSER_NAME_PLACEHOLDER, + &language_name.to_shouty_snake_case(), + ) + .replace( + LOWER_PARSER_NAME_PLACEHOLDER, + &language_name.to_snake_case(), + ) + .replace(PARSER_NAME_PLACEHOLDER, language_name) + .replace(CLI_VERSION_PLACEHOLDER, CLI_VERSION) + .replace(RUST_BINDING_VERSION_PLACEHOLDER, RUST_BINDING_VERSION), + ) +} + +fn create_dir(path: &Path) -> Result<()> { + fs::create_dir_all(path) + .with_context(|| format!("Failed to create {:?}", path.to_string_lossy())) +} + +#[derive(PartialEq, Eq, Debug)] +enum PathState

+where + P: AsRef, +{ + Exists(P), + Missing(P), +} + +#[allow(dead_code)] +impl

PathState

+where + P: AsRef, +{ + fn exists(&self, mut action: impl FnMut(&Path) -> Result<()>) -> Result<&Self> { + if let Self::Exists(path) = self { + action(path.as_ref())?; + } + Ok(self) + } + + fn missing(&self, mut action: impl FnMut(&Path) -> Result<()>) -> Result<&Self> { + if let Self::Missing(path) = self { + action(path.as_ref())?; + } + Ok(self) + } + + fn apply(&self, mut action: impl FnMut(&Path) -> Result<()>) -> Result<&Self> { + action(self.as_path())?; + Ok(self) + } + + fn apply_state(&self, mut action: impl FnMut(&Self) -> Result<()>) -> Result<&Self> { + action(self)?; + Ok(self) + } + + fn as_path(&self) -> &Path { + match self { + Self::Exists(path) | Self::Missing(path) => path.as_ref(), + } + } +} + +fn missing_path(path: P, mut action: F) -> Result> +where + P: AsRef, + F: FnMut(&Path) -> Result<()>, +{ + let path_ref = path.as_ref(); + if !path_ref.exists() { + action(path_ref)?; + Ok(PathState::Missing(path)) + } else { + Ok(PathState::Exists(path)) + } +} + +fn missing_path_else(path: P, mut action: T, mut else_action: F) -> Result> +where + P: AsRef, + T: FnMut(&Path) -> Result<()>, + F: FnMut(&Path) -> Result<()>, +{ + let path_ref = path.as_ref(); + if !path_ref.exists() { + action(path_ref)?; + Ok(PathState::Missing(path)) + } else { + else_action(path_ref)?; + Ok(PathState::Exists(path)) + } +} + +impl PackageJSON { + fn has_multiple_language_configs(&self) -> bool { + self.tree_sitter.as_ref().is_some_and(|c| c.len() > 1) + } +} diff --git a/crates/generate/src/grammars.rs b/cli/src/generate/grammars.rs similarity index 79% rename from crates/generate/src/grammars.rs rename to cli/src/generate/grammars.rs index c6e0acdd..1f3b9070 100644 --- a/crates/generate/src/grammars.rs +++ b/cli/src/generate/grammars.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, fmt}; use super::{ nfa::Nfa, - rules::{Alias, Associativity, Precedence, Rule, Symbol, TokenSet}, + rules::{Alias, Associativity, Precedence, Rule, Symbol}, }; #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] @@ -39,13 +39,6 @@ pub struct InputGrammar { pub variables_to_inline: Vec, pub supertype_symbols: Vec, pub word_token: Option, - pub reserved_words: Vec>, -} - -#[derive(Debug, Default, PartialEq, Eq)] -pub struct ReservedWordContext { - pub name: String, - pub reserved_words: Vec, } // Extracted lexical grammar @@ -73,20 +66,8 @@ pub struct ProductionStep { pub associativity: Option, pub alias: Option, pub field_name: Option, - pub reserved_word_set_id: ReservedWordSetId, } -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct ReservedWordSetId(pub usize); - -impl fmt::Display for ReservedWordSetId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} - -pub const NO_RESERVED_WORDS: ReservedWordSetId = ReservedWordSetId(usize::MAX); - #[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct Production { pub steps: Vec, @@ -123,44 +104,50 @@ pub struct SyntaxGrammar { pub variables_to_inline: Vec, pub word_token: Option, pub precedence_orderings: Vec>, - pub reserved_word_sets: Vec, } #[cfg(test)] impl ProductionStep { - #[must_use] - pub fn new(symbol: Symbol) -> Self { + pub const fn new(symbol: Symbol) -> Self { Self { symbol, precedence: Precedence::None, associativity: None, alias: None, field_name: None, - reserved_word_set_id: ReservedWordSetId::default(), } } - pub fn with_prec( - mut self, - precedence: Precedence, - associativity: Option, - ) -> Self { - self.precedence = precedence; - self.associativity = associativity; - self + pub fn with_prec(self, precedence: Precedence, associativity: Option) -> Self { + Self { + symbol: self.symbol, + precedence, + associativity, + alias: self.alias, + field_name: self.field_name, + } } - pub fn with_alias(mut self, value: &str, is_named: bool) -> Self { - self.alias = Some(Alias { - value: value.to_string(), - is_named, - }); - self + pub fn with_alias(self, value: &str, is_named: bool) -> Self { + Self { + symbol: self.symbol, + precedence: self.precedence, + associativity: self.associativity, + alias: Some(Alias { + value: value.to_string(), + is_named, + }), + field_name: self.field_name, + } } - - pub fn with_field_name(mut self, name: &str) -> Self { - self.field_name = Some(name.to_string()); - self + pub fn with_field_name(self, name: &str) -> Self { + Self { + symbol: self.symbol, + precedence: self.precedence, + associativity: self.associativity, + alias: self.alias, + field_name: Some(name.to_string()), + } } } @@ -253,7 +240,7 @@ impl InlinedProductionMap { step_index: u32, ) -> Option + 'a> { self.production_map - .get(&(std::ptr::from_ref::(production), step_index)) + .get(&(production as *const Production, step_index)) .map(|production_indices| { production_indices .iter() diff --git a/cli/src/generate/mod.rs b/cli/src/generate/mod.rs new file mode 100644 index 00000000..e2d2a966 --- /dev/null +++ b/cli/src/generate/mod.rs @@ -0,0 +1,273 @@ +use std::{ + env, fs, + io::Write, + path::{Path, PathBuf}, + process::{Command, Stdio}, +}; + +use anyhow::{anyhow, Context, Result}; +use build_tables::build_tables; +use grammar_files::path_in_ignore; +use grammars::InputGrammar; +use lazy_static::lazy_static; +use parse_grammar::parse_grammar; +use prepare_grammar::prepare_grammar; +use regex::{Regex, RegexBuilder}; +use render::render_c_code; +use semver::Version; + +mod build_tables; +mod dedup; +mod grammar_files; +mod grammars; +mod nfa; +mod node_types; +pub mod parse_grammar; +mod prepare_grammar; +mod render; +mod rules; +mod tables; + +pub use grammar_files::lookup_package_json_for_path; + +lazy_static! { + static ref JSON_COMMENT_REGEX: Regex = RegexBuilder::new("^\\s*//.*") + .multi_line(true) + .build() + .unwrap(); +} + +struct GeneratedParser { + c_code: String, + node_types_json: String, +} + +pub const ALLOC_HEADER: &str = include_str!("./templates/alloc.h"); + +pub fn generate_parser_in_directory( + repo_path: &Path, + grammar_path: Option<&str>, + abi_version: usize, + generate_bindings: bool, + report_symbol_name: Option<&str>, + js_runtime: Option<&str>, +) -> Result<()> { + let mut repo_path = repo_path.to_owned(); + let mut grammar_path = grammar_path; + + // Populate a new empty grammar directory. + if let Some(path) = grammar_path { + let path = PathBuf::from(path); + if !path + .try_exists() + .with_context(|| "Some error with specified path")? + { + fs::create_dir_all(&path)?; + grammar_path = None; + repo_path = path; + } + } + + let grammar_path = grammar_path + .map(PathBuf::from) + .unwrap_or(repo_path.join("grammar.js")); + + if repo_path.is_dir() && !grammar_path.exists() && !path_in_ignore(&repo_path) { + if let Some(dir_name) = repo_path + .file_name() + .map(|x| x.to_string_lossy().to_ascii_lowercase()) + { + if let Some(language_name) = dir_name + .strip_prefix("tree-sitter-") + .or_else(|| Some(dir_name.as_ref())) + { + grammar_files::generate_grammar_files(&repo_path, language_name, false)?; + } + } + } + + // Read the grammar file. + let grammar_json = load_grammar_file(&grammar_path, js_runtime)?; + + let src_path = repo_path.join("src"); + let header_path = src_path.join("tree_sitter"); + + // Ensure that the output directories exist. + fs::create_dir_all(&src_path)?; + fs::create_dir_all(&header_path)?; + + if grammar_path.file_name().unwrap() != "grammar.json" { + fs::write(src_path.join("grammar.json"), &grammar_json) + .with_context(|| format!("Failed to write grammar.json to {src_path:?}"))?; + } + + // Parse and preprocess the grammar. + let input_grammar = parse_grammar(&grammar_json)?; + + // Generate the parser and related files. + let GeneratedParser { + c_code, + node_types_json, + } = generate_parser_for_grammar_with_opts(&input_grammar, abi_version, report_symbol_name)?; + + write_file(&src_path.join("parser.c"), c_code)?; + write_file(&src_path.join("node-types.json"), node_types_json)?; + write_file(&header_path.join("alloc.h"), ALLOC_HEADER)?; + write_file(&header_path.join("array.h"), tree_sitter::ARRAY_HEADER)?; + write_file(&header_path.join("parser.h"), tree_sitter::PARSER_HEADER)?; + + if !path_in_ignore(&repo_path) && grammar_path == repo_path.join("grammar.js") { + grammar_files::generate_grammar_files(&repo_path, &input_grammar.name, generate_bindings)?; + } + + Ok(()) +} + +pub fn generate_parser_for_grammar(grammar_json: &str) -> Result<(String, String)> { + let grammar_json = JSON_COMMENT_REGEX.replace_all(grammar_json, "\n"); + let input_grammar = parse_grammar(&grammar_json)?; + let parser = + generate_parser_for_grammar_with_opts(&input_grammar, tree_sitter::LANGUAGE_VERSION, None)?; + Ok((input_grammar.name, parser.c_code)) +} + +fn generate_parser_for_grammar_with_opts( + input_grammar: &InputGrammar, + abi_version: usize, + report_symbol_name: Option<&str>, +) -> Result { + let (syntax_grammar, lexical_grammar, inlines, simple_aliases) = + prepare_grammar(input_grammar)?; + let variable_info = + node_types::get_variable_info(&syntax_grammar, &lexical_grammar, &simple_aliases)?; + let node_types_json = node_types::generate_node_types_json( + &syntax_grammar, + &lexical_grammar, + &simple_aliases, + &variable_info, + ); + let tables = build_tables( + &syntax_grammar, + &lexical_grammar, + &simple_aliases, + &variable_info, + &inlines, + report_symbol_name, + )?; + let c_code = render_c_code( + &input_grammar.name, + tables, + syntax_grammar, + lexical_grammar, + simple_aliases, + abi_version, + ); + Ok(GeneratedParser { + c_code, + node_types_json: serde_json::to_string_pretty(&node_types_json).unwrap(), + }) +} + +pub fn load_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> Result { + if grammar_path.is_dir() { + return Err(anyhow!( + "Path to a grammar file with `.js` or `.json` extension is required" + )); + } + match grammar_path.extension().and_then(|e| e.to_str()) { + Some("js") => Ok(load_js_grammar_file(grammar_path, js_runtime) + .with_context(|| "Failed to load grammar.js")?), + Some("json") => { + Ok(fs::read_to_string(grammar_path).with_context(|| "Failed to load grammar.json")?) + } + _ => Err(anyhow!("Unknown grammar file extension: {grammar_path:?}",)), + } +} + +fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> Result { + let grammar_path = fs::canonicalize(grammar_path)?; + + #[cfg(windows)] + let grammar_path = url::Url::from_file_path(grammar_path) + .expect("Failed to convert path to URL") + .to_string(); + + let js_runtime = js_runtime.unwrap_or("node"); + + let mut js_command = Command::new(js_runtime); + match js_runtime { + "node" => { + js_command.args(["--input-type=module", "-"]); + } + "bun" => { + js_command.arg("-"); + } + "deno" => { + js_command.args(["run", "--allow-all", "-"]); + } + _ => {} + } + + let mut js_process = js_command + .env("TREE_SITTER_GRAMMAR_PATH", grammar_path) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .with_context(|| format!("Failed to run `{js_runtime}`"))?; + + let mut js_stdin = js_process + .stdin + .take() + .with_context(|| format!("Failed to open stdin for {js_runtime}"))?; + let cli_version = Version::parse(env!("CARGO_PKG_VERSION")) + .with_context(|| "Could not parse this package's version as semver.")?; + write!( + js_stdin, + "globalThis.TREE_SITTER_CLI_VERSION_MAJOR = {}; + globalThis.TREE_SITTER_CLI_VERSION_MINOR = {}; + globalThis.TREE_SITTER_CLI_VERSION_PATCH = {};", + cli_version.major, cli_version.minor, cli_version.patch, + ) + .with_context(|| format!("Failed to write tree-sitter version to {js_runtime}'s stdin"))?; + js_stdin + .write(include_bytes!("./dsl.js")) + .with_context(|| format!("Failed to write grammar dsl to {js_runtime}'s stdin"))?; + drop(js_stdin); + + let output = js_process + .wait_with_output() + .with_context(|| format!("Failed to read output from {js_runtime}"))?; + match output.status.code() { + None => panic!("{js_runtime} process was killed"), + Some(0) => { + let stdout = String::from_utf8(output.stdout) + .with_context(|| format!("Got invalid UTF8 from {js_runtime}"))?; + + let mut grammar_json = &stdout[..]; + + if let Some(pos) = stdout.rfind('\n') { + // If there's a newline, split the last line from the rest of the output + let node_output = &stdout[..pos]; + grammar_json = &stdout[pos + 1..]; + + let mut stdout = std::io::stdout().lock(); + stdout.write_all(node_output.as_bytes())?; + stdout.write_all(b"\n")?; + stdout.flush()?; + } + + Ok(serde_json::to_string_pretty( + &serde_json::from_str::(grammar_json) + .with_context(|| "Failed to parse grammar JSON")?, + ) + .with_context(|| "Failed to serialize grammar JSON")? + + "\n") + } + Some(code) => Err(anyhow!("{js_runtime} process exited with status {code}")), + } +} + +fn write_file(path: &Path, body: impl AsRef<[u8]>) -> Result<()> { + fs::write(path, body) + .with_context(|| format!("Failed to write {:?}", path.file_name().unwrap())) +} diff --git a/crates/generate/src/nfa.rs b/cli/src/generate/nfa.rs similarity index 97% rename from crates/generate/src/nfa.rs rename to cli/src/generate/nfa.rs index eecbc40b..6f0e1ee8 100644 --- a/crates/generate/src/nfa.rs +++ b/cli/src/generate/nfa.rs @@ -58,8 +58,7 @@ impl CharacterSet { /// Create a character set with a given *inclusive* range of characters. #[allow(clippy::single_range_in_vec_init)] - #[cfg(test)] - fn from_range(mut first: char, mut last: char) -> Self { + pub fn from_range(mut first: char, mut last: char) -> Self { if first > last { swap(&mut first, &mut last); } @@ -287,8 +286,7 @@ impl CharacterSet { /// Produces a `CharacterSet` containing every character that is in _exactly one_ of `self` or /// `other`, but is not present in both sets. - #[cfg(test)] - fn symmetric_difference(mut self, mut other: Self) -> Self { + pub fn symmetric_difference(mut self, mut other: Self) -> Self { self.remove_intersection(&mut other); self.add(&other) } @@ -363,9 +361,9 @@ impl CharacterSet { }) { Ok(ix) | Err(ix) => ix, }; - self.ranges - .get(ix) - .is_some_and(|range| range.start <= seek_range.start && range.end >= seek_range.end) + self.ranges.get(ix).map_or(false, |range| { + range.start <= seek_range.start && range.end >= seek_range.end + }) } pub fn contains(&self, c: char) -> bool { @@ -428,13 +426,11 @@ impl fmt::Debug for CharacterSet { } impl Nfa { - #[must_use] pub const fn new() -> Self { Self { states: Vec::new() } } pub fn last_state_id(&self) -> u32 { - assert!(!self.states.is_empty()); self.states.len() as u32 - 1 } } @@ -950,19 +946,20 @@ mod tests { assert_eq!( left.remove_intersection(&mut right), row.intersection, - "row {i}a: {:?} && {:?}", + "row {}a: {:?} && {:?}", + i, row.left, row.right ); assert_eq!( left, row.left_only, - "row {i}a: {:?} - {:?}", - row.left, row.right + "row {}a: {:?} - {:?}", + i, row.left, row.right ); assert_eq!( right, row.right_only, - "row {i}a: {:?} - {:?}", - row.right, row.left + "row {}a: {:?} - {:?}", + i, row.right, row.left ); let mut left = row.left.clone(); @@ -970,25 +967,27 @@ mod tests { assert_eq!( right.remove_intersection(&mut left), row.intersection, - "row {i}b: {:?} && {:?}", + "row {}b: {:?} && {:?}", + i, row.left, row.right ); assert_eq!( left, row.left_only, - "row {i}b: {:?} - {:?}", - row.left, row.right + "row {}b: {:?} - {:?}", + i, row.left, row.right ); assert_eq!( right, row.right_only, - "row {i}b: {:?} - {:?}", - row.right, row.left + "row {}b: {:?} - {:?}", + i, row.right, row.left ); assert_eq!( row.left.clone().difference(row.right.clone()), row.left_only, - "row {i}b: {:?} -- {:?}", + "row {}b: {:?} -- {:?}", + i, row.left, row.right ); diff --git a/crates/generate/src/node_types.rs b/cli/src/generate/node_types.rs similarity index 86% rename from crates/generate/src/node_types.rs rename to cli/src/generate/node_types.rs index 2dde0c49..0ac159cd 100644 --- a/crates/generate/src/node_types.rs +++ b/cli/src/generate/node_types.rs @@ -1,7 +1,10 @@ -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::{ + cmp::Ordering, + collections::{BTreeMap, HashMap, HashSet}, +}; +use anyhow::{anyhow, Result}; use serde::Serialize; -use thiserror::Error; use super::{ grammars::{LexicalGrammar, SyntaxGrammar, VariableType}, @@ -29,15 +32,12 @@ pub struct VariableInfo { } #[derive(Debug, Serialize, PartialEq, Eq, Default, PartialOrd, Ord)] -#[cfg(feature = "load")] pub struct NodeInfoJSON { #[serde(rename = "type")] kind: String, named: bool, #[serde(skip_serializing_if = "std::ops::Not::not")] root: bool, - #[serde(skip_serializing_if = "std::ops::Not::not")] - extra: bool, #[serde(skip_serializing_if = "Option::is_none")] fields: Option>, #[serde(skip_serializing_if = "Option::is_none")] @@ -47,7 +47,6 @@ pub struct NodeInfoJSON { } #[derive(Clone, Debug, Serialize, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg(feature = "load")] pub struct NodeTypeJSON { #[serde(rename = "type")] kind: String, @@ -55,7 +54,6 @@ pub struct NodeTypeJSON { } #[derive(Debug, Serialize, PartialEq, Eq, PartialOrd, Ord)] -#[cfg(feature = "load")] pub struct FieldInfoJSON { multiple: bool, required: bool, @@ -69,7 +67,6 @@ pub struct ChildQuantity { multiple: bool, } -#[cfg(feature = "load")] impl Default for FieldInfoJSON { fn default() -> Self { Self { @@ -105,7 +102,7 @@ impl ChildQuantity { } } - const fn append(&mut self, other: Self) { + fn append(&mut self, other: Self) { if other.exists { if self.exists || other.multiple { self.multiple = true; @@ -117,7 +114,7 @@ impl ChildQuantity { } } - const fn union(&mut self, other: Self) -> bool { + fn union(&mut self, other: Self) -> bool { let mut result = false; if !self.exists && other.exists { result = true; @@ -135,14 +132,6 @@ impl ChildQuantity { } } -pub type VariableInfoResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum VariableInfoError { - #[error("Grammar error: Supertype symbols must always have a single visible child, but `{0}` can have multiple")] - InvalidSupertype(String), -} - /// Compute a summary of the public-facing structure of each variable in the /// grammar. Each variable in the grammar corresponds to a distinct public-facing /// node type. @@ -168,7 +157,7 @@ pub fn get_variable_info( syntax_grammar: &SyntaxGrammar, lexical_grammar: &LexicalGrammar, default_aliases: &AliasMap, -) -> VariableInfoResult> { +) -> Result> { let child_type_is_visible = |t: &ChildType| { variable_type_for_child_type(t, syntax_grammar, lexical_grammar) >= VariableType::Anonymous }; @@ -349,7 +338,13 @@ pub fn get_variable_info( for supertype_symbol in &syntax_grammar.supertype_symbols { if result[supertype_symbol.index].has_multi_step_production { let variable = &syntax_grammar.variables[supertype_symbol.index]; - Err(VariableInfoError::InvalidSupertype(variable.name.clone()))?; + return Err(anyhow!( + concat!( + "Grammar error: Supertype symbols must always ", + "have a single visible child, but `{}` can have multiple" + ), + variable.name + )); } } @@ -374,105 +369,12 @@ pub fn get_variable_info( Ok(result) } -fn get_aliases_by_symbol( - syntax_grammar: &SyntaxGrammar, - default_aliases: &AliasMap, -) -> HashMap>> { - let mut aliases_by_symbol = HashMap::new(); - for (symbol, alias) in default_aliases { - aliases_by_symbol.insert(*symbol, { - let mut aliases = BTreeSet::new(); - aliases.insert(Some(alias.clone())); - aliases - }); - } - for extra_symbol in &syntax_grammar.extra_symbols { - if !default_aliases.contains_key(extra_symbol) { - aliases_by_symbol - .entry(*extra_symbol) - .or_insert_with(BTreeSet::new) - .insert(None); - } - } - for variable in &syntax_grammar.variables { - for production in &variable.productions { - for step in &production.steps { - aliases_by_symbol - .entry(step.symbol) - .or_insert_with(BTreeSet::new) - .insert( - step.alias - .as_ref() - .or_else(|| default_aliases.get(&step.symbol)) - .cloned(), - ); - } - } - } - aliases_by_symbol.insert( - Symbol::non_terminal(0), - std::iter::once(&None).cloned().collect(), - ); - aliases_by_symbol -} - -pub fn get_supertype_symbol_map( - syntax_grammar: &SyntaxGrammar, - default_aliases: &AliasMap, - variable_info: &[VariableInfo], -) -> BTreeMap> { - let aliases_by_symbol = get_aliases_by_symbol(syntax_grammar, default_aliases); - let mut supertype_symbol_map = BTreeMap::new(); - - let mut symbols_by_alias = HashMap::new(); - for (symbol, aliases) in &aliases_by_symbol { - for alias in aliases.iter().flatten() { - symbols_by_alias - .entry(alias) - .or_insert_with(Vec::new) - .push(*symbol); - } - } - - for (i, info) in variable_info.iter().enumerate() { - let symbol = Symbol::non_terminal(i); - if syntax_grammar.supertype_symbols.contains(&symbol) { - let subtypes = info.children.types.clone(); - supertype_symbol_map.insert(symbol, subtypes); - } - } - supertype_symbol_map -} - -#[cfg(feature = "load")] -pub type SuperTypeCycleResult = Result; - -#[derive(Debug, Error, Serialize)] -pub struct SuperTypeCycleError { - items: Vec, -} - -impl std::fmt::Display for SuperTypeCycleError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Dependency cycle detected in node types:")?; - for (i, item) in self.items.iter().enumerate() { - write!(f, " {item}")?; - if i < self.items.len() - 1 { - write!(f, ",")?; - } - } - - Ok(()) - } -} - -#[cfg(feature = "load")] pub fn generate_node_types_json( syntax_grammar: &SyntaxGrammar, lexical_grammar: &LexicalGrammar, default_aliases: &AliasMap, variable_info: &[VariableInfo], -) -> SuperTypeCycleResult> { +) -> Vec { let mut node_types_json = BTreeMap::new(); let child_type_to_node_type = |child_type: &ChildType| match child_type { @@ -528,32 +430,41 @@ pub fn generate_node_types_json( } }; - let aliases_by_symbol = get_aliases_by_symbol(syntax_grammar, default_aliases); - - let empty = BTreeSet::new(); - let extra_names = syntax_grammar - .extra_symbols - .iter() - .flat_map(|symbol| { + let mut aliases_by_symbol = HashMap::new(); + for (symbol, alias) in default_aliases { + aliases_by_symbol.insert(*symbol, { + let mut aliases = HashSet::new(); + aliases.insert(Some(alias.clone())); + aliases + }); + } + for extra_symbol in &syntax_grammar.extra_symbols { + if !default_aliases.contains_key(extra_symbol) { aliases_by_symbol - .get(symbol) - .unwrap_or(&empty) - .iter() - .map(|alias| { - alias.as_ref().map_or( - match symbol.kind { - SymbolType::NonTerminal => &syntax_grammar.variables[symbol.index].name, - SymbolType::Terminal => &lexical_grammar.variables[symbol.index].name, - SymbolType::External => { - &syntax_grammar.external_tokens[symbol.index].name - } - _ => unreachable!(), - }, - |alias| &alias.value, - ) - }) - }) - .collect::>(); + .entry(*extra_symbol) + .or_insert_with(HashSet::new) + .insert(None); + } + } + for variable in &syntax_grammar.variables { + for production in &variable.productions { + for step in &production.steps { + aliases_by_symbol + .entry(step.symbol) + .or_insert_with(HashSet::new) + .insert( + step.alias + .as_ref() + .or_else(|| default_aliases.get(&step.symbol)) + .cloned(), + ); + } + } + } + aliases_by_symbol.insert( + Symbol::non_terminal(0), + std::iter::once(&None).cloned().collect(), + ); let mut subtype_map = Vec::new(); for (i, info) in variable_info.iter().enumerate() { @@ -567,7 +478,6 @@ pub fn generate_node_types_json( kind: variable.name.clone(), named: true, root: false, - extra: extra_names.contains(&variable.name), fields: None, children: None, subtypes: None, @@ -589,7 +499,10 @@ pub fn generate_node_types_json( } else if !syntax_grammar.variables_to_inline.contains(&symbol) { // If a rule is aliased under multiple names, then its information // contributes to multiple entries in the final JSON. - for alias in aliases_by_symbol.get(&symbol).unwrap_or(&BTreeSet::new()) { + for alias in aliases_by_symbol + .get(&Symbol::non_terminal(i)) + .unwrap_or(&HashSet::new()) + { let kind; let is_named; if let Some(alias) = alias { @@ -611,7 +524,6 @@ pub fn generate_node_types_json( kind: kind.clone(), named: is_named, root: i == 0, - extra: extra_names.contains(&kind), fields: Some(BTreeMap::new()), children: None, subtypes: None, @@ -650,40 +562,22 @@ pub fn generate_node_types_json( } } - // Sort the subtype map topologically so that subtypes are listed before their supertypes. - let mut sorted_kinds = Vec::with_capacity(subtype_map.len()); - let mut top_sort = topological_sort::TopologicalSort::::new(); - for (supertype, subtypes) in &subtype_map { - for subtype in subtypes { - top_sort.add_dependency(subtype.kind.clone(), supertype.kind.clone()); - } - } - loop { - let mut next_kinds = top_sort.pop_all(); - match (next_kinds.is_empty(), top_sort.is_empty()) { - (true, true) => break, - (true, false) => { - let mut items = top_sort.collect::>(); - items.sort(); - return Err(SuperTypeCycleError { items }); - } - (false, _) => { - next_kinds.sort(); - sorted_kinds.extend(next_kinds); - } - } - } + // Sort the subtype map so that subtypes are listed before their supertypes. subtype_map.sort_by(|a, b| { - let a_idx = sorted_kinds.iter().position(|n| n.eq(&a.0.kind)).unwrap(); - let b_idx = sorted_kinds.iter().position(|n| n.eq(&b.0.kind)).unwrap(); - a_idx.cmp(&b_idx) + if b.1.contains(&a.0) { + Ordering::Less + } else if a.1.contains(&b.0) { + Ordering::Greater + } else { + Ordering::Equal + } }); for node_type_json in node_types_json.values_mut() { if node_type_json .children .as_ref() - .is_some_and(|c| c.types.is_empty()) + .map_or(false, |c| c.types.is_empty()) { node_type_json.children = None; } @@ -700,6 +594,7 @@ pub fn generate_node_types_json( let mut anonymous_node_types = Vec::new(); + let empty = HashSet::new(); let regular_tokens = lexical_grammar .variables .iter() @@ -744,7 +639,6 @@ pub fn generate_node_types_json( kind: name.clone(), named: true, root: false, - extra: extra_names.contains(&name), fields: None, children: None, subtypes: None, @@ -762,7 +656,6 @@ pub fn generate_node_types_json( kind: name.clone(), named: false, root: false, - extra: extra_names.contains(&name), fields: None, children: None, subtypes: None, @@ -783,15 +676,11 @@ pub fn generate_node_types_json( a_is_leaf.cmp(&b_is_leaf) }) .then_with(|| a.kind.cmp(&b.kind)) - .then_with(|| a.named.cmp(&b.named)) - .then_with(|| a.root.cmp(&b.root)) - .then_with(|| a.extra.cmp(&b.extra)) }); result.dedup(); - Ok(result) + result } -#[cfg(feature = "load")] fn process_supertypes(info: &mut FieldInfoJSON, subtype_map: &[(NodeTypeJSON, Vec)]) { for (supertype, subtypes) in subtype_map { if info.types.contains(supertype) { @@ -828,20 +717,20 @@ fn extend_sorted<'a, T>(vec: &mut Vec, values: impl IntoIterator>(), @@ -1740,7 +1487,6 @@ mod tests { kind: "b".to_string(), named: true, root: false, - extra: false, subtypes: None, children: Some(FieldInfoJSON { multiple: true, @@ -2055,7 +1801,7 @@ mod tests { ); } - fn get_node_types(grammar: &InputGrammar) -> SuperTypeCycleResult> { + fn get_node_types(grammar: &InputGrammar) -> Vec { let (syntax_grammar, lexical_grammar, _, default_aliases) = prepare_grammar(grammar).unwrap(); let variable_info = diff --git a/cli/src/generate/parse_grammar.rs b/cli/src/generate/parse_grammar.rs new file mode 100644 index 00000000..e801d531 --- /dev/null +++ b/cli/src/generate/parse_grammar.rs @@ -0,0 +1,258 @@ +use anyhow::{anyhow, Result}; +use serde::Deserialize; +use serde_json::{Map, Value}; + +use super::{ + grammars::{InputGrammar, PrecedenceEntry, Variable, VariableType}, + rules::{Precedence, Rule}, +}; + +#[derive(Deserialize)] +#[serde(tag = "type")] +#[allow(non_camel_case_types)] +#[allow(clippy::upper_case_acronyms)] +enum RuleJSON { + ALIAS { + content: Box, + named: bool, + value: String, + }, + BLANK, + STRING { + value: String, + }, + PATTERN { + value: String, + flags: Option, + }, + SYMBOL { + name: String, + }, + CHOICE { + members: Vec, + }, + FIELD { + name: String, + content: Box, + }, + SEQ { + members: Vec, + }, + REPEAT { + content: Box, + }, + REPEAT1 { + content: Box, + }, + PREC_DYNAMIC { + value: i32, + content: Box, + }, + PREC_LEFT { + value: PrecedenceValueJSON, + content: Box, + }, + PREC_RIGHT { + value: PrecedenceValueJSON, + content: Box, + }, + PREC { + value: PrecedenceValueJSON, + content: Box, + }, + TOKEN { + content: Box, + }, + IMMEDIATE_TOKEN { + content: Box, + }, +} + +#[derive(Deserialize)] +#[serde(untagged)] +enum PrecedenceValueJSON { + Integer(i32), + Name(String), +} + +#[derive(Deserialize)] +pub(crate) struct GrammarJSON { + pub(crate) name: String, + rules: Map, + #[serde(default)] + precedences: Vec>, + #[serde(default)] + conflicts: Vec>, + #[serde(default)] + externals: Vec, + #[serde(default)] + extras: Vec, + #[serde(default)] + inline: Vec, + #[serde(default)] + supertypes: Vec, + word: Option, +} + +pub(crate) fn parse_grammar(input: &str) -> Result { + let grammar_json = serde_json::from_str::(input)?; + + let mut variables = Vec::with_capacity(grammar_json.rules.len()); + for (name, value) in grammar_json.rules { + variables.push(Variable { + name: name.clone(), + kind: VariableType::Named, + rule: parse_rule(serde_json::from_value(value)?), + }); + } + + let mut precedence_orderings = Vec::with_capacity(grammar_json.precedences.len()); + for list in grammar_json.precedences { + let mut ordering = Vec::with_capacity(list.len()); + for entry in list { + ordering.push(match entry { + RuleJSON::STRING { value } => PrecedenceEntry::Name(value), + RuleJSON::SYMBOL { name } => PrecedenceEntry::Symbol(name), + _ => { + return Err(anyhow!( + "Invalid rule in precedences array. Only strings and symbols are allowed" + )) + } + }); + } + precedence_orderings.push(ordering); + } + + let extra_symbols = grammar_json + .extras + .into_iter() + .try_fold(Vec::new(), |mut acc, item| { + let rule = parse_rule(item); + if let Rule::String(ref value) = rule { + if value.is_empty() { + return Err(anyhow!( + "Rules in the `extras` array must not contain empty strings" + )); + } + } + acc.push(rule); + Ok(acc) + })?; + + let external_tokens = grammar_json.externals.into_iter().map(parse_rule).collect(); + + Ok(InputGrammar { + name: grammar_json.name, + word_token: grammar_json.word, + expected_conflicts: grammar_json.conflicts, + supertype_symbols: grammar_json.supertypes, + variables_to_inline: grammar_json.inline, + precedence_orderings, + variables, + extra_symbols, + external_tokens, + }) +} + +fn parse_rule(json: RuleJSON) -> Rule { + match json { + RuleJSON::ALIAS { + content, + value, + named, + } => Rule::alias(parse_rule(*content), value, named), + RuleJSON::BLANK => Rule::Blank, + RuleJSON::STRING { value } => Rule::String(value), + RuleJSON::PATTERN { value, flags } => Rule::Pattern( + value, + flags.map_or(String::new(), |f| { + f.matches(|c| { + if c == 'i' { + true + } else { + // silently ignore unicode flags + if c != 'u' && c != 'v' { + eprintln!("Warning: unsupported flag {c}"); + } + false + } + }) + .collect() + }), + ), + RuleJSON::SYMBOL { name } => Rule::NamedSymbol(name), + RuleJSON::CHOICE { members } => Rule::choice(members.into_iter().map(parse_rule).collect()), + RuleJSON::FIELD { content, name } => Rule::field(name, parse_rule(*content)), + RuleJSON::SEQ { members } => Rule::seq(members.into_iter().map(parse_rule).collect()), + RuleJSON::REPEAT1 { content } => Rule::repeat(parse_rule(*content)), + RuleJSON::REPEAT { content } => { + Rule::choice(vec![Rule::repeat(parse_rule(*content)), Rule::Blank]) + } + RuleJSON::PREC { value, content } => Rule::prec(value.into(), parse_rule(*content)), + RuleJSON::PREC_LEFT { value, content } => { + Rule::prec_left(value.into(), parse_rule(*content)) + } + RuleJSON::PREC_RIGHT { value, content } => { + Rule::prec_right(value.into(), parse_rule(*content)) + } + RuleJSON::PREC_DYNAMIC { value, content } => { + Rule::prec_dynamic(value, parse_rule(*content)) + } + RuleJSON::TOKEN { content } => Rule::token(parse_rule(*content)), + RuleJSON::IMMEDIATE_TOKEN { content } => Rule::immediate_token(parse_rule(*content)), + } +} + +impl From for Precedence { + fn from(val: PrecedenceValueJSON) -> Self { + match val { + PrecedenceValueJSON::Integer(i) => Self::Integer(i), + PrecedenceValueJSON::Name(i) => Self::Name(i), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_grammar() { + let grammar = parse_grammar( + r#"{ + "name": "my_lang", + "rules": { + "file": { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "statement" + } + }, + "statement": { + "type": "STRING", + "value": "foo" + } + } + }"#, + ) + .unwrap(); + + assert_eq!(grammar.name, "my_lang"); + assert_eq!( + grammar.variables, + vec![ + Variable { + name: "file".to_string(), + kind: VariableType::Named, + rule: Rule::repeat(Rule::NamedSymbol("statement".to_string())) + }, + Variable { + name: "statement".to_string(), + kind: VariableType::Named, + rule: Rule::String("foo".to_string()) + }, + ] + ); + } +} diff --git a/crates/generate/src/prepare_grammar/expand_repeats.rs b/cli/src/generate/prepare_grammar/expand_repeats.rs similarity index 99% rename from crates/generate/src/prepare_grammar/expand_repeats.rs rename to cli/src/generate/prepare_grammar/expand_repeats.rs index 509ea4f2..4b97e53c 100644 --- a/crates/generate/src/prepare_grammar/expand_repeats.rs +++ b/cli/src/generate/prepare_grammar/expand_repeats.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, mem}; use super::ExtractedSyntaxGrammar; -use crate::{ +use crate::generate::{ grammars::{Variable, VariableType}, rules::{Rule, Symbol}, }; diff --git a/crates/generate/src/prepare_grammar/expand_tokens.rs b/cli/src/generate/prepare_grammar/expand_tokens.rs similarity index 64% rename from crates/generate/src/prepare_grammar/expand_tokens.rs rename to cli/src/generate/prepare_grammar/expand_tokens.rs index acfb9ba3..a11f9ad9 100644 --- a/crates/generate/src/prepare_grammar/expand_tokens.rs +++ b/cli/src/generate/prepare_grammar/expand_tokens.rs @@ -1,57 +1,41 @@ -use regex_syntax::{ - hir::{Class, Hir, HirKind}, - ParserBuilder, +use std::collections::HashMap; + +use anyhow::{anyhow, Context, Result}; +use lazy_static::lazy_static; +use regex_syntax::ast::{ + parse, Ast, ClassPerlKind, ClassSet, ClassSetBinaryOpKind, ClassSetItem, ClassUnicodeKind, + RepetitionKind, RepetitionRange, }; -use serde::Serialize; -use thiserror::Error; use super::ExtractedLexicalGrammar; -use crate::{ +use crate::generate::{ grammars::{LexicalGrammar, LexicalVariable}, nfa::{CharacterSet, Nfa, NfaState}, rules::{Precedence, Rule}, }; +lazy_static! { + static ref UNICODE_CATEGORIES: HashMap<&'static str, Vec> = + serde_json::from_str(UNICODE_CATEGORIES_JSON).unwrap(); + static ref UNICODE_PROPERTIES: HashMap<&'static str, Vec> = + serde_json::from_str(UNICODE_PROPERTIES_JSON).unwrap(); + static ref UNICODE_CATEGORY_ALIASES: HashMap<&'static str, String> = + serde_json::from_str(UNICODE_CATEGORY_ALIASES_JSON).unwrap(); + static ref UNICODE_PROPERTY_ALIASES: HashMap<&'static str, String> = + serde_json::from_str(UNICODE_PROPERTY_ALIASES_JSON).unwrap(); +} + +const UNICODE_CATEGORIES_JSON: &str = include_str!("./unicode-categories.json"); +const UNICODE_PROPERTIES_JSON: &str = include_str!("./unicode-properties.json"); +const UNICODE_CATEGORY_ALIASES_JSON: &str = include_str!("./unicode-category-aliases.json"); +const UNICODE_PROPERTY_ALIASES_JSON: &str = include_str!("./unicode-property-aliases.json"); + struct NfaBuilder { nfa: Nfa, is_sep: bool, precedence_stack: Vec, } -pub type ExpandTokensResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ExpandTokensError { - #[error( - "The rule `{0}` matches the empty string. -Tree-sitter does not support syntactic rules that match the empty string -unless they are used only as the grammar's start rule. -" - )] - EmptyString(String), - #[error(transparent)] - Processing(ExpandTokensProcessingError), - #[error(transparent)] - ExpandRule(ExpandRuleError), -} - -#[derive(Debug, Error, Serialize)] -pub struct ExpandTokensProcessingError { - rule: String, - error: ExpandRuleError, -} - -impl std::fmt::Display for ExpandTokensProcessingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!( - f, - "Error processing rule {}: Grammar error: Unexpected rule {:?}", - self.rule, self.error - )?; - Ok(()) - } -} - fn get_implicit_precedence(rule: &Rule) -> i32 { match rule { Rule::String(_) => 2, @@ -75,7 +59,7 @@ const fn get_completion_precedence(rule: &Rule) -> i32 { 0 } -pub fn expand_tokens(mut grammar: ExtractedLexicalGrammar) -> ExpandTokensResult { +pub fn expand_tokens(mut grammar: ExtractedLexicalGrammar) -> Result { let mut builder = NfaBuilder { nfa: Nfa::new(), is_sep: true, @@ -89,12 +73,8 @@ pub fn expand_tokens(mut grammar: ExtractedLexicalGrammar) -> ExpandTokensResult Rule::repeat(Rule::choice(grammar.separators)) }; - let mut variables = Vec::with_capacity(grammar.variables.len()); + let mut variables = Vec::new(); for (i, variable) in grammar.variables.into_iter().enumerate() { - if variable.rule.is_empty() { - Err(ExpandTokensError::EmptyString(variable.name.clone()))?; - } - let is_immediate_token = match &variable.rule { Rule::Metadata { params, .. } => params.is_main_token, _ => false, @@ -108,19 +88,12 @@ pub fn expand_tokens(mut grammar: ExtractedLexicalGrammar) -> ExpandTokensResult let last_state_id = builder.nfa.last_state_id(); builder .expand_rule(&variable.rule, last_state_id) - .map_err(|e| { - ExpandTokensError::Processing(ExpandTokensProcessingError { - rule: variable.name.clone(), - error: e, - }) - })?; + .with_context(|| format!("Error processing rule {}", variable.name))?; if !is_immediate_token { builder.is_sep = true; let last_state_id = builder.nfa.last_state_id(); - builder - .expand_rule(&separator_rule, last_state_id) - .map_err(ExpandTokensError::ExpandRule)?; + builder.expand_rule(&separator_rule, last_state_id)?; } variables.push(LexicalVariable { @@ -137,64 +110,22 @@ pub fn expand_tokens(mut grammar: ExtractedLexicalGrammar) -> ExpandTokensResult }) } -pub type ExpandRuleResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ExpandRuleError { - #[error("Grammar error: Unexpected rule {0:?}")] - UnexpectedRule(Rule), - #[error("{0}")] - Parse(String), - #[error(transparent)] - ExpandRegex(ExpandRegexError), -} - -pub type ExpandRegexResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ExpandRegexError { - #[error("{0}")] - Utf8(String), - #[error("Regex error: Assertions are not supported")] - Assertion, -} - impl NfaBuilder { - fn expand_rule(&mut self, rule: &Rule, mut next_state_id: u32) -> ExpandRuleResult { + fn expand_rule(&mut self, rule: &Rule, mut next_state_id: u32) -> Result { match rule { Rule::Pattern(s, f) => { - // With unicode enabled, `\w`, `\s` and `\d` expand to character sets that are much - // larger than intended, so we replace them with the actual - // character sets they should represent. If the full unicode range - // of `\w`, `\s` or `\d` are needed then `\p{L}`, `\p{Z}` and `\p{N}` should be - // used. - let s = s - .replace(r"\w", r"[0-9A-Za-z_]") - .replace(r"\s", r"[\t-\r ]") - .replace(r"\d", r"[0-9]") - .replace(r"\W", r"[^0-9A-Za-z_]") - .replace(r"\S", r"[^\t-\r ]") - .replace(r"\D", r"[^0-9]"); - let mut parser = ParserBuilder::new() - .case_insensitive(f.contains('i')) - .unicode(true) - .utf8(false) - .build(); - let hir = parser - .parse(&s) - .map_err(|e| ExpandRuleError::Parse(e.to_string()))?; - self.expand_regex(&hir, next_state_id) - .map_err(ExpandRuleError::ExpandRegex) + let ast = parse::Parser::new().parse(s)?; + self.expand_regex(&ast, next_state_id, f.contains('i')) } Rule::String(s) => { for c in s.chars().rev() { - self.push_advance(CharacterSet::from_char(c), next_state_id); + self.push_advance(CharacterSet::empty().add_char(c), next_state_id); next_state_id = self.nfa.last_state_id(); } Ok(!s.is_empty()) } Rule::Choice(elements) => { - let mut alternative_state_ids = Vec::with_capacity(elements.len()); + let mut alternative_state_ids = Vec::new(); for element in elements { if self.expand_rule(element, next_state_id)? { alternative_state_ids.push(self.nfa.last_state_id()); @@ -248,98 +179,129 @@ impl NfaBuilder { result } Rule::Blank => Ok(false), - _ => Err(ExpandRuleError::UnexpectedRule(rule.clone()))?, + _ => Err(anyhow!("Grammar error: Unexpected rule {rule:?}")), } } - fn expand_regex(&mut self, hir: &Hir, mut next_state_id: u32) -> ExpandRegexResult { - match hir.kind() { - HirKind::Empty => Ok(false), - HirKind::Literal(literal) => { - for character in std::str::from_utf8(&literal.0) - .map_err(|e| ExpandRegexError::Utf8(e.to_string()))? - .chars() - .rev() - { - let char_set = CharacterSet::from_char(character); - self.push_advance(char_set, next_state_id); - next_state_id = self.nfa.last_state_id(); - } + fn expand_regex( + &mut self, + ast: &Ast, + mut next_state_id: u32, + case_insensitive: bool, + ) -> Result { + const fn inverse_char(c: char) -> char { + match c { + 'a'..='z' => (c as u8 - b'a' + b'A') as char, + 'A'..='Z' => (c as u8 - b'A' + b'a') as char, + c => c, + } + } + fn with_inverse_char(mut chars: CharacterSet) -> CharacterSet { + for char in chars.clone().chars() { + let inverted = inverse_char(char); + if char != inverted { + chars = chars.add_char(inverted); + } + } + chars + } + + match ast { + Ast::Empty(_) => Ok(false), + Ast::Flags(_) => Err(anyhow!("Regex error: Flags are not supported")), + Ast::Literal(literal) => { + let mut char_set = CharacterSet::from_char(literal.c); + if case_insensitive { + let inverted = inverse_char(literal.c); + if literal.c != inverted { + char_set = char_set.add_char(inverted); + } + } + self.push_advance(char_set, next_state_id); Ok(true) } - HirKind::Class(class) => match class { - Class::Unicode(class) => { - let mut chars = CharacterSet::default(); - for c in class.ranges() { - chars = chars.add_range(c.start(), c.end()); - } - - // For some reason, the long s `ſ` is included if the letter `s` is in a - // pattern, so we remove it. - if chars.range_count() == 3 - && chars - .ranges() - // exact check to ensure that `ſ` wasn't intentionally added. - .all(|r| ['s'..='s', 'S'..='S', 'ſ'..='ſ'].contains(&r)) - { - chars = chars.difference(CharacterSet::from_char('ſ')); - } - self.push_advance(chars, next_state_id); - Ok(true) + Ast::Dot(_) => { + self.push_advance(CharacterSet::from_char('\n').negate(), next_state_id); + Ok(true) + } + Ast::Assertion(_) => Err(anyhow!("Regex error: Assertions are not supported")), + Ast::ClassUnicode(class) => { + let mut chars = self.expand_unicode_character_class(&class.kind)?; + if class.negated { + chars = chars.negate(); } - Class::Bytes(bytes_class) => { - let mut chars = CharacterSet::default(); - for c in bytes_class.ranges() { - chars = chars.add_range(c.start().into(), c.end().into()); - } - self.push_advance(chars, next_state_id); - Ok(true) + if case_insensitive { + chars = with_inverse_char(chars); } - }, - HirKind::Look(_) => Err(ExpandRegexError::Assertion)?, - HirKind::Repetition(repetition) => match (repetition.min, repetition.max) { - (0, Some(1)) => self.expand_zero_or_one(&repetition.sub, next_state_id), - (1, None) => self.expand_one_or_more(&repetition.sub, next_state_id), - (0, None) => self.expand_zero_or_more(&repetition.sub, next_state_id), - (min, Some(max)) if min == max => { - self.expand_count(&repetition.sub, min, next_state_id) + self.push_advance(chars, next_state_id); + Ok(true) + } + Ast::ClassPerl(class) => { + let mut chars = self.expand_perl_character_class(&class.kind); + if class.negated { + chars = chars.negate(); } - (min, None) => { - if self.expand_zero_or_more(&repetition.sub, next_state_id)? { - self.expand_count(&repetition.sub, min, next_state_id) + if case_insensitive { + chars = with_inverse_char(chars); + } + self.push_advance(chars, next_state_id); + Ok(true) + } + Ast::ClassBracketed(class) => { + let mut chars = self.translate_class_set(&class.kind)?; + if class.negated { + chars = chars.negate(); + } + if case_insensitive { + chars = with_inverse_char(chars); + } + self.push_advance(chars, next_state_id); + Ok(true) + } + Ast::Repetition(repetition) => match repetition.op.kind { + RepetitionKind::ZeroOrOne => { + self.expand_zero_or_one(&repetition.ast, next_state_id, case_insensitive) + } + RepetitionKind::OneOrMore => { + self.expand_one_or_more(&repetition.ast, next_state_id, case_insensitive) + } + RepetitionKind::ZeroOrMore => { + self.expand_zero_or_more(&repetition.ast, next_state_id, case_insensitive) + } + RepetitionKind::Range(RepetitionRange::Exactly(count)) => { + self.expand_count(&repetition.ast, count, next_state_id, case_insensitive) + } + RepetitionKind::Range(RepetitionRange::AtLeast(min)) => { + if self.expand_zero_or_more(&repetition.ast, next_state_id, case_insensitive)? { + self.expand_count(&repetition.ast, min, next_state_id, case_insensitive) } else { Ok(false) } } - (min, Some(max)) => { - let mut result = self.expand_count(&repetition.sub, min, next_state_id)?; + RepetitionKind::Range(RepetitionRange::Bounded(min, max)) => { + let mut result = + self.expand_count(&repetition.ast, min, next_state_id, case_insensitive)?; for _ in min..max { if result { next_state_id = self.nfa.last_state_id(); } - if self.expand_zero_or_one(&repetition.sub, next_state_id)? { + if self.expand_zero_or_one( + &repetition.ast, + next_state_id, + case_insensitive, + )? { result = true; } } Ok(result) } }, - HirKind::Capture(capture) => self.expand_regex(&capture.sub, next_state_id), - HirKind::Concat(concat) => { - let mut result = false; - for hir in concat.iter().rev() { - if self.expand_regex(hir, next_state_id)? { - result = true; - next_state_id = self.nfa.last_state_id(); - } - } - Ok(result) - } - HirKind::Alternation(alternations) => { - let mut alternative_state_ids = Vec::with_capacity(alternations.len()); - for hir in alternations { - if self.expand_regex(hir, next_state_id)? { + Ast::Group(group) => self.expand_regex(&group.ast, next_state_id, case_insensitive), + Ast::Alternation(alternation) => { + let mut alternative_state_ids = Vec::new(); + for ast in &alternation.asts { + if self.expand_regex(ast, next_state_id, case_insensitive)? { alternative_state_ids.push(self.nfa.last_state_id()); } else { alternative_state_ids.push(next_state_id); @@ -348,21 +310,58 @@ impl NfaBuilder { alternative_state_ids.sort_unstable(); alternative_state_ids.dedup(); alternative_state_ids.retain(|i| *i != self.nfa.last_state_id()); + for alternative_state_id in alternative_state_ids { self.push_split(alternative_state_id); } Ok(true) } + Ast::Concat(concat) => { + let mut result = false; + for ast in concat.asts.iter().rev() { + if self.expand_regex(ast, next_state_id, case_insensitive)? { + result = true; + next_state_id = self.nfa.last_state_id(); + } + } + Ok(result) + } } } - fn expand_one_or_more(&mut self, hir: &Hir, next_state_id: u32) -> ExpandRegexResult { + fn translate_class_set(&self, class_set: &ClassSet) -> Result { + match &class_set { + ClassSet::Item(item) => self.expand_character_class(item), + ClassSet::BinaryOp(binary_op) => { + let mut lhs_char_class = self.translate_class_set(&binary_op.lhs)?; + let mut rhs_char_class = self.translate_class_set(&binary_op.rhs)?; + match binary_op.kind { + ClassSetBinaryOpKind::Intersection => { + Ok(lhs_char_class.remove_intersection(&mut rhs_char_class)) + } + ClassSetBinaryOpKind::Difference => { + Ok(lhs_char_class.difference(rhs_char_class)) + } + ClassSetBinaryOpKind::SymmetricDifference => { + Ok(lhs_char_class.symmetric_difference(rhs_char_class)) + } + } + } + } + } + + fn expand_one_or_more( + &mut self, + ast: &Ast, + next_state_id: u32, + case_insensitive: bool, + ) -> Result { self.nfa.states.push(NfaState::Accept { variable_index: 0, precedence: 0, }); // Placeholder for split let split_state_id = self.nfa.last_state_id(); - if self.expand_regex(hir, split_state_id)? { + if self.expand_regex(ast, split_state_id, case_insensitive)? { self.nfa.states[split_state_id as usize] = NfaState::Split(self.nfa.last_state_id(), next_state_id); Ok(true) @@ -372,8 +371,13 @@ impl NfaBuilder { } } - fn expand_zero_or_one(&mut self, hir: &Hir, next_state_id: u32) -> ExpandRegexResult { - if self.expand_regex(hir, next_state_id)? { + fn expand_zero_or_one( + &mut self, + ast: &Ast, + next_state_id: u32, + case_insensitive: bool, + ) -> Result { + if self.expand_regex(ast, next_state_id, case_insensitive)? { self.push_split(next_state_id); Ok(true) } else { @@ -381,8 +385,13 @@ impl NfaBuilder { } } - fn expand_zero_or_more(&mut self, hir: &Hir, next_state_id: u32) -> ExpandRegexResult { - if self.expand_one_or_more(hir, next_state_id)? { + fn expand_zero_or_more( + &mut self, + ast: &Ast, + next_state_id: u32, + case_insensitive: bool, + ) -> Result { + if self.expand_one_or_more(ast, next_state_id, case_insensitive)? { self.push_split(next_state_id); Ok(true) } else { @@ -392,13 +401,14 @@ impl NfaBuilder { fn expand_count( &mut self, - hir: &Hir, + ast: &Ast, count: u32, mut next_state_id: u32, - ) -> ExpandRegexResult { + case_insensitive: bool, + ) -> Result { let mut result = false; for _ in 0..count { - if self.expand_regex(hir, next_state_id)? { + if self.expand_regex(ast, next_state_id, case_insensitive)? { result = true; next_state_id = self.nfa.last_state_id(); } @@ -406,6 +416,111 @@ impl NfaBuilder { Ok(result) } + fn expand_character_class(&self, item: &ClassSetItem) -> Result { + match item { + ClassSetItem::Empty(_) => Ok(CharacterSet::empty()), + ClassSetItem::Literal(literal) => Ok(CharacterSet::from_char(literal.c)), + ClassSetItem::Range(range) => Ok(CharacterSet::from_range(range.start.c, range.end.c)), + ClassSetItem::Union(union) => { + let mut result = CharacterSet::empty(); + for item in &union.items { + result = result.add(&self.expand_character_class(item)?); + } + Ok(result) + } + ClassSetItem::Perl(class) => Ok(self.expand_perl_character_class(&class.kind)), + ClassSetItem::Unicode(class) => { + let mut set = self.expand_unicode_character_class(&class.kind)?; + if class.negated { + set = set.negate(); + } + Ok(set) + } + ClassSetItem::Bracketed(class) => { + let mut set = self.translate_class_set(&class.kind)?; + if class.negated { + set = set.negate(); + } + Ok(set) + } + ClassSetItem::Ascii(_) => Err(anyhow!( + "Regex error: Unsupported character class syntax {item:?}", + )), + } + } + + fn expand_unicode_character_class(&self, class: &ClassUnicodeKind) -> Result { + let mut chars = CharacterSet::empty(); + + let category_letter; + match class { + ClassUnicodeKind::OneLetter(le) => { + category_letter = le.to_string(); + } + ClassUnicodeKind::Named(class_name) => { + let actual_class_name = UNICODE_CATEGORY_ALIASES + .get(class_name.as_str()) + .or_else(|| UNICODE_PROPERTY_ALIASES.get(class_name.as_str())) + .unwrap_or(class_name); + if actual_class_name.len() == 1 { + category_letter = actual_class_name.clone(); + } else { + let code_points = + UNICODE_CATEGORIES + .get(actual_class_name.as_str()) + .or_else(|| UNICODE_PROPERTIES.get(actual_class_name.as_str())) + .ok_or_else(|| { + anyhow!( + "Regex error: Unsupported unicode character class {class_name}", + ) + })?; + for c in code_points { + if let Some(c) = char::from_u32(*c) { + chars = chars.add_char(c); + } + } + + return Ok(chars); + } + } + ClassUnicodeKind::NamedValue { .. } => { + return Err(anyhow!( + "Regex error: Key-value unicode properties are not supported" + )) + } + } + + for (category, code_points) in UNICODE_CATEGORIES.iter() { + if category.starts_with(&category_letter) { + for c in code_points { + if let Some(c) = char::from_u32(*c) { + chars = chars.add_char(c); + } + } + } + } + + Ok(chars) + } + + fn expand_perl_character_class(&self, item: &ClassPerlKind) -> CharacterSet { + match item { + ClassPerlKind::Digit => CharacterSet::from_range('0', '9'), + ClassPerlKind::Space => CharacterSet::empty() + .add_char(' ') + .add_char('\t') + .add_char('\r') + .add_char('\n') + .add_char('\x0B') + .add_char('\x0C'), + ClassPerlKind::Word => CharacterSet::empty() + .add_char('_') + .add_range('A', 'Z') + .add_range('a', 'z') + .add_range('0', '9'), + } + } + fn push_advance(&mut self, chars: CharacterSet, state_id: u32) { let precedence = *self.precedence_stack.last().unwrap(); self.nfa.states.push(NfaState::Advance { @@ -427,7 +542,7 @@ impl NfaBuilder { #[cfg(test)] mod tests { use super::*; - use crate::{ + use crate::generate::{ grammars::Variable, nfa::{NfaCursor, NfaTransition}, }; diff --git a/crates/generate/src/prepare_grammar/extract_default_aliases.rs b/cli/src/generate/prepare_grammar/extract_default_aliases.rs similarity index 99% rename from crates/generate/src/prepare_grammar/extract_default_aliases.rs rename to cli/src/generate/prepare_grammar/extract_default_aliases.rs index cc977362..68317913 100644 --- a/crates/generate/src/prepare_grammar/extract_default_aliases.rs +++ b/cli/src/generate/prepare_grammar/extract_default_aliases.rs @@ -1,4 +1,4 @@ -use crate::{ +use crate::generate::{ grammars::{LexicalGrammar, SyntaxGrammar}, rules::{Alias, AliasMap, Symbol, SymbolType}, }; @@ -69,7 +69,9 @@ pub(super) fn extract_default_aliases( SymbolType::External => &mut external_status_list[symbol.index], SymbolType::NonTerminal => &mut non_terminal_status_list[symbol.index], SymbolType::Terminal => &mut terminal_status_list[symbol.index], - SymbolType::End | SymbolType::EndOfNonTerminalExtra => panic!("Unexpected end token"), + SymbolType::End | SymbolType::EndOfNonTerminalExtra => { + panic!("Unexpected end token") + } }; status.appears_unaliased = true; } @@ -162,7 +164,7 @@ pub(super) fn extract_default_aliases( #[cfg(test)] mod tests { use super::*; - use crate::{ + use crate::generate::{ grammars::{LexicalVariable, Production, ProductionStep, SyntaxVariable, VariableType}, nfa::Nfa, }; diff --git a/crates/generate/src/prepare_grammar/extract_tokens.rs b/cli/src/generate/prepare_grammar/extract_tokens.rs similarity index 76% rename from crates/generate/src/prepare_grammar/extract_tokens.rs rename to cli/src/generate/prepare_grammar/extract_tokens.rs index a7b4f227..2fb99678 100644 --- a/crates/generate/src/prepare_grammar/extract_tokens.rs +++ b/cli/src/generate/prepare_grammar/extract_tokens.rs @@ -1,63 +1,16 @@ -use std::collections::HashMap; +use std::{collections::HashMap, mem}; -use serde::Serialize; -use thiserror::Error; +use anyhow::{anyhow, Result}; use super::{ExtractedLexicalGrammar, ExtractedSyntaxGrammar, InternedGrammar}; -use crate::{ - grammars::{ExternalToken, ReservedWordContext, Variable, VariableType}, +use crate::generate::{ + grammars::{ExternalToken, Variable, VariableType}, rules::{MetadataParams, Rule, Symbol, SymbolType}, }; -pub type ExtractTokensResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ExtractTokensError { - #[error( - "The rule `{0}` contains an empty string. - -Tree-sitter does not support syntactic rules that contain an empty string -unless they are used only as the grammar's start rule. -" - )] - EmptyString(String), - #[error("Rule '{0}' cannot be used as both an external token and a non-terminal rule")] - ExternalTokenNonTerminal(String), - #[error("Non-symbol rules cannot be used as external tokens")] - NonSymbolExternalToken, - #[error(transparent)] - WordToken(NonTerminalWordTokenError), - #[error("Reserved word '{0}' must be a token")] - NonTokenReservedWord(String), -} - -#[derive(Debug, Error, Serialize)] -pub struct NonTerminalWordTokenError { - pub symbol_name: String, - pub conflicting_symbol_name: Option, -} - -impl std::fmt::Display for NonTerminalWordTokenError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Non-terminal symbol '{}' cannot be used as the word token", - self.symbol_name - )?; - if let Some(conflicting_name) = &self.conflicting_symbol_name { - writeln!( - f, - ", because its rule is duplicated in '{conflicting_name}'", - ) - } else { - writeln!(f) - } - } -} - pub(super) fn extract_tokens( mut grammar: InternedGrammar, -) -> ExtractTokensResult<(ExtractedSyntaxGrammar, ExtractedLexicalGrammar)> { +) -> Result<(ExtractedSyntaxGrammar, ExtractedLexicalGrammar)> { let mut extractor = TokenExtractor { current_variable_name: String::new(), current_variable_token_count: 0, @@ -85,7 +38,7 @@ pub(super) fn extract_tokens( // that pointed to that variable will need to be updated to point to the // variable in the lexical grammar. Symbols that pointed to later variables // will need to have their indices decremented. - let mut variables = Vec::with_capacity(grammar.variables.len()); + let mut variables = Vec::new(); let mut symbol_replacer = SymbolReplacer { replacements: HashMap::new(), }; @@ -152,14 +105,15 @@ pub(super) fn extract_tokens( } } - let mut external_tokens = Vec::with_capacity(grammar.external_tokens.len()); + let mut external_tokens = Vec::new(); for external_token in grammar.external_tokens { let rule = symbol_replacer.replace_symbols_in_rule(&external_token.rule); if let Rule::Symbol(symbol) = rule { if symbol.is_non_terminal() { - Err(ExtractTokensError::ExternalTokenNonTerminal( - variables[symbol.index].name.clone(), - ))?; + return Err(anyhow!( + "Rule '{}' cannot be used as both an external token and a non-terminal rule", + &variables[symbol.index].name, + )); } if symbol.is_external() { @@ -176,59 +130,22 @@ pub(super) fn extract_tokens( }); } } else { - Err(ExtractTokensError::NonSymbolExternalToken)?; + return Err(anyhow!( + "Non-symbol rules cannot be used as external tokens" + )); } } - let word_token = if let Some(token) = grammar.word_token { + let mut word_token = None; + if let Some(token) = grammar.word_token { let token = symbol_replacer.replace_symbol(token); if token.is_non_terminal() { - let word_token_variable = &variables[token.index]; - let conflicting_symbol_name = variables - .iter() - .enumerate() - .find(|(i, v)| *i != token.index && v.rule == word_token_variable.rule) - .map(|(_, v)| v.name.clone()); - - Err(ExtractTokensError::WordToken(NonTerminalWordTokenError { - symbol_name: word_token_variable.name.clone(), - conflicting_symbol_name, - }))?; + return Err(anyhow!( + "Non-terminal symbol '{}' cannot be used as the word token", + &variables[token.index].name + )); } - Some(token) - } else { - None - }; - - let mut reserved_word_contexts = Vec::with_capacity(grammar.reserved_word_sets.len()); - for reserved_word_context in grammar.reserved_word_sets { - let mut reserved_words = Vec::with_capacity(reserved_word_contexts.len()); - for reserved_rule in reserved_word_context.reserved_words { - if let Rule::Symbol(symbol) = reserved_rule { - reserved_words.push(symbol_replacer.replace_symbol(symbol)); - } else if let Some(index) = lexical_variables - .iter() - .position(|v| v.rule == reserved_rule) - { - reserved_words.push(Symbol::terminal(index)); - } else { - let rule = if let Rule::Metadata { rule, .. } = &reserved_rule { - rule.as_ref() - } else { - &reserved_rule - }; - let token_name = match rule { - Rule::String(s) => s.clone(), - Rule::Pattern(p, _) => p.clone(), - _ => "unknown".to_string(), - }; - Err(ExtractTokensError::NonTokenReservedWord(token_name))?; - } - } - reserved_word_contexts.push(ReservedWordContext { - name: reserved_word_context.name, - reserved_words, - }); + word_token = Some(token); } Ok(( @@ -241,7 +158,6 @@ pub(super) fn extract_tokens( external_tokens, word_token, precedence_orderings: grammar.precedence_orderings, - reserved_word_sets: reserved_word_contexts, }, ExtractedLexicalGrammar { variables: lexical_variables, @@ -267,16 +183,18 @@ impl TokenExtractor { &mut self, is_first: bool, variable: &mut Variable, - ) -> ExtractTokensResult<()> { + ) -> Result<()> { self.current_variable_name.clear(); self.current_variable_name.push_str(&variable.name); self.current_variable_token_count = 0; self.is_first_rule = is_first; - variable.rule = self.extract_tokens_in_rule(&variable.rule)?; + let mut rule = Rule::Blank; + mem::swap(&mut rule, &mut variable.rule); + variable.rule = self.extract_tokens_in_rule(&rule)?; Ok(()) } - fn extract_tokens_in_rule(&mut self, input: &Rule) -> ExtractTokensResult { + fn extract_tokens_in_rule(&mut self, input: &Rule) -> Result { match input { Rule::String(name) => Ok(self.extract_token(input, Some(name))?.into()), Rule::Pattern(..) => Ok(self.extract_token(input, None)?.into()), @@ -285,11 +203,10 @@ impl TokenExtractor { let mut params = params.clone(); params.is_token = false; - let string_value = if let Rule::String(value) = rule.as_ref() { - Some(value) - } else { - None - }; + let mut string_value = None; + if let Rule::String(value) = rule.as_ref() { + string_value = Some(value); + } let rule_to_extract = if params == MetadataParams::default() { rule.as_ref() @@ -312,27 +229,19 @@ impl TokenExtractor { elements .iter() .map(|e| self.extract_tokens_in_rule(e)) - .collect::>>()?, + .collect::>>()?, )), Rule::Choice(elements) => Ok(Rule::Choice( elements .iter() .map(|e| self.extract_tokens_in_rule(e)) - .collect::>>()?, + .collect::>>()?, )), - Rule::Reserved { rule, context_name } => Ok(Rule::Reserved { - rule: Box::new(self.extract_tokens_in_rule(rule)?), - context_name: context_name.clone(), - }), _ => Ok(input.clone()), } } - fn extract_token( - &mut self, - rule: &Rule, - string_value: Option<&String>, - ) -> ExtractTokensResult { + fn extract_token(&mut self, rule: &Rule, string_value: Option<&String>) -> Result { for (i, variable) in self.extracted_variables.iter_mut().enumerate() { if variable.rule == *rule { self.extracted_usage_counts[i] += 1; @@ -343,9 +252,14 @@ impl TokenExtractor { let index = self.extracted_variables.len(); let variable = if let Some(string_value) = string_value { if string_value.is_empty() && !self.is_first_rule { - Err(ExtractTokensError::EmptyString( - self.current_variable_name.clone(), - ))?; + return Err(anyhow!( + "The rule `{}` contains an empty string. + +Tree-sitter does not support syntactic rules that contain an empty string +unless they are used only as the grammar's start rule. +", + self.current_variable_name + )); } Variable { name: string_value.clone(), @@ -357,7 +271,7 @@ impl TokenExtractor { Variable { name: format!( "{}_token{}", - self.current_variable_name, self.current_variable_token_count + &self.current_variable_name, self.current_variable_token_count ), kind: VariableType::Auxiliary, rule: rule.clone(), @@ -391,10 +305,6 @@ impl SymbolReplacer { params: params.clone(), rule: Box::new(self.replace_symbols_in_rule(rule)), }, - Rule::Reserved { rule, context_name } => Rule::Reserved { - rule: Box::new(self.replace_symbols_in_rule(rule)), - context_name: context_name.clone(), - }, _ => rule.clone(), } } @@ -590,13 +500,14 @@ mod test { ]); grammar.external_tokens = vec![Variable::named("rule_1", Rule::non_terminal(1))]; - let result = extract_tokens(grammar); - assert!(result.is_err(), "Expected an error but got no error"); - let err = result.err().unwrap(); - assert_eq!( - err.to_string(), - "Rule 'rule_1' cannot be used as both an external token and a non-terminal rule" - ); + match extract_tokens(grammar) { + Err(e) => { + assert_eq!(e.to_string(), "Rule 'rule_1' cannot be used as both an external token and a non-terminal rule"); + } + _ => { + panic!("Expected an error but got no error"); + } + } } #[test] diff --git a/crates/generate/src/prepare_grammar/flatten_grammar.rs b/cli/src/generate/prepare_grammar/flatten_grammar.rs similarity index 59% rename from crates/generate/src/prepare_grammar/flatten_grammar.rs rename to cli/src/generate/prepare_grammar/flatten_grammar.rs index 3bec17bf..ff3f10e2 100644 --- a/crates/generate/src/prepare_grammar/flatten_grammar.rs +++ b/cli/src/generate/prepare_grammar/flatten_grammar.rs @@ -1,96 +1,47 @@ -use std::collections::HashMap; - -use serde::Serialize; -use thiserror::Error; +use anyhow::{anyhow, Result}; use super::ExtractedSyntaxGrammar; -use crate::{ - grammars::{ - Production, ProductionStep, ReservedWordSetId, SyntaxGrammar, SyntaxVariable, Variable, - }, - rules::{Alias, Associativity, Precedence, Rule, Symbol, TokenSet}, +use crate::generate::{ + grammars::{Production, ProductionStep, SyntaxGrammar, SyntaxVariable, Variable}, + rules::{Alias, Associativity, Precedence, Rule, Symbol}, }; -pub type FlattenGrammarResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum FlattenGrammarError { - #[error("No such reserved word set: {0}")] - NoReservedWordSet(String), - #[error( - "The rule `{0}` matches the empty string. - -Tree-sitter does not support syntactic rules that match the empty string -unless they are used only as the grammar's start rule. -" - )] - EmptyString(String), - #[error("Rule `{0}` cannot be inlined because it contains a reference to itself")] - RecursiveInline(String), -} - struct RuleFlattener { production: Production, - reserved_word_set_ids: HashMap, precedence_stack: Vec, associativity_stack: Vec, - reserved_word_stack: Vec, alias_stack: Vec, field_name_stack: Vec, } impl RuleFlattener { - const fn new(reserved_word_set_ids: HashMap) -> Self { + const fn new() -> Self { Self { production: Production { steps: Vec::new(), dynamic_precedence: 0, }, - reserved_word_set_ids, precedence_stack: Vec::new(), associativity_stack: Vec::new(), - reserved_word_stack: Vec::new(), alias_stack: Vec::new(), field_name_stack: Vec::new(), } } - fn flatten_variable(&mut self, variable: Variable) -> FlattenGrammarResult { - let choices = extract_choices(variable.rule); - let mut productions = Vec::with_capacity(choices.len()); - for rule in choices { - let production = self.flatten_rule(rule)?; - if !productions.contains(&production) { - productions.push(production); - } - } - Ok(SyntaxVariable { - name: variable.name, - kind: variable.kind, - productions, - }) + fn flatten(mut self, rule: Rule) -> Production { + self.apply(rule, true); + self.production } - fn flatten_rule(&mut self, rule: Rule) -> FlattenGrammarResult { - self.production = Production::default(); - self.alias_stack.clear(); - self.reserved_word_stack.clear(); - self.precedence_stack.clear(); - self.associativity_stack.clear(); - self.field_name_stack.clear(); - self.apply(rule, true)?; - Ok(self.production.clone()) - } - - fn apply(&mut self, rule: Rule, at_end: bool) -> FlattenGrammarResult { + fn apply(&mut self, rule: Rule, at_end: bool) -> bool { match rule { Rule::Seq(members) => { let mut result = false; let last_index = members.len() - 1; for (i, member) in members.into_iter().enumerate() { - result |= self.apply(member, i == last_index && at_end)?; + result |= self.apply(member, i == last_index && at_end); } - Ok(result) + result } Rule::Metadata { rule, params } => { let mut has_precedence = false; @@ -121,7 +72,7 @@ impl RuleFlattener { self.production.dynamic_precedence = params.dynamic_precedence; } - let did_push = self.apply(*rule, at_end)?; + let did_push = self.apply(*rule, at_end); if has_precedence { self.precedence_stack.pop(); @@ -150,20 +101,7 @@ impl RuleFlattener { self.field_name_stack.pop(); } - Ok(did_push) - } - Rule::Reserved { rule, context_name } => { - self.reserved_word_stack.push( - self.reserved_word_set_ids - .get(&context_name) - .copied() - .ok_or_else(|| { - FlattenGrammarError::NoReservedWordSet(context_name.clone()) - })?, - ); - let did_push = self.apply(*rule, at_end)?; - self.reserved_word_stack.pop(); - Ok(did_push) + did_push } Rule::Symbol(symbol) => { self.production.steps.push(ProductionStep { @@ -174,17 +112,12 @@ impl RuleFlattener { .cloned() .unwrap_or(Precedence::None), associativity: self.associativity_stack.last().copied(), - reserved_word_set_id: self - .reserved_word_stack - .last() - .copied() - .unwrap_or(ReservedWordSetId::default()), alias: self.alias_stack.last().cloned(), field_name: self.field_name_stack.last().cloned(), }); - Ok(true) + true } - _ => Ok(false), + _ => false, } } } @@ -195,7 +128,7 @@ fn extract_choices(rule: Rule) -> Vec { let mut result = vec![Rule::Blank]; for element in elements { let extraction = extract_choices(element); - let mut next_result = Vec::with_capacity(result.len()); + let mut next_result = Vec::new(); for entry in result { for extraction_entry in &extraction { next_result.push(Rule::Seq(vec![entry.clone(), extraction_entry.clone()])); @@ -206,7 +139,7 @@ fn extract_choices(rule: Rule) -> Vec { result } Rule::Choice(elements) => { - let mut result = Vec::with_capacity(elements.len()); + let mut result = Vec::new(); for element in elements { for rule in extract_choices(element) { result.push(rule); @@ -221,18 +154,26 @@ fn extract_choices(rule: Rule) -> Vec { params: params.clone(), }) .collect(), - Rule::Reserved { rule, context_name } => extract_choices(*rule) - .into_iter() - .map(|rule| Rule::Reserved { - rule: Box::new(rule), - context_name: context_name.clone(), - }) - .collect(), _ => vec![rule], } } -fn symbol_is_used(variables: &[SyntaxVariable], symbol: Symbol) -> bool { +fn flatten_variable(variable: Variable) -> SyntaxVariable { + let mut productions = Vec::new(); + for rule in extract_choices(variable.rule) { + let production = RuleFlattener::new().flatten(rule); + if !productions.contains(&production) { + productions.push(production); + } + } + SyntaxVariable { + name: variable.name, + kind: variable.kind, + productions, + } +} + +pub fn symbol_is_used(variables: &[SyntaxVariable], symbol: Symbol) -> bool { for variable in variables { for production in &variable.productions { for step in &production.steps { @@ -245,48 +186,36 @@ fn symbol_is_used(variables: &[SyntaxVariable], symbol: Symbol) -> bool { false } -pub(super) fn flatten_grammar( - grammar: ExtractedSyntaxGrammar, -) -> FlattenGrammarResult { - let mut reserved_word_set_ids_by_name = HashMap::new(); - for (ix, set) in grammar.reserved_word_sets.iter().enumerate() { - reserved_word_set_ids_by_name.insert(set.name.clone(), ReservedWordSetId(ix)); +pub(super) fn flatten_grammar(grammar: ExtractedSyntaxGrammar) -> Result { + let mut variables = Vec::new(); + for variable in grammar.variables { + variables.push(flatten_variable(variable)); } - - let mut flattener = RuleFlattener::new(reserved_word_set_ids_by_name); - let variables = grammar - .variables - .into_iter() - .map(|variable| flattener.flatten_variable(variable)) - .collect::>>()?; - for (i, variable) in variables.iter().enumerate() { let symbol = Symbol::non_terminal(i); - let used = symbol_is_used(&variables, symbol); for production in &variable.productions { - if used && production.steps.is_empty() { - Err(FlattenGrammarError::EmptyString(variable.name.clone()))?; + if production.steps.is_empty() && symbol_is_used(&variables, symbol) { + return Err(anyhow!( + "The rule `{}` matches the empty string. + +Tree-sitter does not support syntactic rules that match the empty string +unless they are used only as the grammar's start rule. +", + variable.name + )); } if grammar.variables_to_inline.contains(&symbol) && production.steps.iter().any(|step| step.symbol == symbol) { - Err(FlattenGrammarError::RecursiveInline(variable.name.clone()))?; + return Err(anyhow!( + "Rule `{}` cannot be inlined because it contains a reference to itself.", + variable.name, + )); } } } - let mut reserved_word_sets = grammar - .reserved_word_sets - .into_iter() - .map(|set| set.reserved_words.into_iter().collect()) - .collect::>(); - - // If no default reserved word set is specified, there are no reserved words. - if reserved_word_sets.is_empty() { - reserved_word_sets.push(TokenSet::default()); - } - Ok(SyntaxGrammar { extra_symbols: grammar.extra_symbols, expected_conflicts: grammar.expected_conflicts, @@ -295,7 +224,6 @@ pub(super) fn flatten_grammar( external_tokens: grammar.external_tokens, supertype_symbols: grammar.supertype_symbols, word_token: grammar.word_token, - reserved_word_sets, variables, }) } @@ -303,35 +231,32 @@ pub(super) fn flatten_grammar( #[cfg(test)] mod tests { use super::*; - use crate::grammars::VariableType; + use crate::generate::grammars::VariableType; #[test] fn test_flatten_grammar() { - let mut flattener = RuleFlattener::new(HashMap::default()); - let result = flattener - .flatten_variable(Variable { - name: "test".to_string(), - kind: VariableType::Named, - rule: Rule::seq(vec![ - Rule::non_terminal(1), - Rule::prec_left( - Precedence::Integer(101), - Rule::seq(vec![ - Rule::non_terminal(2), - Rule::choice(vec![ - Rule::prec_right( - Precedence::Integer(102), - Rule::seq(vec![Rule::non_terminal(3), Rule::non_terminal(4)]), - ), - Rule::non_terminal(5), - ]), - Rule::non_terminal(6), + let result = flatten_variable(Variable { + name: "test".to_string(), + kind: VariableType::Named, + rule: Rule::seq(vec![ + Rule::non_terminal(1), + Rule::prec_left( + Precedence::Integer(101), + Rule::seq(vec![ + Rule::non_terminal(2), + Rule::choice(vec![ + Rule::prec_right( + Precedence::Integer(102), + Rule::seq(vec![Rule::non_terminal(3), Rule::non_terminal(4)]), + ), + Rule::non_terminal(5), ]), - ), - Rule::non_terminal(7), - ]), - }) - .unwrap(); + Rule::non_terminal(6), + ]), + ), + Rule::non_terminal(7), + ]), + }); assert_eq!( result.productions, @@ -368,31 +293,28 @@ mod tests { #[test] fn test_flatten_grammar_with_maximum_dynamic_precedence() { - let mut flattener = RuleFlattener::new(HashMap::default()); - let result = flattener - .flatten_variable(Variable { - name: "test".to_string(), - kind: VariableType::Named, - rule: Rule::seq(vec![ - Rule::non_terminal(1), - Rule::prec_dynamic( - 101, - Rule::seq(vec![ - Rule::non_terminal(2), - Rule::choice(vec![ - Rule::prec_dynamic( - 102, - Rule::seq(vec![Rule::non_terminal(3), Rule::non_terminal(4)]), - ), - Rule::non_terminal(5), - ]), - Rule::non_terminal(6), + let result = flatten_variable(Variable { + name: "test".to_string(), + kind: VariableType::Named, + rule: Rule::seq(vec![ + Rule::non_terminal(1), + Rule::prec_dynamic( + 101, + Rule::seq(vec![ + Rule::non_terminal(2), + Rule::choice(vec![ + Rule::prec_dynamic( + 102, + Rule::seq(vec![Rule::non_terminal(3), Rule::non_terminal(4)]), + ), + Rule::non_terminal(5), ]), - ), - Rule::non_terminal(7), - ]), - }) - .unwrap(); + Rule::non_terminal(6), + ]), + ), + Rule::non_terminal(7), + ]), + }); assert_eq!( result.productions, @@ -424,17 +346,14 @@ mod tests { #[test] fn test_flatten_grammar_with_final_precedence() { - let mut flattener = RuleFlattener::new(HashMap::default()); - let result = flattener - .flatten_variable(Variable { - name: "test".to_string(), - kind: VariableType::Named, - rule: Rule::prec_left( - Precedence::Integer(101), - Rule::seq(vec![Rule::non_terminal(1), Rule::non_terminal(2)]), - ), - }) - .unwrap(); + let result = flatten_variable(Variable { + name: "test".to_string(), + kind: VariableType::Named, + rule: Rule::prec_left( + Precedence::Integer(101), + Rule::seq(vec![Rule::non_terminal(1), Rule::non_terminal(2)]), + ), + }); assert_eq!( result.productions, @@ -449,16 +368,14 @@ mod tests { }] ); - let result = flattener - .flatten_variable(Variable { - name: "test".to_string(), - kind: VariableType::Named, - rule: Rule::prec_left( - Precedence::Integer(101), - Rule::seq(vec![Rule::non_terminal(1)]), - ), - }) - .unwrap(); + let result = flatten_variable(Variable { + name: "test".to_string(), + kind: VariableType::Named, + rule: Rule::prec_left( + Precedence::Integer(101), + Rule::seq(vec![Rule::non_terminal(1)]), + ), + }); assert_eq!( result.productions, @@ -472,21 +389,18 @@ mod tests { #[test] fn test_flatten_grammar_with_field_names() { - let mut flattener = RuleFlattener::new(HashMap::default()); - let result = flattener - .flatten_variable(Variable { - name: "test".to_string(), - kind: VariableType::Named, - rule: Rule::seq(vec![ - Rule::field("first-thing".to_string(), Rule::terminal(1)), - Rule::terminal(2), - Rule::choice(vec![ - Rule::Blank, - Rule::field("second-thing".to_string(), Rule::terminal(3)), - ]), + let result = flatten_variable(Variable { + name: "test".to_string(), + kind: VariableType::Named, + rule: Rule::seq(vec![ + Rule::field("first-thing".to_string(), Rule::terminal(1)), + Rule::terminal(2), + Rule::choice(vec![ + Rule::Blank, + Rule::field("second-thing".to_string(), Rule::terminal(3)), ]), - }) - .unwrap(); + ]), + }); assert_eq!( result.productions, @@ -520,7 +434,6 @@ mod tests { external_tokens: Vec::new(), supertype_symbols: Vec::new(), word_token: None, - reserved_word_sets: Vec::new(), variables: vec![Variable { name: "test".to_string(), kind: VariableType::Named, @@ -534,7 +447,7 @@ mod tests { assert_eq!( result.unwrap_err().to_string(), - "Rule `test` cannot be inlined because it contains a reference to itself", + "Rule `test` cannot be inlined because it contains a reference to itself.", ); } } diff --git a/crates/generate/src/prepare_grammar/intern_symbols.rs b/cli/src/generate/prepare_grammar/intern_symbols.rs similarity index 72% rename from crates/generate/src/prepare_grammar/intern_symbols.rs rename to cli/src/generate/prepare_grammar/intern_symbols.rs index 92f0f095..567c61ac 100644 --- a/crates/generate/src/prepare_grammar/intern_symbols.rs +++ b/cli/src/generate/prepare_grammar/intern_symbols.rs @@ -1,34 +1,16 @@ -use log::warn; -use serde::Serialize; -use thiserror::Error; +use anyhow::{anyhow, Result}; use super::InternedGrammar; -use crate::{ - grammars::{InputGrammar, ReservedWordContext, Variable, VariableType}, +use crate::generate::{ + grammars::{InputGrammar, Variable, VariableType}, rules::{Rule, Symbol}, }; -pub type InternSymbolsResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum InternSymbolsError { - #[error("A grammar's start rule must be visible.")] - HiddenStartRule, - #[error("Undefined symbol `{0}`")] - Undefined(String), - #[error("Undefined symbol `{0}` in grammar's supertypes array")] - UndefinedSupertype(String), - #[error("Undefined symbol `{0}` in grammar's conflicts array")] - UndefinedConflict(String), - #[error("Undefined symbol `{0}` as grammar's word token")] - UndefinedWordToken(String), -} - -pub(super) fn intern_symbols(grammar: &InputGrammar) -> InternSymbolsResult { +pub(super) fn intern_symbols(grammar: &InputGrammar) -> Result { let interner = Interner { grammar }; if variable_type_for_name(&grammar.variables[0].name) == VariableType::Hidden { - Err(InternSymbolsError::HiddenStartRule)?; + return Err(anyhow!("A grammar's start rule must be visible.")); } let mut variables = Vec::with_capacity(grammar.variables.len()); @@ -58,31 +40,21 @@ pub(super) fn intern_symbols(grammar: &InputGrammar) -> InternSymbolsResult InternSymbolsResult InternSymbolsResult { grammar: &'a InputGrammar, } -impl Interner<'_> { - fn intern_rule(&self, rule: &Rule, name: Option<&str>) -> InternSymbolsResult { +impl<'a> Interner<'a> { + fn intern_rule(&self, rule: &Rule, name: Option<&str>) -> Result { match rule { Rule::Choice(elements) => { - self.check_single(elements, name, "choice"); + self.check_single(elements, name); let mut result = Vec::with_capacity(elements.len()); for element in elements { result.push(self.intern_rule(element, name)?); @@ -140,7 +110,7 @@ impl Interner<'_> { Ok(Rule::Choice(result)) } Rule::Seq(elements) => { - self.check_single(elements, name, "seq"); + self.check_single(elements, name); let mut result = Vec::with_capacity(elements.len()); for element in elements { result.push(self.intern_rule(element, name)?); @@ -152,12 +122,8 @@ impl Interner<'_> { rule: Box::new(self.intern_rule(rule, name)?), params: params.clone(), }), - Rule::Reserved { rule, context_name } => Ok(Rule::Reserved { - rule: Box::new(self.intern_rule(rule, name)?), - context_name: context_name.clone(), - }), Rule::NamedSymbol(name) => self.intern_name(name).map_or_else( - || Err(InternSymbolsError::Undefined(name.clone())), + || Err(anyhow!("Undefined symbol `{name}`")), |symbol| Ok(Rule::Symbol(symbol)), ), _ => Ok(rule.clone()), @@ -184,10 +150,10 @@ impl Interner<'_> { // In the case of a seq or choice rule of 1 element in a hidden rule, weird // inconsistent behavior with queries can occur. So we should warn the user about it. - fn check_single(&self, elements: &[Rule], name: Option<&str>, kind: &str) { + fn check_single(&self, elements: &[Rule], name: Option<&str>) { if elements.len() == 1 && matches!(elements[0], Rule::String(_) | Rule::Pattern(_, _)) { - warn!( - "rule {} contains a `{kind}` rule with a single element. This is unnecessary.", + eprintln!( + "Warning: rule {} is just a `seq` or `choice` rule with a single element. This is unnecessary.", name.unwrap_or_default() ); } @@ -278,9 +244,10 @@ mod tests { fn test_grammar_with_undefined_symbols() { let result = intern_symbols(&build_grammar(vec![Variable::named("x", Rule::named("y"))])); - assert!(result.is_err(), "Expected an error but got none"); - let e = result.err().unwrap(); - assert_eq!(e.to_string(), "Undefined symbol `y`"); + match result { + Err(e) => assert_eq!(e.to_string(), "Undefined symbol `y`"), + _ => panic!("Expected an error but got none"), + } } fn build_grammar(variables: Vec) -> InputGrammar { diff --git a/crates/generate/src/prepare_grammar.rs b/cli/src/generate/prepare_grammar/mod.rs similarity index 57% rename from crates/generate/src/prepare_grammar.rs rename to cli/src/generate/prepare_grammar/mod.rs index 58e0869c..16d7c85b 100644 --- a/crates/generate/src/prepare_grammar.rs +++ b/cli/src/generate/prepare_grammar/mod.rs @@ -8,18 +8,12 @@ mod process_inlines; use std::{ cmp::Ordering, - collections::{hash_map, BTreeSet, HashMap, HashSet}, + collections::{hash_map, HashMap, HashSet}, mem, }; -pub use expand_tokens::ExpandTokensError; -pub use extract_tokens::ExtractTokensError; -pub use flatten_grammar::FlattenGrammarError; -use indexmap::IndexMap; -pub use intern_symbols::InternSymbolsError; -pub use process_inlines::ProcessInlinesError; -use serde::Serialize; -use thiserror::Error; +use anyhow::{anyhow, Result}; +pub(super) use flatten_grammar::symbol_is_used; pub use self::expand_tokens::expand_tokens; use self::{ @@ -34,7 +28,6 @@ use super::{ }, rules::{AliasMap, Precedence, Rule, Symbol}, }; -use crate::grammars::ReservedWordContext; pub struct IntermediateGrammar { variables: Vec, @@ -45,7 +38,6 @@ pub struct IntermediateGrammar { variables_to_inline: Vec, supertype_symbols: Vec, word_token: Option, - reserved_word_sets: Vec>, } pub type InternedGrammar = IntermediateGrammar; @@ -69,96 +61,21 @@ impl Default for IntermediateGrammar { variables_to_inline: Vec::default(), supertype_symbols: Vec::default(), word_token: Option::default(), - reserved_word_sets: Vec::default(), } } } -pub type PrepareGrammarResult = Result; - -#[derive(Debug, Error, Serialize)] -#[error(transparent)] -pub enum PrepareGrammarError { - ValidatePrecedences(#[from] ValidatePrecedenceError), - ValidateIndirectRecursion(#[from] IndirectRecursionError), - InternSymbols(#[from] InternSymbolsError), - ExtractTokens(#[from] ExtractTokensError), - FlattenGrammar(#[from] FlattenGrammarError), - ExpandTokens(#[from] ExpandTokensError), - ProcessInlines(#[from] ProcessInlinesError), -} - -pub type ValidatePrecedenceResult = Result; - -#[derive(Debug, Error, Serialize)] -#[error(transparent)] -pub enum ValidatePrecedenceError { - Undeclared(#[from] UndeclaredPrecedenceError), - Ordering(#[from] ConflictingPrecedenceOrderingError), -} - -#[derive(Debug, Error, Serialize)] -pub struct IndirectRecursionError(pub Vec); - -impl std::fmt::Display for IndirectRecursionError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Grammar contains an indirectly recursive rule: ")?; - for (i, symbol) in self.0.iter().enumerate() { - if i > 0 { - write!(f, " -> ")?; - } - write!(f, "{symbol}")?; - } - Ok(()) - } -} - -#[derive(Debug, Error, Serialize)] -pub struct UndeclaredPrecedenceError { - pub precedence: String, - pub rule: String, -} - -impl std::fmt::Display for UndeclaredPrecedenceError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Undeclared precedence '{}' in rule '{}'", - self.precedence, self.rule - )?; - Ok(()) - } -} - -#[derive(Debug, Error, Serialize)] -pub struct ConflictingPrecedenceOrderingError { - pub precedence_1: String, - pub precedence_2: String, -} - -impl std::fmt::Display for ConflictingPrecedenceOrderingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Conflicting orderings for precedences {} and {}", - self.precedence_1, self.precedence_2 - )?; - Ok(()) - } -} - /// Transform an input grammar into separate components that are ready /// for parse table construction. pub fn prepare_grammar( input_grammar: &InputGrammar, -) -> PrepareGrammarResult<( +) -> Result<( SyntaxGrammar, LexicalGrammar, InlinedProductionMap, AliasMap, )> { validate_precedences(input_grammar)?; - validate_indirect_recursion(input_grammar)?; let interned_grammar = intern_symbols(input_grammar)?; let (syntax_grammar, lexical_grammar) = extract_tokens(interned_grammar)?; @@ -170,94 +87,13 @@ pub fn prepare_grammar( Ok((syntax_grammar, lexical_grammar, inlines, default_aliases)) } -/// Check for indirect recursion cycles in the grammar that can cause infinite loops while -/// parsing. An indirect recursion cycle occurs when a non-terminal can derive itself through -/// a chain of single-symbol productions (e.g., A -> B, B -> A). -fn validate_indirect_recursion(grammar: &InputGrammar) -> Result<(), IndirectRecursionError> { - let mut epsilon_transitions: IndexMap<&str, BTreeSet> = IndexMap::new(); - - for variable in &grammar.variables { - let productions = get_single_symbol_productions(&variable.rule); - // Filter out rules that *directly* reference themselves, as this doesn't - // cause a parsing loop. - let filtered: BTreeSet = productions - .into_iter() - .filter(|s| s != &variable.name) - .collect(); - epsilon_transitions.insert(variable.name.as_str(), filtered); - } - - for start_symbol in epsilon_transitions.keys() { - let mut visited = BTreeSet::new(); - let mut path = Vec::new(); - if let Some((start_idx, end_idx)) = - get_cycle(start_symbol, &epsilon_transitions, &mut visited, &mut path) - { - let cycle_symbols = path[start_idx..=end_idx] - .iter() - .map(|s| (*s).to_string()) - .collect(); - return Err(IndirectRecursionError(cycle_symbols)); - } - } - - Ok(()) -} - -fn get_single_symbol_productions(rule: &Rule) -> BTreeSet { - match rule { - Rule::NamedSymbol(name) => BTreeSet::from([name.clone()]), - Rule::Choice(choices) => choices - .iter() - .flat_map(get_single_symbol_productions) - .collect(), - Rule::Metadata { rule, .. } => get_single_symbol_productions(rule), - _ => BTreeSet::new(), - } -} - -/// Perform a depth-first search to detect cycles in single state transitions. -fn get_cycle<'a>( - current: &'a str, - transitions: &'a IndexMap<&'a str, BTreeSet>, - visited: &mut BTreeSet<&'a str>, - path: &mut Vec<&'a str>, -) -> Option<(usize, usize)> { - if let Some(first_idx) = path.iter().position(|s| *s == current) { - path.push(current); - return Some((first_idx, path.len() - 1)); - } - - if visited.contains(current) { - return None; - } - - path.push(current); - visited.insert(current); - - if let Some(next_symbols) = transitions.get(current) { - for next in next_symbols { - if let Some(cycle) = get_cycle(next, transitions, visited, path) { - return Some(cycle); - } - } - } - - path.pop(); - None -} - /// Check that all of the named precedences used in the grammar are declared /// within the `precedences` lists, and also that there are no conflicting /// precedence orderings declared in those lists. -fn validate_precedences(grammar: &InputGrammar) -> ValidatePrecedenceResult<()> { +fn validate_precedences(grammar: &InputGrammar) -> Result<()> { // Check that no rule contains a named precedence that is not present in // any of the `precedences` lists. - fn validate( - rule_name: &str, - rule: &Rule, - names: &HashSet<&String>, - ) -> ValidatePrecedenceResult<()> { + fn validate(rule_name: &str, rule: &Rule, names: &HashSet<&String>) -> Result<()> { match rule { Rule::Repeat(rule) => validate(rule_name, rule, names), Rule::Seq(elements) | Rule::Choice(elements) => elements @@ -266,10 +102,7 @@ fn validate_precedences(grammar: &InputGrammar) -> ValidatePrecedenceResult<()> Rule::Metadata { rule, params } => { if let Precedence::Name(n) = ¶ms.precedence { if !names.contains(n) { - Err(UndeclaredPrecedenceError { - precedence: n.clone(), - rule: rule_name.to_string(), - })?; + return Err(anyhow!("Undeclared precedence '{n}' in rule '{rule_name}'")); } } validate(rule_name, rule, names)?; @@ -299,10 +132,9 @@ fn validate_precedences(grammar: &InputGrammar) -> ValidatePrecedenceResult<()> } hash_map::Entry::Occupied(e) => { if e.get() != &ordering { - Err(ConflictingPrecedenceOrderingError { - precedence_1: entry1.to_string(), - precedence_2: entry2.to_string(), - })?; + return Err(anyhow!( + "Conflicting orderings for precedences {entry1} and {entry2}", + )); } } } @@ -332,7 +164,7 @@ fn validate_precedences(grammar: &InputGrammar) -> ValidatePrecedenceResult<()> #[cfg(test)] mod tests { use super::*; - use crate::grammars::VariableType; + use crate::generate::grammars::VariableType; #[test] fn test_validate_precedences_with_undeclared_precedence() { diff --git a/crates/generate/src/prepare_grammar/process_inlines.rs b/cli/src/generate/prepare_grammar/process_inlines.rs similarity index 93% rename from crates/generate/src/prepare_grammar/process_inlines.rs rename to cli/src/generate/prepare_grammar/process_inlines.rs index 460d2359..ec43dd67 100644 --- a/crates/generate/src/prepare_grammar/process_inlines.rs +++ b/cli/src/generate/prepare_grammar/process_inlines.rs @@ -1,9 +1,8 @@ use std::collections::HashMap; -use serde::Serialize; -use thiserror::Error; +use anyhow::{anyhow, Result}; -use crate::{ +use crate::generate::{ grammars::{InlinedProductionMap, LexicalGrammar, Production, ProductionStep, SyntaxGrammar}, rules::SymbolType, }; @@ -70,13 +69,12 @@ impl InlinedProductionMapBuilder { let production_map = production_indices_by_step_id .into_iter() .map(|(step_id, production_indices)| { - let production = - core::ptr::from_ref::(step_id.variable_index.map_or_else( - || &productions[step_id.production_index], - |variable_index| { - &grammar.variables[variable_index].productions[step_id.production_index] - }, - )); + let production = step_id.variable_index.map_or_else( + || &productions[step_id.production_index], + |variable_index| { + &grammar.variables[variable_index].productions[step_id.production_index] + }, + ) as *const Production; ((production, step_id.step_index as u32), production_indices) }) .collect(); @@ -189,38 +187,29 @@ impl InlinedProductionMapBuilder { } } -pub type ProcessInlinesResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ProcessInlinesError { - #[error("External token `{0}` cannot be inlined")] - ExternalToken(String), - #[error("Token `{0}` cannot be inlined")] - Token(String), - #[error("Rule `{0}` cannot be inlined because it is the first rule")] - FirstRule(String), -} - pub(super) fn process_inlines( grammar: &SyntaxGrammar, lexical_grammar: &LexicalGrammar, -) -> ProcessInlinesResult { +) -> Result { for symbol in &grammar.variables_to_inline { match symbol.kind { SymbolType::External => { - Err(ProcessInlinesError::ExternalToken( - grammar.external_tokens[symbol.index].name.clone(), - ))?; + return Err(anyhow!( + "External token `{}` cannot be inlined", + grammar.external_tokens[symbol.index].name + )) } SymbolType::Terminal => { - Err(ProcessInlinesError::Token( - lexical_grammar.variables[symbol.index].name.clone(), - ))?; + return Err(anyhow!( + "Token `{}` cannot be inlined", + lexical_grammar.variables[symbol.index].name, + )) } SymbolType::NonTerminal if symbol.index == 0 => { - Err(ProcessInlinesError::FirstRule( - grammar.variables[symbol.index].name.clone(), - ))?; + return Err(anyhow!( + "Rule `{}` cannot be inlined because it is the first rule", + grammar.variables[symbol.index].name, + )) } _ => {} } @@ -236,7 +225,7 @@ pub(super) fn process_inlines( #[cfg(test)] mod tests { use super::*; - use crate::{ + use crate::generate::{ grammars::{LexicalVariable, SyntaxVariable, VariableType}, rules::{Associativity, Precedence, Symbol}, }; @@ -549,9 +538,10 @@ mod tests { ..Default::default() }; - let result = process_inlines(&grammar, &lexical_grammar); - assert!(result.is_err(), "expected an error, but got none"); - let err = result.err().unwrap(); - assert_eq!(err.to_string(), "Token `something` cannot be inlined",); + if let Err(error) = process_inlines(&grammar, &lexical_grammar) { + assert_eq!(error.to_string(), "Token `something` cannot be inlined"); + } else { + panic!("expected an error, but got none"); + } } } diff --git a/cli/src/generate/prepare_grammar/unicode-categories.json b/cli/src/generate/prepare_grammar/unicode-categories.json new file mode 100644 index 00000000..3a5dd1a0 --- /dev/null +++ b/cli/src/generate/prepare_grammar/unicode-categories.json @@ -0,0 +1 @@ +{"Cc":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159],"Zs":[32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288],"Po":[33,34,35,37,38,39,42,44,46,47,58,59,63,64,92,161,167,182,183,191,894,903,1370,1371,1372,1373,1374,1375,1417,1472,1475,1478,1523,1524,1545,1546,1548,1549,1563,1565,1566,1567,1642,1643,1644,1645,1748,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,2039,2040,2041,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2142,2404,2405,2416,2557,2678,2800,3191,3204,3572,3663,3674,3675,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3860,3973,4048,4049,4050,4051,4052,4057,4058,4170,4171,4172,4173,4174,4175,4347,4960,4961,4962,4963,4964,4965,4966,4967,4968,5742,5867,5868,5869,5941,5942,6100,6101,6102,6104,6105,6106,6144,6145,6146,6147,6148,6149,6151,6152,6153,6154,6468,6469,6686,6687,6816,6817,6818,6819,6820,6821,6822,6824,6825,6826,6827,6828,6829,7002,7003,7004,7005,7006,7007,7008,7037,7038,7164,7165,7166,7167,7227,7228,7229,7230,7231,7294,7295,7360,7361,7362,7363,7364,7365,7366,7367,7379,8214,8215,8224,8225,8226,8227,8228,8229,8230,8231,8240,8241,8242,8243,8244,8245,8246,8247,8248,8251,8252,8253,8254,8257,8258,8259,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8275,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,11513,11514,11515,11516,11518,11519,11632,11776,11777,11782,11783,11784,11787,11790,11791,11792,11793,11794,11795,11796,11797,11798,11800,11801,11803,11806,11807,11818,11819,11820,11821,11822,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11836,11837,11838,11839,11841,11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854,11855,11858,11859,11860,12289,12290,12291,12349,12539,42238,42239,42509,42510,42511,42611,42622,42738,42739,42740,42741,42742,42743,43124,43125,43126,43127,43214,43215,43256,43257,43258,43260,43310,43311,43359,43457,43458,43459,43460,43461,43462,43463,43464,43465,43466,43467,43468,43469,43486,43487,43612,43613,43614,43615,43742,43743,43760,43761,44011,65040,65041,65042,65043,65044,65045,65046,65049,65072,65093,65094,65097,65098,65099,65100,65104,65105,65106,65108,65109,65110,65111,65119,65120,65121,65128,65130,65131,65281,65282,65283,65285,65286,65287,65290,65292,65294,65295,65306,65307,65311,65312,65340,65377,65380,65381,65792,65793,65794,66463,66512,66927,67671,67871],"Sc":[36,162,163,164,165,1423,1547,2046,2047,2546,2547,2555,2801,3065,3647,6107,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,43064,65020,65129,65284,65504,65505,65509,65510],"Ps":[40,91,123,3898,3900,5787,8218,8222,8261,8317,8333,8968,8970,9001,10088,10090,10092,10094,10096,10098,10100,10181,10214,10216,10218,10220,10222,10627,10629,10631,10633,10635,10637,10639,10641,10643,10645,10647,10712,10714,10748,11810,11812,11814,11816,11842,11861,11863,11865,11867,12296,12298,12300,12302,12304,12308,12310,12312,12314,12317,64831,65047,65077,65079,65081,65083,65085,65087,65089,65091,65095,65113,65115,65117,65288,65339,65371,65375,65378],"Pe":[41,93,125,3899,3901,5788,8262,8318,8334,8969,8971,9002,10089,10091,10093,10095,10097,10099,10101,10182,10215,10217,10219,10221,10223,10628,10630,10632,10634,10636,10638,10640,10642,10644,10646,10648,10713,10715,10749,11811,11813,11815,11817,11862,11864,11866,11868,12297,12299,12301,12303,12305,12309,12311,12313,12315,12318,12319,64830,65048,65078,65080,65082,65084,65086,65088,65090,65092,65096,65114,65116,65118,65289,65341,65373,65376,65379],"Sm":[43,60,61,62,124,126,172,177,215,247,1014,1542,1543,1544,8260,8274,8314,8315,8316,8330,8331,8332,8472,8512,8513,8514,8515,8516,8523,8592,8593,8594,8595,8596,8602,8603,8608,8611,8614,8622,8654,8655,8658,8660,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8992,8993,9084,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9180,9181,9182,9183,9184,9185,9655,9665,9720,9721,9722,9723,9724,9725,9726,9727,9839,10176,10177,10178,10179,10180,10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201,10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,10224,10225,10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10496,10497,10498,10499,10500,10501,10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513,10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621,10622,10623,10624,10625,10626,10649,10650,10651,10652,10653,10654,10655,10656,10657,10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693,10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705,10706,10707,10708,10709,10710,10711,10716,10717,10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729,10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10750,10751,10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885,10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957,10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,11006,11007,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11079,11080,11081,11082,11083,11084,64297,65122,65124,65125,65126,65291,65308,65309,65310,65372,65374,65506,65513,65514,65515,65516],"Pd":[45,1418,1470,5120,6150,8208,8209,8210,8211,8212,8213,11799,11802,11834,11835,11840,11869,12316,12336,12448,65073,65074,65112,65123,65293],"Nd":[48,49,50,51,52,53,54,55,56,57,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,66720,66721,66722,66723,66724,66725,66726,66727,66728,66729],"Lu":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,313,315,317,319,321,323,325,327,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,377,379,381,385,386,388,390,391,393,394,395,398,399,400,401,403,404,406,407,408,412,413,415,416,418,420,422,423,425,428,430,431,433,434,435,437,439,440,444,452,455,458,461,463,465,467,469,471,473,475,478,480,482,484,486,488,490,492,494,497,500,502,503,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,570,571,573,574,577,579,580,581,582,584,586,588,590,880,882,886,895,902,904,905,906,908,910,911,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,975,978,979,980,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1012,1015,1017,1018,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7702,7704,7706,7708,7710,7712,7714,7716,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,7828,7838,7840,7842,7844,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,8011,8012,8013,8025,8027,8029,8031,8040,8041,8042,8043,8044,8045,8046,8047,8120,8121,8122,8123,8136,8137,8138,8139,8152,8153,8154,8155,8168,8169,8170,8171,8172,8184,8185,8186,8187,8450,8455,8459,8460,8461,8464,8465,8466,8469,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8496,8497,8498,8499,8510,8511,8517,8579,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11360,11362,11363,11364,11367,11369,11371,11373,11374,11375,11376,11378,11381,11390,11391,11392,11394,11396,11398,11400,11402,11404,11406,11408,11410,11412,11414,11416,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458,11460,11462,11464,11466,11468,11470,11472,11474,11476,11478,11480,11482,11484,11486,11488,11490,11499,11501,11506,42560,42562,42564,42566,42568,42570,42572,42574,42576,42578,42580,42582,42584,42586,42588,42590,42592,42594,42596,42598,42600,42602,42604,42624,42626,42628,42630,42632,42634,42636,42638,42640,42642,42644,42646,42648,42650,42786,42788,42790,42792,42794,42796,42798,42802,42804,42806,42808,42810,42812,42814,42816,42818,42820,42822,42824,42826,42828,42830,42832,42834,42836,42838,42840,42842,42844,42846,42848,42850,42852,42854,42856,42858,42860,42862,42873,42875,42877,42878,42880,42882,42884,42886,42891,42893,42896,42898,42902,42904,42906,42908,42910,42912,42914,42916,42918,42920,42922,42923,42924,42925,42926,42928,42929,42930,42931,42932,42934,42936,42938,42940,42942,42944,42946,42948,42949,42950,42951,42953,42960,42966,42968,42997,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965],"Sk":[94,96,168,175,180,184,706,707,708,709,722,723,724,725,726,727,728,729,730,731,732,733,734,735,741,742,743,744,745,746,747,749,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,885,900,901,2184,8125,8127,8128,8129,8141,8142,8143,8157,8158,8159,8173,8174,8175,8189,8190,12443,12444,42752,42753,42754,42755,42756,42757,42758,42759,42760,42761,42762,42763,42764,42765,42766,42767,42768,42769,42770,42771,42772,42773,42774,42784,42785,42889,42890,43867,43882,43883,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64450,65342,65344,65507],"Pc":[95,8255,8256,8276,65075,65076,65101,65102,65103,65343],"Ll":[97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,181,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293,295,297,299,301,303,305,307,309,311,312,314,316,318,320,322,324,326,328,329,331,333,335,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,378,380,382,383,384,387,389,392,396,397,402,405,409,410,411,414,417,419,421,424,426,427,429,432,436,438,441,442,445,446,447,454,457,460,462,464,466,468,470,472,474,476,477,479,481,483,485,487,489,491,493,495,496,499,501,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,564,565,566,567,568,569,572,575,576,578,583,585,587,589,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,881,883,887,891,892,893,912,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,976,977,981,982,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1008,1009,1010,1011,1013,1016,1019,1020,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1218,1220,1222,1224,1226,1228,1230,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4349,4350,4351,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825,7827,7829,7830,7831,7832,7833,7834,7835,7836,7837,7839,7841,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7897,7899,7901,7903,7905,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,7936,7937,7938,7939,7940,7941,7942,7943,7952,7953,7954,7955,7956,7957,7968,7969,7970,7971,7972,7973,7974,7975,7984,7985,7986,7987,7988,7989,7990,7991,8000,8001,8002,8003,8004,8005,8016,8017,8018,8019,8020,8021,8022,8023,8032,8033,8034,8035,8036,8037,8038,8039,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8080,8081,8082,8083,8084,8085,8086,8087,8096,8097,8098,8099,8100,8101,8102,8103,8112,8113,8114,8115,8116,8118,8119,8126,8130,8131,8132,8134,8135,8144,8145,8146,8147,8150,8151,8160,8161,8162,8163,8164,8165,8166,8167,8178,8179,8180,8182,8183,8458,8462,8463,8467,8495,8500,8505,8508,8509,8518,8519,8520,8521,8526,8580,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11361,11365,11366,11368,11370,11372,11377,11379,11380,11382,11383,11384,11385,11386,11387,11393,11395,11397,11399,11401,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11433,11435,11437,11439,11441,11443,11445,11447,11449,11451,11453,11455,11457,11459,11461,11463,11465,11467,11469,11471,11473,11475,11477,11479,11481,11483,11485,11487,11489,11491,11492,11500,11502,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42561,42563,42565,42567,42569,42571,42573,42575,42577,42579,42581,42583,42585,42587,42589,42591,42593,42595,42597,42599,42601,42603,42605,42625,42627,42629,42631,42633,42635,42637,42639,42641,42643,42645,42647,42649,42651,42787,42789,42791,42793,42795,42797,42799,42800,42801,42803,42805,42807,42809,42811,42813,42815,42817,42819,42821,42823,42825,42827,42829,42831,42833,42835,42837,42839,42841,42843,42845,42847,42849,42851,42853,42855,42857,42859,42861,42863,42865,42866,42867,42868,42869,42870,42871,42872,42874,42876,42879,42881,42883,42885,42887,42892,42894,42897,42899,42900,42901,42903,42905,42907,42909,42911,42913,42915,42917,42919,42921,42927,42933,42935,42937,42939,42941,42943,42945,42947,42952,42954,42961,42963,42965,42967,42969,42998,43002,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43872,43873,43874,43875,43876,43877,43878,43879,43880,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004],"So":[166,169,174,176,1154,1421,1422,1550,1551,1758,1769,1789,1790,2038,2554,2928,3059,3060,3061,3062,3063,3064,3066,3199,3407,3449,3841,3842,3843,3859,3861,3862,3863,3866,3867,3868,3869,3870,3871,3892,3894,3896,4030,4031,4032,4033,4034,4035,4036,4037,4039,4040,4041,4042,4043,4044,4046,4047,4053,4054,4055,4056,4254,4255,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5741,6464,6622,6623,6624,6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,7009,7010,7011,7012,7013,7014,7015,7016,7017,7018,7028,7029,7030,7031,7032,7033,7034,7035,7036,8448,8449,8451,8452,8453,8454,8456,8457,8468,8470,8471,8478,8479,8480,8481,8482,8483,8485,8487,8489,8494,8506,8507,8522,8524,8525,8527,8586,8587,8597,8598,8599,8600,8601,8604,8605,8606,8607,8609,8610,8612,8613,8615,8616,8617,8618,8619,8620,8621,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8656,8657,8659,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8960,8961,8962,8963,8964,8965,8966,8967,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8994,8995,8996,8997,8998,8999,9000,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9656,9657,9658,9659,9660,9661,9662,9663,9664,9666,9667,9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682,9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697,9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715,9716,9717,9718,9719,9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742,9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021,10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033,10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,10082,10083,10084,10085,10086,10087,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141,10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153,10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165,10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345,10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357,10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393,10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429,10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441,10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029,11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053,11054,11055,11077,11078,11085,11086,11087,11088,11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150,11151,11152,11153,11154,11155,11156,11157,11159,11160,11161,11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185,11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197,11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209,11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11493,11494,11495,11496,11497,11498,11856,11857,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914,11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928,11929,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12032,12033,12034,12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058,12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118,12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130,12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166,12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286,12287,12292,12306,12307,12320,12342,12343,12350,12351,12688,12689,12694,12695,12696,12697,12698,12699,12700,12701,12702,12703,12736,12737,12738,12739,12740,12741,12742,12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12783,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,12828,12829,12830,12842,12843,12844,12845,12846,12847,12848,12849,12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862,12863,12864,12865,12866,12867,12868,12869,12870,12871,12880,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926,12927,12938,12939,12940,12941,12942,12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973,12974,12975,12976,12992,12993,12994,12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018,13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030,13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114,13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126,13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138,13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174,13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270,13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306,13307,13308,13309,13310,13311,19904,19905,19906,19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918,19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930,19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942,19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954,19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966,19967,42128,42129,42130,42131,42132,42133,42134,42135,42136,42137,42138,42139,42140,42141,42142,42143,42144,42145,42146,42147,42148,42149,42150,42151,42152,42153,42154,42155,42156,42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169,42170,42171,42172,42173,42174,42175,42176,42177,42178,42179,42180,42181,42182,43048,43049,43050,43051,43062,43063,43065,43639,43640,43641,64832,64833,64834,64835,64836,64837,64838,64839,64840,64841,64842,64843,64844,64845,64846,64847,64975,65021,65022,65023,65508,65512,65517,65518,65532,65533,65847,65848,65849,65850,65851,65852,65853,65854,65855,65913,65914,65915,65916,65917,65918,65919,65920,65921,65922,65923,65924,65925,65926,65927,65928,65929,65932,65933,65934,65936,65937,65938,65939,65940,65941,65942,65943,65944,65945,65946,65947,65948,65952,66000,66001,66002,66003,66004,66005,66006,66007,66008,66009,66010,66011,66012,66013,66014,66015,66016,66017,66018,66019,66020,66021,66022,66023,66024,66025,66026,66027,66028,66029,66030,66031,66032,66033,66034,66035,66036,66037,66038,66039,66040,66041,66042,66043,66044,67703,67704],"Lo":[170,186,443,448,449,450,451,660,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2185,2186,2187,2188,2189,2190,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2556,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2809,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3160,3161,3162,3165,3168,3169,3200,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3293,3294,3296,3297,3313,3314,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3412,3413,3414,3423,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3648,3649,3650,3651,3652,3653,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,6988,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7401,7402,7403,7404,7406,7407,7408,7409,7410,7411,7413,7414,7418,8501,8502,8503,8504,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,12294,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,19903,19968,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42606,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42895,42999,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43261,43262,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43488,43489,43490,43491,43492,43495,43496,43497,43498,43499,43500,43501,43502,43503,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43633,43634,43635,43636,43637,43638,43642,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66370,66371,66372,66373,66374,66375,66376,66377,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861],"Pi":[171,8216,8219,8220,8223,8249,11778,11780,11785,11788,11804,11808],"Cf":[173,1536,1537,1538,1539,1540,1541,1564,1757,1807,2192,2193,2274,6158,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8288,8289,8290,8291,8292,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,65279,65529,65530,65531],"No":[178,179,185,188,189,190,2548,2549,2550,2551,2552,2553,2930,2931,2932,2933,2934,2935,3056,3057,3058,3192,3193,3194,3195,3196,3197,3198,3416,3417,3418,3419,3420,3421,3422,3440,3441,3442,3443,3444,3445,3446,3447,3448,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,6128,6129,6130,6131,6132,6133,6134,6135,6136,6137,6618,8304,8308,8309,8310,8311,8312,8313,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8585,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9450,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,10102,10103,10104,10105,10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129,10130,10131,11517,12690,12691,12692,12693,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,12872,12873,12874,12875,12876,12877,12878,12879,12881,12882,12883,12884,12885,12886,12887,12888,12889,12890,12891,12892,12893,12894,12895,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989,12990,12991,43056,43057,43058,43059,43060,43061,65799,65800,65801,65802,65803,65804,65805,65806,65807,65808,65809,65810,65811,65812,65813,65814,65815,65816,65817,65818,65819,65820,65821,65822,65823,65824,65825,65826,65827,65828,65829,65830,65831,65832,65833,65834,65835,65836,65837,65838,65839,65840,65841,65842,65843,65909,65910,65911,65912,65930,65931,66273,66274,66275,66276,66277,66278,66279,66280,66281,66282,66283,66284,66285,66286,66287,66288,66289,66290,66291,66292,66293,66294,66295,66296,66297,66298,66299,66336,66337,66338,66339,67672,67673,67674,67675,67676,67677,67678,67679,67705,67706,67707,67708,67709,67710,67711,67751,67752,67753,67754,67755,67756,67757,67758,67759,67835,67836,67837,67838,67839,67862,67863,67864,67865,67866,67867],"Pf":[187,8217,8221,8250,11779,11781,11786,11789,11805,11809],"Lt":[453,456,459,498,8072,8073,8074,8075,8076,8077,8078,8079,8088,8089,8090,8091,8092,8093,8094,8095,8104,8105,8106,8107,8108,8109,8110,8111,8124,8140,8188],"Lm":[688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,884,890,1369,1600,1765,1766,2036,2037,2042,2074,2084,2088,2249,2417,3654,3782,4348,6103,6211,6823,7288,7289,7290,7291,7292,7293,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7544,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,11388,11389,11631,11823,12293,12337,12338,12339,12340,12341,12347,12445,12446,12540,12541,12542,40981,42232,42233,42234,42235,42236,42237,42508,42623,42652,42653,42775,42776,42777,42778,42779,42780,42781,42782,42783,42864,42888,42994,42995,42996,43000,43001,43471,43494,43632,43741,43763,43764,43868,43869,43870,43871,43881,65392,65438,65439,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514],"Mn":[768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,1155,1156,1157,1158,1159,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1648,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1767,1768,1770,1771,1772,1773,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,2027,2028,2029,2030,2031,2032,2033,2034,2035,2045,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2137,2138,2139,2200,2201,2202,2203,2204,2205,2206,2207,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2362,2364,2369,2370,2371,2372,2373,2374,2375,2376,2381,2385,2386,2387,2388,2389,2390,2391,2402,2403,2433,2492,2497,2498,2499,2500,2509,2530,2531,2558,2561,2562,2620,2625,2626,2631,2632,2635,2636,2637,2641,2672,2673,2677,2689,2690,2748,2753,2754,2755,2756,2757,2759,2760,2765,2786,2787,2810,2811,2812,2813,2814,2815,2817,2876,2879,2881,2882,2883,2884,2893,2901,2902,2914,2915,2946,3008,3021,3072,3076,3132,3134,3135,3136,3142,3143,3144,3146,3147,3148,3149,3157,3158,3170,3171,3201,3260,3263,3270,3276,3277,3298,3299,3328,3329,3387,3388,3393,3394,3395,3396,3405,3426,3427,3457,3530,3538,3539,3540,3542,3633,3636,3637,3638,3639,3640,3641,3642,3655,3656,3657,3658,3659,3660,3661,3662,3761,3764,3765,3766,3767,3768,3769,3770,3771,3772,3784,3785,3786,3787,3788,3789,3790,3864,3865,3893,3895,3897,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3968,3969,3970,3971,3972,3974,3975,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4141,4142,4143,4144,4146,4147,4148,4149,4150,4151,4153,4154,4157,4158,4184,4185,4190,4191,4192,4209,4210,4211,4212,4226,4229,4230,4237,4253,4957,4958,4959,5906,5907,5908,5938,5939,5970,5971,6002,6003,6068,6069,6071,6072,6073,6074,6075,6076,6077,6086,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6109,6155,6156,6157,6159,6277,6278,6313,6432,6433,6434,6439,6440,6450,6457,6458,6459,6679,6680,6683,6742,6744,6745,6746,6747,6748,6749,6750,6752,6754,6757,6758,6759,6760,6761,6762,6763,6764,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6912,6913,6914,6915,6964,6966,6967,6968,6969,6970,6972,6978,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7074,7075,7076,7077,7080,7081,7083,7084,7085,7142,7144,7145,7149,7151,7152,7153,7212,7213,7214,7215,7216,7217,7218,7219,7222,7223,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7394,7395,7396,7397,7398,7399,7400,7405,7412,7416,7417,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,11503,11504,11505,11647,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12330,12331,12332,12333,12441,12442,42607,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42654,42655,42736,42737,43010,43014,43019,43045,43046,43052,43204,43205,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43263,43302,43303,43304,43305,43306,43307,43308,43309,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43392,43393,43394,43443,43446,43447,43448,43449,43452,43453,43493,43561,43562,43563,43564,43565,43566,43569,43570,43573,43574,43587,43596,43644,43696,43698,43699,43700,43703,43704,43710,43711,43713,43756,43757,43766,44005,44008,44013,64286,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,66045,66272,66422,66423,66424,66425,66426],"Me":[1160,1161,6846,8413,8414,8415,8416,8418,8419,8420,42608,42609,42610],"Mc":[2307,2363,2366,2367,2368,2377,2378,2379,2380,2382,2383,2434,2435,2494,2495,2496,2503,2504,2507,2508,2519,2563,2622,2623,2624,2691,2750,2751,2752,2761,2763,2764,2818,2819,2878,2880,2887,2888,2891,2892,2903,3006,3007,3009,3010,3014,3015,3016,3018,3019,3020,3031,3073,3074,3075,3137,3138,3139,3140,3202,3203,3262,3264,3265,3266,3267,3268,3271,3272,3274,3275,3285,3286,3315,3330,3331,3390,3391,3392,3398,3399,3400,3402,3403,3404,3415,3458,3459,3535,3536,3537,3544,3545,3546,3547,3548,3549,3550,3551,3570,3571,3902,3903,3967,4139,4140,4145,4152,4155,4156,4182,4183,4194,4195,4196,4199,4200,4201,4202,4203,4204,4205,4227,4228,4231,4232,4233,4234,4235,4236,4239,4250,4251,4252,5909,5940,6070,6078,6079,6080,6081,6082,6083,6084,6085,6087,6088,6435,6436,6437,6438,6441,6442,6443,6448,6449,6451,6452,6453,6454,6455,6456,6681,6682,6741,6743,6753,6755,6756,6765,6766,6767,6768,6769,6770,6916,6965,6971,6973,6974,6975,6976,6977,6979,6980,7042,7073,7078,7079,7082,7143,7146,7147,7148,7150,7154,7155,7204,7205,7206,7207,7208,7209,7210,7211,7220,7221,7393,7415,12334,12335,43043,43044,43047,43136,43137,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43346,43347,43395,43444,43445,43450,43451,43454,43455,43456,43567,43568,43571,43572,43597,43643,43645,43755,43758,43759,43765,44003,44004,44006,44007,44009,44010,44012],"Nl":[5870,5871,5872,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8581,8582,8583,8584,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12344,12345,12346,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,66369,66378,66513,66514,66515,66516,66517],"Zl":[8232],"Zp":[8233],"Cs":[55296,56191,56192,56319,56320,57343],"Co":[57344,63743]} \ No newline at end of file diff --git a/cli/src/generate/prepare_grammar/unicode-category-aliases.json b/cli/src/generate/prepare_grammar/unicode-category-aliases.json new file mode 100644 index 00000000..c7091c05 --- /dev/null +++ b/cli/src/generate/prepare_grammar/unicode-category-aliases.json @@ -0,0 +1 @@ +{"Other":"C","Control":"Cc","cntrl":"Cc","Format":"Cf","Unassigned":"Cn","Private_Use":"Co","Surrogate":"Cs","Letter":"L","Cased_Letter":"LC","Lowercase_Letter":"Ll","Modifier_Letter":"Lm","Other_Letter":"Lo","Titlecase_Letter":"Lt","Uppercase_Letter":"Lu","Mark":"M","Combining_Mark":"M","Spacing_Mark":"Mc","Enclosing_Mark":"Me","Nonspacing_Mark":"Mn","Number":"N","Decimal_Number":"Nd","digit":"Nd","Letter_Number":"Nl","Other_Number":"No","Punctuation":"P","punct":"P","Connector_Punctuation":"Pc","Dash_Punctuation":"Pd","Close_Punctuation":"Pe","Final_Punctuation":"Pf","Initial_Punctuation":"Pi","Other_Punctuation":"Po","Open_Punctuation":"Ps","Symbol":"S","Currency_Symbol":"Sc","Modifier_Symbol":"Sk","Math_Symbol":"Sm","Other_Symbol":"So","Separator":"Z","Line_Separator":"Zl","Paragraph_Separator":"Zp","Space_Separator":"Zs"} \ No newline at end of file diff --git a/cli/src/generate/prepare_grammar/unicode-properties.json b/cli/src/generate/prepare_grammar/unicode-properties.json new file mode 100644 index 00000000..9e5be485 --- /dev/null +++ b/cli/src/generate/prepare_grammar/unicode-properties.json @@ -0,0 +1 @@ +{"White_Space":[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],"Bidi_Control":[1564,8206,8207,8234,8235,8236,8237,8238,8294,8295,8296,8297],"Join_Control":[8204,8205],"Dash":[45,1418,1470,5120,6150,8208,8209,8210,8211,8212,8213,8275,8315,8331,8722,11799,11802,11834,11835,11840,11869,12316,12336,12448,65073,65074,65112,65123,65293,69293],"Hyphen":[45,173,1418,6150,8208,8209,11799,12539,65123,65293,65381],"Quotation_Mark":[34,39,171,187,8216,8217,8218,8219,8220,8221,8222,8223,8249,8250,11842,12300,12301,12302,12303,12317,12318,12319,65089,65090,65091,65092,65282,65287,65378,65379],"Terminal_Punctuation":[33,44,46,58,59,63,894,903,1417,1475,1548,1563,1565,1566,1567,1748,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1804,2040,2041,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2142,2404,2405,3674,3675,3848,3853,3854,3855,3856,3857,3858,4170,4171,4961,4962,4963,4964,4965,4966,4967,4968,5742,5867,5868,5869,5941,5942,6100,6101,6102,6106,6146,6147,6148,6149,6152,6153,6468,6469,6824,6825,6826,6827,7002,7003,7005,7006,7007,7037,7038,7227,7228,7229,7230,7231,7294,7295,8252,8253,8263,8264,8265,11822,11836,11841,11852,11854,11855,11859,11860,12289,12290,42238,42239,42509,42510,42511,42739,42740,42741,42742,42743,43126,43127,43214,43215,43311,43463,43464,43465,43613,43614,43615,43743,43760,43761,44011,65104,65105,65106,65108,65109,65110,65111,65281,65292,65294,65306,65307,65311,65377,65380,66463,66512,67671,67871,68182,68183,68336,68337,68338,68339,68340,68341,68410,68411,68412,68413,68414,68415,68505,68506,68507,68508,69461,69462,69463,69464,69465,69510,69511,69512,69513,69703,69704,69705,69706,69707,69708,69709,69822,69823,69824,69825,69953,69954,69955,70085,70086,70093,70110,70111,70200,70201,70202,70203,70204,70313,70731,70732,70733,70746,70747,71106,71107,71108,71109,71113,71114,71115,71116,71117,71118,71119,71120,71121,71122,71123,71124,71125,71126,71127,71233,71234,71484,71485,71486,72004,72006,72258,72259,72347,72348,72353,72354,72769,72770,72771,72817,73463,73464,73539,73540,74864,74865,74866,74867,74868,92782,92783,92917,92983,92984,92985,92996,93847,93848,113823,121479,121480,121481,121482],"Other_Math":[94,976,977,978,981,1008,1009,1012,1013,8214,8242,8243,8244,8256,8289,8290,8291,8292,8317,8318,8333,8334,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8427,8428,8429,8430,8431,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8473,8474,8475,8476,8477,8484,8488,8489,8492,8493,8495,8496,8497,8499,8500,8501,8502,8503,8504,8508,8509,8510,8511,8517,8518,8519,8520,8521,8597,8598,8599,8600,8601,8604,8605,8606,8607,8609,8610,8612,8613,8615,8617,8618,8619,8620,8621,8624,8625,8630,8631,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8656,8657,8659,8661,8662,8663,8664,8665,8666,8667,8669,8676,8677,8968,8969,8970,8971,9140,9141,9143,9168,9186,9632,9633,9646,9647,9648,9649,9650,9651,9652,9653,9654,9660,9661,9662,9663,9664,9670,9671,9674,9675,9679,9680,9681,9682,9683,9698,9700,9703,9704,9705,9706,9707,9708,9733,9734,9792,9794,9824,9825,9826,9827,9837,9838,10181,10182,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648,10712,10713,10714,10715,10748,10749,65121,65123,65128,65340,65342,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,120782,120783,120784,120785,120786,120787,120788,120789,120790,120791,120792,120793,120794,120795,120796,120797,120798,120799,120800,120801,120802,120803,120804,120805,120806,120807,120808,120809,120810,120811,120812,120813,120814,120815,120816,120817,120818,120819,120820,120821,120822,120823,120824,120825,120826,120827,120828,120829,120830,120831,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651],"Hex_Digit":[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,97,98,99,100,101,102,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65313,65314,65315,65316,65317,65318,65345,65346,65347,65348,65349,65350],"ASCII_Hex_Digit":[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,97,98,99,100,101,102],"Other_Alphabetic":[837,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1625,1626,1627,1628,1629,1630,1631,1648,1750,1751,1752,1753,1754,1755,1756,1761,1762,1763,1764,1767,1768,1773,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,2070,2071,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2275,2276,2277,2278,2279,2280,2281,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2362,2363,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2382,2383,2389,2390,2391,2402,2403,2433,2434,2435,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2519,2530,2531,2561,2562,2563,2622,2623,2624,2625,2626,2631,2632,2635,2636,2641,2672,2673,2677,2689,2690,2691,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2786,2787,2810,2811,2812,2817,2818,2819,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2902,2903,2914,2915,2946,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3031,3072,3073,3074,3075,3076,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3157,3158,3170,3171,3201,3202,3203,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3285,3286,3298,3299,3315,3328,3329,3330,3331,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3415,3426,3427,3457,3458,3459,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3570,3571,3633,3636,3637,3638,3639,3640,3641,3642,3661,3761,3764,3765,3766,3767,3768,3769,3771,3772,3789,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4152,4155,4156,4157,4158,4182,4183,4184,4185,4190,4191,4192,4194,4195,4196,4199,4200,4201,4202,4203,4204,4205,4209,4210,4211,4212,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4239,4250,4251,4252,4253,5906,5907,5938,5939,5970,5971,6002,6003,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6277,6278,6313,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6679,6680,6681,6682,6683,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6847,6848,6860,6861,6862,6912,6913,6914,6915,6916,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,7040,7041,7042,7073,7074,7075,7076,7077,7078,7079,7080,7081,7084,7085,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,42612,42613,42614,42615,42616,42617,42618,42619,42654,42655,43010,43019,43043,43044,43045,43046,43047,43136,43137,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43205,43263,43302,43303,43304,43305,43306,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43392,43393,43394,43395,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43493,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43587,43596,43597,43643,43644,43645,43696,43698,43699,43700,43703,43704,43710,43755,43756,43757,43758,43759,43765,44003,44004,44005,44006,44007,44008,44009,44010,64286,66422,66423,66424,66425,66426,68097,68098,68099,68101,68102,68108,68109,68110,68111,68900,68901,68902,68903,69291,69292,69632,69633,69634,69688,69689,69690,69691,69692,69693,69694,69695,69696,69697,69698,69699,69700,69701,69747,69748,69760,69761,69762,69808,69809,69810,69811,69812,69813,69814,69815,69816,69826,69888,69889,69890,69927,69928,69929,69930,69931,69932,69933,69934,69935,69936,69937,69938,69957,69958,70016,70017,70018,70067,70068,70069,70070,70071,70072,70073,70074,70075,70076,70077,70078,70079,70094,70095,70188,70189,70190,70191,70192,70193,70194,70195,70196,70199,70206,70209,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70400,70401,70402,70403,70462,70463,70464,70465,70466,70467,70468,70471,70472,70475,70476,70487,70498,70499,70709,70710,70711,70712,70713,70714,70715,70716,70717,70718,70719,70720,70721,70723,70724,70725,70832,70833,70834,70835,70836,70837,70838,70839,70840,70841,70842,70843,70844,70845,70846,70847,70848,70849,71087,71088,71089,71090,71091,71092,71093,71096,71097,71098,71099,71100,71101,71102,71132,71133,71216,71217,71218,71219,71220,71221,71222,71223,71224,71225,71226,71227,71228,71229,71230,71232,71339,71340,71341,71342,71343,71344,71345,71346,71347,71348,71349,71453,71454,71455,71456,71457,71458,71459,71460,71461,71462,71463,71464,71465,71466,71724,71725,71726,71727,71728,71729,71730,71731,71732,71733,71734,71735,71736,71984,71985,71986,71987,71988,71989,71991,71992,71995,71996,72000,72002,72145,72146,72147,72148,72149,72150,72151,72154,72155,72156,72157,72158,72159,72164,72193,72194,72195,72196,72197,72198,72199,72200,72201,72202,72245,72246,72247,72248,72249,72251,72252,72253,72254,72273,72274,72275,72276,72277,72278,72279,72280,72281,72282,72283,72330,72331,72332,72333,72334,72335,72336,72337,72338,72339,72340,72341,72342,72343,72751,72752,72753,72754,72755,72756,72757,72758,72760,72761,72762,72763,72764,72765,72766,72850,72851,72852,72853,72854,72855,72856,72857,72858,72859,72860,72861,72862,72863,72864,72865,72866,72867,72868,72869,72870,72871,72873,72874,72875,72876,72877,72878,72879,72880,72881,72882,72883,72884,72885,72886,73009,73010,73011,73012,73013,73014,73018,73020,73021,73023,73024,73025,73027,73031,73098,73099,73100,73101,73102,73104,73105,73107,73108,73109,73110,73459,73460,73461,73462,73472,73473,73475,73524,73525,73526,73527,73528,73529,73530,73534,73535,73536,94031,94033,94034,94035,94036,94037,94038,94039,94040,94041,94042,94043,94044,94045,94046,94047,94048,94049,94050,94051,94052,94053,94054,94055,94056,94057,94058,94059,94060,94061,94062,94063,94064,94065,94066,94067,94068,94069,94070,94071,94072,94073,94074,94075,94076,94077,94078,94079,94080,94081,94082,94083,94084,94085,94086,94087,94095,94096,94097,94098,94192,94193,113822,122880,122881,122882,122883,122884,122885,122886,122888,122889,122890,122891,122892,122893,122894,122895,122896,122897,122898,122899,122900,122901,122902,122903,122904,122907,122908,122909,122910,122911,122912,122913,122915,122916,122918,122919,122920,122921,122922,123023,125255,127280,127281,127282,127283,127284,127285,127286,127287,127288,127289,127290,127291,127292,127293,127294,127295,127296,127297,127298,127299,127300,127301,127302,127303,127304,127305,127312,127313,127314,127315,127316,127317,127318,127319,127320,127321,127322,127323,127324,127325,127326,127327,127328,127329,127330,127331,127332,127333,127334,127335,127336,127337,127344,127345,127346,127347,127348,127349,127350,127351,127352,127353,127354,127355,127356,127357,127358,127359,127360,127361,127362,127363,127364,127365,127366,127367,127368,127369],"Ideographic":[12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12344,12345,12346,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,94180,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743],"Diacritic":[94,96,168,175,180,183,184,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,848,849,850,851,852,853,854,855,861,862,863,864,865,866,884,885,890,900,901,1155,1156,1157,1158,1159,1369,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1611,1612,1613,1614,1615,1616,1617,1618,1623,1624,1759,1760,1765,1766,1770,1771,1772,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2072,2073,2200,2201,2202,2203,2204,2205,2206,2207,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2364,2381,2385,2386,2387,2388,2417,2492,2509,2620,2637,2748,2765,2813,2814,2815,2876,2893,2901,3021,3132,3149,3260,3277,3387,3388,3405,3530,3655,3656,3657,3658,3659,3660,3662,3770,3784,3785,3786,3787,3788,3864,3865,3893,3895,3897,3902,3903,3970,3971,3972,3974,3975,4038,4151,4153,4154,4195,4196,4201,4202,4203,4204,4205,4231,4232,4233,4234,4235,4236,4237,4239,4250,4251,4957,4958,4959,5908,5909,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6109,6457,6458,6459,6773,6774,6775,6776,6777,6778,6779,6780,6783,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6849,6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6964,6980,7019,7020,7021,7022,7023,7024,7025,7026,7027,7082,7083,7222,7223,7288,7289,7290,7291,7292,7293,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7405,7412,7415,7416,7417,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,8125,8127,8128,8129,8141,8142,8143,8157,8158,8159,8173,8174,8175,8189,8190,11503,11504,11505,11823,12330,12331,12332,12333,12334,12335,12441,12442,12443,12444,12540,42607,42620,42621,42623,42652,42653,42736,42737,42752,42753,42754,42755,42756,42757,42758,42759,42760,42761,42762,42763,42764,42765,42766,42767,42768,42769,42770,42771,42772,42773,42774,42775,42776,42777,42778,42779,42780,42781,42782,42783,42784,42785,42888,42889,42890,43000,43001,43204,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43307,43308,43309,43310,43347,43443,43456,43493,43643,43644,43645,43711,43712,43713,43714,43766,43867,43868,43869,43870,43871,43881,43882,43883,44012,44013,64286,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65342,65344,65392,65438,65439,65507,66272,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,68325,68326,68898,68899,68900,68901,68902,68903,69373,69374,69375,69446,69447,69448,69449,69450,69451,69452,69453,69454,69455,69456,69506,69507,69508,69509,69702,69744,69817,69818,69939,69940,70003,70080,70090,70091,70092,70197,70198,70377,70378,70460,70477,70502,70503,70504,70505,70506,70507,70508,70512,70513,70514,70515,70516,70722,70726,70850,70851,71103,71104,71231,71350,71351,71467,71737,71738,71997,71998,72003,72160,72244,72263,72345,72767,73026,73028,73029,73111,78919,78920,78921,78922,78923,78924,78925,78926,78927,78928,78929,78930,78931,78932,78933,92912,92913,92914,92915,92916,92976,92977,92978,92979,92980,92981,92982,94095,94096,94097,94098,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94192,94193,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,118528,118529,118530,118531,118532,118533,118534,118535,118536,118537,118538,118539,118540,118541,118542,118543,118544,118545,118546,118547,118548,118549,118550,118551,118552,118553,118554,118555,118556,118557,118558,118559,118560,118561,118562,118563,118564,118565,118566,118567,118568,118569,118570,118571,118572,118573,118576,118577,118578,118579,118580,118581,118582,118583,118584,118585,118586,118587,118588,118589,118590,118591,118592,118593,118594,118595,118596,118597,118598,119143,119144,119145,119149,119150,119151,119152,119153,119154,119163,119164,119165,119166,119167,119168,119169,119170,119173,119174,119175,119176,119177,119178,119179,119210,119211,119212,119213,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123184,123185,123186,123187,123188,123189,123190,123566,123628,123629,123630,123631,125136,125137,125138,125139,125140,125141,125142,125252,125253,125254,125256,125257,125258],"Extender":[183,720,721,1600,2042,2901,3654,3782,6154,6211,6823,7222,7291,12293,12337,12338,12339,12340,12341,12445,12446,12540,12541,12542,40981,42508,43471,43494,43632,43741,43763,43764,65392,67457,67458,70493,71110,71111,71112,72344,92994,92995,94176,94177,94179,123196,123197,125252,125253,125254],"Other_Lowercase":[170,186,688,689,690,691,692,693,694,695,696,704,705,736,737,738,739,740,837,890,4348,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7544,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11388,11389,42652,42653,42864,42994,42995,42996,43000,43001,43868,43869,43870,43871,43881,67456,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989],"Other_Uppercase":[8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,127280,127281,127282,127283,127284,127285,127286,127287,127288,127289,127290,127291,127292,127293,127294,127295,127296,127297,127298,127299,127300,127301,127302,127303,127304,127305,127312,127313,127314,127315,127316,127317,127318,127319,127320,127321,127322,127323,127324,127325,127326,127327,127328,127329,127330,127331,127332,127333,127334,127335,127336,127337,127344,127345,127346,127347,127348,127349,127350,127351,127352,127353,127354,127355,127356,127357,127358,127359,127360,127361,127362,127363,127364,127365,127366,127367,127368,127369],"Noncharacter_Code_Point":[64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111],"Other_Grapheme_Extend":[2494,2519,2878,2903,3006,3031,3266,3285,3286,3390,3415,3535,3551,6965,8204,12334,12335,65438,65439,70462,70487,70832,70845,71087,71984,119141,119150,119151,119152,119153,119154,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631],"IDS_Binary_Operator":[12272,12273,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12783],"IDS_Trinary_Operator":[12274,12275],"IDS_Unary_Operator":[12286,12287],"Radical":[11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914,11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928,11929,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12032,12033,12034,12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058,12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118,12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130,12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166,12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245],"Unified_Ideograph":[13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,64014,64015,64017,64019,64020,64031,64033,64035,64036,64039,64040,64041,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743],"Other_Default_Ignorable_Code_Point":[847,4447,4448,6068,6069,8293,12644,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,917504,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917632,917633,917634,917635,917636,917637,917638,917639,917640,917641,917642,917643,917644,917645,917646,917647,917648,917649,917650,917651,917652,917653,917654,917655,917656,917657,917658,917659,917660,917661,917662,917663,917664,917665,917666,917667,917668,917669,917670,917671,917672,917673,917674,917675,917676,917677,917678,917679,917680,917681,917682,917683,917684,917685,917686,917687,917688,917689,917690,917691,917692,917693,917694,917695,917696,917697,917698,917699,917700,917701,917702,917703,917704,917705,917706,917707,917708,917709,917710,917711,917712,917713,917714,917715,917716,917717,917718,917719,917720,917721,917722,917723,917724,917725,917726,917727,917728,917729,917730,917731,917732,917733,917734,917735,917736,917737,917738,917739,917740,917741,917742,917743,917744,917745,917746,917747,917748,917749,917750,917751,917752,917753,917754,917755,917756,917757,917758,917759,918000,918001,918002,918003,918004,918005,918006,918007,918008,918009,918010,918011,918012,918013,918014,918015,918016,918017,918018,918019,918020,918021,918022,918023,918024,918025,918026,918027,918028,918029,918030,918031,918032,918033,918034,918035,918036,918037,918038,918039,918040,918041,918042,918043,918044,918045,918046,918047,918048,918049,918050,918051,918052,918053,918054,918055,918056,918057,918058,918059,918060,918061,918062,918063,918064,918065,918066,918067,918068,918069,918070,918071,918072,918073,918074,918075,918076,918077,918078,918079,918080,918081,918082,918083,918084,918085,918086,918087,918088,918089,918090,918091,918092,918093,918094,918095,918096,918097,918098,918099,918100,918101,918102,918103,918104,918105,918106,918107,918108,918109,918110,918111,918112,918113,918114,918115,918116,918117,918118,918119,918120,918121,918122,918123,918124,918125,918126,918127,918128,918129,918130,918131,918132,918133,918134,918135,918136,918137,918138,918139,918140,918141,918142,918143,918144,918145,918146,918147,918148,918149,918150,918151,918152,918153,918154,918155,918156,918157,918158,918159,918160,918161,918162,918163,918164,918165,918166,918167,918168,918169,918170,918171,918172,918173,918174,918175,918176,918177,918178,918179,918180,918181,918182,918183,918184,918185,918186,918187,918188,918189,918190,918191,918192,918193,918194,918195,918196,918197,918198,918199,918200,918201,918202,918203,918204,918205,918206,918207,918208,918209,918210,918211,918212,918213,918214,918215,918216,918217,918218,918219,918220,918221,918222,918223,918224,918225,918226,918227,918228,918229,918230,918231,918232,918233,918234,918235,918236,918237,918238,918239,918240,918241,918242,918243,918244,918245,918246,918247,918248,918249,918250,918251,918252,918253,918254,918255,918256,918257,918258,918259,918260,918261,918262,918263,918264,918265,918266,918267,918268,918269,918270,918271,918272,918273,918274,918275,918276,918277,918278,918279,918280,918281,918282,918283,918284,918285,918286,918287,918288,918289,918290,918291,918292,918293,918294,918295,918296,918297,918298,918299,918300,918301,918302,918303,918304,918305,918306,918307,918308,918309,918310,918311,918312,918313,918314,918315,918316,918317,918318,918319,918320,918321,918322,918323,918324,918325,918326,918327,918328,918329,918330,918331,918332,918333,918334,918335,918336,918337,918338,918339,918340,918341,918342,918343,918344,918345,918346,918347,918348,918349,918350,918351,918352,918353,918354,918355,918356,918357,918358,918359,918360,918361,918362,918363,918364,918365,918366,918367,918368,918369,918370,918371,918372,918373,918374,918375,918376,918377,918378,918379,918380,918381,918382,918383,918384,918385,918386,918387,918388,918389,918390,918391,918392,918393,918394,918395,918396,918397,918398,918399,918400,918401,918402,918403,918404,918405,918406,918407,918408,918409,918410,918411,918412,918413,918414,918415,918416,918417,918418,918419,918420,918421,918422,918423,918424,918425,918426,918427,918428,918429,918430,918431,918432,918433,918434,918435,918436,918437,918438,918439,918440,918441,918442,918443,918444,918445,918446,918447,918448,918449,918450,918451,918452,918453,918454,918455,918456,918457,918458,918459,918460,918461,918462,918463,918464,918465,918466,918467,918468,918469,918470,918471,918472,918473,918474,918475,918476,918477,918478,918479,918480,918481,918482,918483,918484,918485,918486,918487,918488,918489,918490,918491,918492,918493,918494,918495,918496,918497,918498,918499,918500,918501,918502,918503,918504,918505,918506,918507,918508,918509,918510,918511,918512,918513,918514,918515,918516,918517,918518,918519,918520,918521,918522,918523,918524,918525,918526,918527,918528,918529,918530,918531,918532,918533,918534,918535,918536,918537,918538,918539,918540,918541,918542,918543,918544,918545,918546,918547,918548,918549,918550,918551,918552,918553,918554,918555,918556,918557,918558,918559,918560,918561,918562,918563,918564,918565,918566,918567,918568,918569,918570,918571,918572,918573,918574,918575,918576,918577,918578,918579,918580,918581,918582,918583,918584,918585,918586,918587,918588,918589,918590,918591,918592,918593,918594,918595,918596,918597,918598,918599,918600,918601,918602,918603,918604,918605,918606,918607,918608,918609,918610,918611,918612,918613,918614,918615,918616,918617,918618,918619,918620,918621,918622,918623,918624,918625,918626,918627,918628,918629,918630,918631,918632,918633,918634,918635,918636,918637,918638,918639,918640,918641,918642,918643,918644,918645,918646,918647,918648,918649,918650,918651,918652,918653,918654,918655,918656,918657,918658,918659,918660,918661,918662,918663,918664,918665,918666,918667,918668,918669,918670,918671,918672,918673,918674,918675,918676,918677,918678,918679,918680,918681,918682,918683,918684,918685,918686,918687,918688,918689,918690,918691,918692,918693,918694,918695,918696,918697,918698,918699,918700,918701,918702,918703,918704,918705,918706,918707,918708,918709,918710,918711,918712,918713,918714,918715,918716,918717,918718,918719,918720,918721,918722,918723,918724,918725,918726,918727,918728,918729,918730,918731,918732,918733,918734,918735,918736,918737,918738,918739,918740,918741,918742,918743,918744,918745,918746,918747,918748,918749,918750,918751,918752,918753,918754,918755,918756,918757,918758,918759,918760,918761,918762,918763,918764,918765,918766,918767,918768,918769,918770,918771,918772,918773,918774,918775,918776,918777,918778,918779,918780,918781,918782,918783,918784,918785,918786,918787,918788,918789,918790,918791,918792,918793,918794,918795,918796,918797,918798,918799,918800,918801,918802,918803,918804,918805,918806,918807,918808,918809,918810,918811,918812,918813,918814,918815,918816,918817,918818,918819,918820,918821,918822,918823,918824,918825,918826,918827,918828,918829,918830,918831,918832,918833,918834,918835,918836,918837,918838,918839,918840,918841,918842,918843,918844,918845,918846,918847,918848,918849,918850,918851,918852,918853,918854,918855,918856,918857,918858,918859,918860,918861,918862,918863,918864,918865,918866,918867,918868,918869,918870,918871,918872,918873,918874,918875,918876,918877,918878,918879,918880,918881,918882,918883,918884,918885,918886,918887,918888,918889,918890,918891,918892,918893,918894,918895,918896,918897,918898,918899,918900,918901,918902,918903,918904,918905,918906,918907,918908,918909,918910,918911,918912,918913,918914,918915,918916,918917,918918,918919,918920,918921,918922,918923,918924,918925,918926,918927,918928,918929,918930,918931,918932,918933,918934,918935,918936,918937,918938,918939,918940,918941,918942,918943,918944,918945,918946,918947,918948,918949,918950,918951,918952,918953,918954,918955,918956,918957,918958,918959,918960,918961,918962,918963,918964,918965,918966,918967,918968,918969,918970,918971,918972,918973,918974,918975,918976,918977,918978,918979,918980,918981,918982,918983,918984,918985,918986,918987,918988,918989,918990,918991,918992,918993,918994,918995,918996,918997,918998,918999,919000,919001,919002,919003,919004,919005,919006,919007,919008,919009,919010,919011,919012,919013,919014,919015,919016,919017,919018,919019,919020,919021,919022,919023,919024,919025,919026,919027,919028,919029,919030,919031,919032,919033,919034,919035,919036,919037,919038,919039,919040,919041,919042,919043,919044,919045,919046,919047,919048,919049,919050,919051,919052,919053,919054,919055,919056,919057,919058,919059,919060,919061,919062,919063,919064,919065,919066,919067,919068,919069,919070,919071,919072,919073,919074,919075,919076,919077,919078,919079,919080,919081,919082,919083,919084,919085,919086,919087,919088,919089,919090,919091,919092,919093,919094,919095,919096,919097,919098,919099,919100,919101,919102,919103,919104,919105,919106,919107,919108,919109,919110,919111,919112,919113,919114,919115,919116,919117,919118,919119,919120,919121,919122,919123,919124,919125,919126,919127,919128,919129,919130,919131,919132,919133,919134,919135,919136,919137,919138,919139,919140,919141,919142,919143,919144,919145,919146,919147,919148,919149,919150,919151,919152,919153,919154,919155,919156,919157,919158,919159,919160,919161,919162,919163,919164,919165,919166,919167,919168,919169,919170,919171,919172,919173,919174,919175,919176,919177,919178,919179,919180,919181,919182,919183,919184,919185,919186,919187,919188,919189,919190,919191,919192,919193,919194,919195,919196,919197,919198,919199,919200,919201,919202,919203,919204,919205,919206,919207,919208,919209,919210,919211,919212,919213,919214,919215,919216,919217,919218,919219,919220,919221,919222,919223,919224,919225,919226,919227,919228,919229,919230,919231,919232,919233,919234,919235,919236,919237,919238,919239,919240,919241,919242,919243,919244,919245,919246,919247,919248,919249,919250,919251,919252,919253,919254,919255,919256,919257,919258,919259,919260,919261,919262,919263,919264,919265,919266,919267,919268,919269,919270,919271,919272,919273,919274,919275,919276,919277,919278,919279,919280,919281,919282,919283,919284,919285,919286,919287,919288,919289,919290,919291,919292,919293,919294,919295,919296,919297,919298,919299,919300,919301,919302,919303,919304,919305,919306,919307,919308,919309,919310,919311,919312,919313,919314,919315,919316,919317,919318,919319,919320,919321,919322,919323,919324,919325,919326,919327,919328,919329,919330,919331,919332,919333,919334,919335,919336,919337,919338,919339,919340,919341,919342,919343,919344,919345,919346,919347,919348,919349,919350,919351,919352,919353,919354,919355,919356,919357,919358,919359,919360,919361,919362,919363,919364,919365,919366,919367,919368,919369,919370,919371,919372,919373,919374,919375,919376,919377,919378,919379,919380,919381,919382,919383,919384,919385,919386,919387,919388,919389,919390,919391,919392,919393,919394,919395,919396,919397,919398,919399,919400,919401,919402,919403,919404,919405,919406,919407,919408,919409,919410,919411,919412,919413,919414,919415,919416,919417,919418,919419,919420,919421,919422,919423,919424,919425,919426,919427,919428,919429,919430,919431,919432,919433,919434,919435,919436,919437,919438,919439,919440,919441,919442,919443,919444,919445,919446,919447,919448,919449,919450,919451,919452,919453,919454,919455,919456,919457,919458,919459,919460,919461,919462,919463,919464,919465,919466,919467,919468,919469,919470,919471,919472,919473,919474,919475,919476,919477,919478,919479,919480,919481,919482,919483,919484,919485,919486,919487,919488,919489,919490,919491,919492,919493,919494,919495,919496,919497,919498,919499,919500,919501,919502,919503,919504,919505,919506,919507,919508,919509,919510,919511,919512,919513,919514,919515,919516,919517,919518,919519,919520,919521,919522,919523,919524,919525,919526,919527,919528,919529,919530,919531,919532,919533,919534,919535,919536,919537,919538,919539,919540,919541,919542,919543,919544,919545,919546,919547,919548,919549,919550,919551,919552,919553,919554,919555,919556,919557,919558,919559,919560,919561,919562,919563,919564,919565,919566,919567,919568,919569,919570,919571,919572,919573,919574,919575,919576,919577,919578,919579,919580,919581,919582,919583,919584,919585,919586,919587,919588,919589,919590,919591,919592,919593,919594,919595,919596,919597,919598,919599,919600,919601,919602,919603,919604,919605,919606,919607,919608,919609,919610,919611,919612,919613,919614,919615,919616,919617,919618,919619,919620,919621,919622,919623,919624,919625,919626,919627,919628,919629,919630,919631,919632,919633,919634,919635,919636,919637,919638,919639,919640,919641,919642,919643,919644,919645,919646,919647,919648,919649,919650,919651,919652,919653,919654,919655,919656,919657,919658,919659,919660,919661,919662,919663,919664,919665,919666,919667,919668,919669,919670,919671,919672,919673,919674,919675,919676,919677,919678,919679,919680,919681,919682,919683,919684,919685,919686,919687,919688,919689,919690,919691,919692,919693,919694,919695,919696,919697,919698,919699,919700,919701,919702,919703,919704,919705,919706,919707,919708,919709,919710,919711,919712,919713,919714,919715,919716,919717,919718,919719,919720,919721,919722,919723,919724,919725,919726,919727,919728,919729,919730,919731,919732,919733,919734,919735,919736,919737,919738,919739,919740,919741,919742,919743,919744,919745,919746,919747,919748,919749,919750,919751,919752,919753,919754,919755,919756,919757,919758,919759,919760,919761,919762,919763,919764,919765,919766,919767,919768,919769,919770,919771,919772,919773,919774,919775,919776,919777,919778,919779,919780,919781,919782,919783,919784,919785,919786,919787,919788,919789,919790,919791,919792,919793,919794,919795,919796,919797,919798,919799,919800,919801,919802,919803,919804,919805,919806,919807,919808,919809,919810,919811,919812,919813,919814,919815,919816,919817,919818,919819,919820,919821,919822,919823,919824,919825,919826,919827,919828,919829,919830,919831,919832,919833,919834,919835,919836,919837,919838,919839,919840,919841,919842,919843,919844,919845,919846,919847,919848,919849,919850,919851,919852,919853,919854,919855,919856,919857,919858,919859,919860,919861,919862,919863,919864,919865,919866,919867,919868,919869,919870,919871,919872,919873,919874,919875,919876,919877,919878,919879,919880,919881,919882,919883,919884,919885,919886,919887,919888,919889,919890,919891,919892,919893,919894,919895,919896,919897,919898,919899,919900,919901,919902,919903,919904,919905,919906,919907,919908,919909,919910,919911,919912,919913,919914,919915,919916,919917,919918,919919,919920,919921,919922,919923,919924,919925,919926,919927,919928,919929,919930,919931,919932,919933,919934,919935,919936,919937,919938,919939,919940,919941,919942,919943,919944,919945,919946,919947,919948,919949,919950,919951,919952,919953,919954,919955,919956,919957,919958,919959,919960,919961,919962,919963,919964,919965,919966,919967,919968,919969,919970,919971,919972,919973,919974,919975,919976,919977,919978,919979,919980,919981,919982,919983,919984,919985,919986,919987,919988,919989,919990,919991,919992,919993,919994,919995,919996,919997,919998,919999,920000,920001,920002,920003,920004,920005,920006,920007,920008,920009,920010,920011,920012,920013,920014,920015,920016,920017,920018,920019,920020,920021,920022,920023,920024,920025,920026,920027,920028,920029,920030,920031,920032,920033,920034,920035,920036,920037,920038,920039,920040,920041,920042,920043,920044,920045,920046,920047,920048,920049,920050,920051,920052,920053,920054,920055,920056,920057,920058,920059,920060,920061,920062,920063,920064,920065,920066,920067,920068,920069,920070,920071,920072,920073,920074,920075,920076,920077,920078,920079,920080,920081,920082,920083,920084,920085,920086,920087,920088,920089,920090,920091,920092,920093,920094,920095,920096,920097,920098,920099,920100,920101,920102,920103,920104,920105,920106,920107,920108,920109,920110,920111,920112,920113,920114,920115,920116,920117,920118,920119,920120,920121,920122,920123,920124,920125,920126,920127,920128,920129,920130,920131,920132,920133,920134,920135,920136,920137,920138,920139,920140,920141,920142,920143,920144,920145,920146,920147,920148,920149,920150,920151,920152,920153,920154,920155,920156,920157,920158,920159,920160,920161,920162,920163,920164,920165,920166,920167,920168,920169,920170,920171,920172,920173,920174,920175,920176,920177,920178,920179,920180,920181,920182,920183,920184,920185,920186,920187,920188,920189,920190,920191,920192,920193,920194,920195,920196,920197,920198,920199,920200,920201,920202,920203,920204,920205,920206,920207,920208,920209,920210,920211,920212,920213,920214,920215,920216,920217,920218,920219,920220,920221,920222,920223,920224,920225,920226,920227,920228,920229,920230,920231,920232,920233,920234,920235,920236,920237,920238,920239,920240,920241,920242,920243,920244,920245,920246,920247,920248,920249,920250,920251,920252,920253,920254,920255,920256,920257,920258,920259,920260,920261,920262,920263,920264,920265,920266,920267,920268,920269,920270,920271,920272,920273,920274,920275,920276,920277,920278,920279,920280,920281,920282,920283,920284,920285,920286,920287,920288,920289,920290,920291,920292,920293,920294,920295,920296,920297,920298,920299,920300,920301,920302,920303,920304,920305,920306,920307,920308,920309,920310,920311,920312,920313,920314,920315,920316,920317,920318,920319,920320,920321,920322,920323,920324,920325,920326,920327,920328,920329,920330,920331,920332,920333,920334,920335,920336,920337,920338,920339,920340,920341,920342,920343,920344,920345,920346,920347,920348,920349,920350,920351,920352,920353,920354,920355,920356,920357,920358,920359,920360,920361,920362,920363,920364,920365,920366,920367,920368,920369,920370,920371,920372,920373,920374,920375,920376,920377,920378,920379,920380,920381,920382,920383,920384,920385,920386,920387,920388,920389,920390,920391,920392,920393,920394,920395,920396,920397,920398,920399,920400,920401,920402,920403,920404,920405,920406,920407,920408,920409,920410,920411,920412,920413,920414,920415,920416,920417,920418,920419,920420,920421,920422,920423,920424,920425,920426,920427,920428,920429,920430,920431,920432,920433,920434,920435,920436,920437,920438,920439,920440,920441,920442,920443,920444,920445,920446,920447,920448,920449,920450,920451,920452,920453,920454,920455,920456,920457,920458,920459,920460,920461,920462,920463,920464,920465,920466,920467,920468,920469,920470,920471,920472,920473,920474,920475,920476,920477,920478,920479,920480,920481,920482,920483,920484,920485,920486,920487,920488,920489,920490,920491,920492,920493,920494,920495,920496,920497,920498,920499,920500,920501,920502,920503,920504,920505,920506,920507,920508,920509,920510,920511,920512,920513,920514,920515,920516,920517,920518,920519,920520,920521,920522,920523,920524,920525,920526,920527,920528,920529,920530,920531,920532,920533,920534,920535,920536,920537,920538,920539,920540,920541,920542,920543,920544,920545,920546,920547,920548,920549,920550,920551,920552,920553,920554,920555,920556,920557,920558,920559,920560,920561,920562,920563,920564,920565,920566,920567,920568,920569,920570,920571,920572,920573,920574,920575,920576,920577,920578,920579,920580,920581,920582,920583,920584,920585,920586,920587,920588,920589,920590,920591,920592,920593,920594,920595,920596,920597,920598,920599,920600,920601,920602,920603,920604,920605,920606,920607,920608,920609,920610,920611,920612,920613,920614,920615,920616,920617,920618,920619,920620,920621,920622,920623,920624,920625,920626,920627,920628,920629,920630,920631,920632,920633,920634,920635,920636,920637,920638,920639,920640,920641,920642,920643,920644,920645,920646,920647,920648,920649,920650,920651,920652,920653,920654,920655,920656,920657,920658,920659,920660,920661,920662,920663,920664,920665,920666,920667,920668,920669,920670,920671,920672,920673,920674,920675,920676,920677,920678,920679,920680,920681,920682,920683,920684,920685,920686,920687,920688,920689,920690,920691,920692,920693,920694,920695,920696,920697,920698,920699,920700,920701,920702,920703,920704,920705,920706,920707,920708,920709,920710,920711,920712,920713,920714,920715,920716,920717,920718,920719,920720,920721,920722,920723,920724,920725,920726,920727,920728,920729,920730,920731,920732,920733,920734,920735,920736,920737,920738,920739,920740,920741,920742,920743,920744,920745,920746,920747,920748,920749,920750,920751,920752,920753,920754,920755,920756,920757,920758,920759,920760,920761,920762,920763,920764,920765,920766,920767,920768,920769,920770,920771,920772,920773,920774,920775,920776,920777,920778,920779,920780,920781,920782,920783,920784,920785,920786,920787,920788,920789,920790,920791,920792,920793,920794,920795,920796,920797,920798,920799,920800,920801,920802,920803,920804,920805,920806,920807,920808,920809,920810,920811,920812,920813,920814,920815,920816,920817,920818,920819,920820,920821,920822,920823,920824,920825,920826,920827,920828,920829,920830,920831,920832,920833,920834,920835,920836,920837,920838,920839,920840,920841,920842,920843,920844,920845,920846,920847,920848,920849,920850,920851,920852,920853,920854,920855,920856,920857,920858,920859,920860,920861,920862,920863,920864,920865,920866,920867,920868,920869,920870,920871,920872,920873,920874,920875,920876,920877,920878,920879,920880,920881,920882,920883,920884,920885,920886,920887,920888,920889,920890,920891,920892,920893,920894,920895,920896,920897,920898,920899,920900,920901,920902,920903,920904,920905,920906,920907,920908,920909,920910,920911,920912,920913,920914,920915,920916,920917,920918,920919,920920,920921,920922,920923,920924,920925,920926,920927,920928,920929,920930,920931,920932,920933,920934,920935,920936,920937,920938,920939,920940,920941,920942,920943,920944,920945,920946,920947,920948,920949,920950,920951,920952,920953,920954,920955,920956,920957,920958,920959,920960,920961,920962,920963,920964,920965,920966,920967,920968,920969,920970,920971,920972,920973,920974,920975,920976,920977,920978,920979,920980,920981,920982,920983,920984,920985,920986,920987,920988,920989,920990,920991,920992,920993,920994,920995,920996,920997,920998,920999,921000,921001,921002,921003,921004,921005,921006,921007,921008,921009,921010,921011,921012,921013,921014,921015,921016,921017,921018,921019,921020,921021,921022,921023,921024,921025,921026,921027,921028,921029,921030,921031,921032,921033,921034,921035,921036,921037,921038,921039,921040,921041,921042,921043,921044,921045,921046,921047,921048,921049,921050,921051,921052,921053,921054,921055,921056,921057,921058,921059,921060,921061,921062,921063,921064,921065,921066,921067,921068,921069,921070,921071,921072,921073,921074,921075,921076,921077,921078,921079,921080,921081,921082,921083,921084,921085,921086,921087,921088,921089,921090,921091,921092,921093,921094,921095,921096,921097,921098,921099,921100,921101,921102,921103,921104,921105,921106,921107,921108,921109,921110,921111,921112,921113,921114,921115,921116,921117,921118,921119,921120,921121,921122,921123,921124,921125,921126,921127,921128,921129,921130,921131,921132,921133,921134,921135,921136,921137,921138,921139,921140,921141,921142,921143,921144,921145,921146,921147,921148,921149,921150,921151,921152,921153,921154,921155,921156,921157,921158,921159,921160,921161,921162,921163,921164,921165,921166,921167,921168,921169,921170,921171,921172,921173,921174,921175,921176,921177,921178,921179,921180,921181,921182,921183,921184,921185,921186,921187,921188,921189,921190,921191,921192,921193,921194,921195,921196,921197,921198,921199,921200,921201,921202,921203,921204,921205,921206,921207,921208,921209,921210,921211,921212,921213,921214,921215,921216,921217,921218,921219,921220,921221,921222,921223,921224,921225,921226,921227,921228,921229,921230,921231,921232,921233,921234,921235,921236,921237,921238,921239,921240,921241,921242,921243,921244,921245,921246,921247,921248,921249,921250,921251,921252,921253,921254,921255,921256,921257,921258,921259,921260,921261,921262,921263,921264,921265,921266,921267,921268,921269,921270,921271,921272,921273,921274,921275,921276,921277,921278,921279,921280,921281,921282,921283,921284,921285,921286,921287,921288,921289,921290,921291,921292,921293,921294,921295,921296,921297,921298,921299,921300,921301,921302,921303,921304,921305,921306,921307,921308,921309,921310,921311,921312,921313,921314,921315,921316,921317,921318,921319,921320,921321,921322,921323,921324,921325,921326,921327,921328,921329,921330,921331,921332,921333,921334,921335,921336,921337,921338,921339,921340,921341,921342,921343,921344,921345,921346,921347,921348,921349,921350,921351,921352,921353,921354,921355,921356,921357,921358,921359,921360,921361,921362,921363,921364,921365,921366,921367,921368,921369,921370,921371,921372,921373,921374,921375,921376,921377,921378,921379,921380,921381,921382,921383,921384,921385,921386,921387,921388,921389,921390,921391,921392,921393,921394,921395,921396,921397,921398,921399,921400,921401,921402,921403,921404,921405,921406,921407,921408,921409,921410,921411,921412,921413,921414,921415,921416,921417,921418,921419,921420,921421,921422,921423,921424,921425,921426,921427,921428,921429,921430,921431,921432,921433,921434,921435,921436,921437,921438,921439,921440,921441,921442,921443,921444,921445,921446,921447,921448,921449,921450,921451,921452,921453,921454,921455,921456,921457,921458,921459,921460,921461,921462,921463,921464,921465,921466,921467,921468,921469,921470,921471,921472,921473,921474,921475,921476,921477,921478,921479,921480,921481,921482,921483,921484,921485,921486,921487,921488,921489,921490,921491,921492,921493,921494,921495,921496,921497,921498,921499,921500,921501,921502,921503,921504,921505,921506,921507,921508,921509,921510,921511,921512,921513,921514,921515,921516,921517,921518,921519,921520,921521,921522,921523,921524,921525,921526,921527,921528,921529,921530,921531,921532,921533,921534,921535,921536,921537,921538,921539,921540,921541,921542,921543,921544,921545,921546,921547,921548,921549,921550,921551,921552,921553,921554,921555,921556,921557,921558,921559,921560,921561,921562,921563,921564,921565,921566,921567,921568,921569,921570,921571,921572,921573,921574,921575,921576,921577,921578,921579,921580,921581,921582,921583,921584,921585,921586,921587,921588,921589,921590,921591,921592,921593,921594,921595,921596,921597,921598,921599],"Deprecated":[329,1651,3959,3961,6051,6052,8298,8299,8300,8301,8302,8303,9001,9002,917505],"Soft_Dotted":[105,106,303,585,616,669,690,1011,1110,1112,7522,7574,7588,7592,7725,7883,8305,8520,8521,11388,119842,119843,119894,119895,119946,119947,119998,119999,120050,120051,120102,120103,120154,120155,120206,120207,120258,120259,120310,120311,120362,120363,120414,120415,120466,120467,122650,122956,122957,122984],"Logical_Order_Exception":[3648,3649,3650,3651,3652,3776,3777,3778,3779,3780,6581,6582,6583,6586,43701,43702,43705,43707,43708],"Other_ID_Start":[6277,6278,8472,8494,12443,12444],"Other_ID_Continue":[183,903,4969,4970,4971,4972,4973,4974,4975,4976,4977,6618,8204,8205,12539,65381],"ID_Compat_Math_Continue":[178,179,185,8304,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8706,8711,8734,120513,120539,120571,120597,120629,120655,120687,120713,120745,120771],"ID_Compat_Math_Start":[8706,8711,8734,120513,120539,120571,120597,120629,120655,120687,120713,120745,120771],"Sentence_Terminal":[33,46,63,1417,1565,1566,1567,1748,1792,1793,1794,2041,2103,2105,2109,2110,2404,2405,4170,4171,4962,4967,4968,5742,5941,5942,6100,6101,6147,6153,6468,6469,6824,6825,6826,6827,7002,7003,7006,7007,7037,7038,7227,7228,7294,7295,8252,8253,8263,8264,8265,11822,11836,11859,11860,12290,42239,42510,42511,42739,42743,43126,43127,43214,43215,43311,43464,43465,43613,43614,43615,43760,43761,44011,65106,65110,65111,65281,65294,65311,65377,68182,68183,69461,69462,69463,69464,69465,69510,69511,69512,69513,69703,69704,69822,69823,69824,69825,69953,69954,69955,70085,70086,70093,70110,70111,70200,70201,70203,70204,70313,70731,70732,71106,71107,71113,71114,71115,71116,71117,71118,71119,71120,71121,71122,71123,71124,71125,71126,71127,71233,71234,71484,71485,71486,72004,72006,72258,72259,72347,72348,72769,72770,73463,73464,73539,73540,92782,92783,92917,92983,92984,92996,93848,113823,121480],"Variation_Selector":[6155,6156,6157,6159,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999],"Pattern_White_Space":[9,10,11,12,13,32,133,8206,8207,8232,8233],"Pattern_Syntax":[33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,58,59,60,61,62,63,64,91,92,93,94,96,123,124,125,126,161,162,163,164,165,166,167,169,171,172,174,176,177,182,187,191,215,247,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682,9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697,9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742,9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021,10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033,10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093,10094,10095,10096,10097,10098,10099,10100,10101,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141,10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153,10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165,10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201,10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345,10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357,10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393,10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429,10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441,10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501,10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513,10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621,10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657,10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693,10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705,10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717,10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729,10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885,10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957,10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029,11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053,11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150,11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185,11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197,11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209,11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11776,11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794,11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806,11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866,11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882,11883,11884,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897,11898,11899,11900,11901,11902,11903,12289,12290,12291,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12336,64830,64831,65093,65094],"Prepended_Concatenation_Mark":[1536,1537,1538,1539,1540,1541,1757,1807,2192,2193,2274,69821,69837],"Regional_Indicator":[127462,127463,127464,127465,127466,127467,127468,127469,127470,127471,127472,127473,127474,127475,127476,127477,127478,127479,127480,127481,127482,127483,127484,127485,127486,127487],"Math":[43,60,61,62,94,124,126,172,177,215,247,976,977,978,981,1008,1009,1012,1013,1014,1542,1543,1544,8214,8242,8243,8244,8256,8260,8274,8289,8290,8291,8292,8314,8315,8316,8317,8318,8330,8331,8332,8333,8334,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8427,8428,8429,8430,8431,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8488,8489,8492,8493,8495,8496,8497,8499,8500,8501,8502,8503,8504,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8523,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8617,8618,8619,8620,8621,8622,8624,8625,8630,8631,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8669,8676,8677,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8968,8969,8970,8971,8992,8993,9084,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9143,9168,9180,9181,9182,9183,9184,9185,9186,9632,9633,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9660,9661,9662,9663,9664,9665,9670,9671,9674,9675,9679,9680,9681,9682,9683,9698,9700,9703,9704,9705,9706,9707,9708,9720,9721,9722,9723,9724,9725,9726,9727,9733,9734,9792,9794,9824,9825,9826,9827,9837,9838,9839,10176,10177,10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201,10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10496,10497,10498,10499,10500,10501,10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513,10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621,10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657,10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693,10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705,10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717,10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729,10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885,10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957,10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,11006,11007,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11079,11080,11081,11082,11083,11084,64297,65121,65122,65123,65124,65125,65126,65128,65291,65308,65309,65310,65340,65342,65372,65374,65506,65513,65514,65515,65516,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120513,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120539,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120571,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120597,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120629,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120655,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120687,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120713,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120745,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120771,120772,120773,120774,120775,120776,120777,120778,120779,120782,120783,120784,120785,120786,120787,120788,120789,120790,120791,120792,120793,120794,120795,120796,120797,120798,120799,120800,120801,120802,120803,120804,120805,120806,120807,120808,120809,120810,120811,120812,120813,120814,120815,120816,120817,120818,120819,120820,120821,120822,120823,120824,120825,120826,120827,120828,120829,120830,120831,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,126704,126705],"Alphabetic":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,837,880,881,882,883,884,886,887,890,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1625,1626,1627,1628,1629,1630,1631,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1750,1751,1752,1753,1754,1755,1756,1761,1762,1763,1764,1765,1766,1767,1768,1773,1774,1775,1786,1787,1788,1791,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2185,2186,2187,2188,2189,2190,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2275,2276,2277,2278,2279,2280,2281,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2382,2383,2384,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2510,2519,2524,2525,2527,2528,2529,2530,2531,2544,2545,2556,2561,2562,2563,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2622,2623,2624,2625,2626,2631,2632,2635,2636,2641,2649,2650,2651,2652,2654,2672,2673,2674,2675,2676,2677,2689,2690,2691,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2768,2784,2785,2786,2787,2809,2810,2811,2812,2817,2818,2819,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2902,2903,2908,2909,2911,2912,2913,2914,2915,2929,2946,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3024,3031,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3157,3158,3160,3161,3162,3165,3168,3169,3170,3171,3200,3201,3202,3203,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3285,3286,3293,3294,3296,3297,3298,3299,3313,3314,3315,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3406,3412,3413,3414,3415,3423,3424,3425,3426,3427,3450,3451,3452,3453,3454,3455,3457,3458,3459,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3570,3571,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3648,3649,3650,3651,3652,3653,3654,3661,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3771,3772,3773,3776,3777,3778,3779,3780,3782,3789,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4152,4155,4156,4157,4158,4159,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,4250,4251,4252,4253,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6002,6003,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6103,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6823,6847,6848,6860,6861,6862,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6981,6982,6983,6984,6985,6986,6987,6988,7040,7041,7042,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,7075,7076,7077,7078,7079,7080,7081,7084,7085,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7401,7402,7403,7404,7406,7407,7408,7409,7410,7411,7413,7414,7418,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11823,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42612,42613,42614,42615,42616,42617,42618,42619,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42654,42655,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43010,43011,43012,43013,43015,43016,43017,43018,43019,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43043,43044,43045,43046,43047,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43136,43137,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43205,43250,43251,43252,43253,43254,43255,43259,43261,43262,43263,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43302,43303,43304,43305,43306,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43392,43393,43394,43395,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43471,43488,43489,43490,43491,43492,43493,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43584,43585,43586,43587,43588,43589,43590,43591,43592,43593,43594,43595,43596,43597,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43643,43644,43645,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43696,43697,43698,43699,43700,43701,43702,43703,43704,43705,43706,43707,43708,43709,43710,43712,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43755,43756,43757,43758,43759,43762,43763,43764,43765,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44003,44004,44005,44006,44007,44008,44009,44010,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64286,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66369,66370,66371,66372,66373,66374,66375,66376,66377,66378,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66422,66423,66424,66425,66426,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66513,66514,66515,66516,66517,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68097,68098,68099,68101,68102,68108,68109,68110,68111,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68148,68149,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68224,68225,68226,68227,68228,68229,68230,68231,68232,68233,68234,68235,68236,68237,68238,68239,68240,68241,68242,68243,68244,68245,68246,68247,68248,68249,68250,68251,68252,68288,68289,68290,68291,68292,68293,68294,68295,68297,68298,68299,68300,68301,68302,68303,68304,68305,68306,68307,68308,68309,68310,68311,68312,68313,68314,68315,68316,68317,68318,68319,68320,68321,68322,68323,68324,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68480,68481,68482,68483,68484,68485,68486,68487,68488,68489,68490,68491,68492,68493,68494,68495,68496,68497,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,68864,68865,68866,68867,68868,68869,68870,68871,68872,68873,68874,68875,68876,68877,68878,68879,68880,68881,68882,68883,68884,68885,68886,68887,68888,68889,68890,68891,68892,68893,68894,68895,68896,68897,68898,68899,68900,68901,68902,68903,69248,69249,69250,69251,69252,69253,69254,69255,69256,69257,69258,69259,69260,69261,69262,69263,69264,69265,69266,69267,69268,69269,69270,69271,69272,69273,69274,69275,69276,69277,69278,69279,69280,69281,69282,69283,69284,69285,69286,69287,69288,69289,69291,69292,69296,69297,69376,69377,69378,69379,69380,69381,69382,69383,69384,69385,69386,69387,69388,69389,69390,69391,69392,69393,69394,69395,69396,69397,69398,69399,69400,69401,69402,69403,69404,69415,69424,69425,69426,69427,69428,69429,69430,69431,69432,69433,69434,69435,69436,69437,69438,69439,69440,69441,69442,69443,69444,69445,69488,69489,69490,69491,69492,69493,69494,69495,69496,69497,69498,69499,69500,69501,69502,69503,69504,69505,69552,69553,69554,69555,69556,69557,69558,69559,69560,69561,69562,69563,69564,69565,69566,69567,69568,69569,69570,69571,69572,69600,69601,69602,69603,69604,69605,69606,69607,69608,69609,69610,69611,69612,69613,69614,69615,69616,69617,69618,69619,69620,69621,69622,69632,69633,69634,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69688,69689,69690,69691,69692,69693,69694,69695,69696,69697,69698,69699,69700,69701,69745,69746,69747,69748,69749,69760,69761,69762,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69808,69809,69810,69811,69812,69813,69814,69815,69816,69826,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69888,69889,69890,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,69927,69928,69929,69930,69931,69932,69933,69934,69935,69936,69937,69938,69956,69957,69958,69959,69968,69969,69970,69971,69972,69973,69974,69975,69976,69977,69978,69979,69980,69981,69982,69983,69984,69985,69986,69987,69988,69989,69990,69991,69992,69993,69994,69995,69996,69997,69998,69999,70000,70001,70002,70006,70016,70017,70018,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70067,70068,70069,70070,70071,70072,70073,70074,70075,70076,70077,70078,70079,70081,70082,70083,70084,70094,70095,70106,70108,70144,70145,70146,70147,70148,70149,70150,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70182,70183,70184,70185,70186,70187,70188,70189,70190,70191,70192,70193,70194,70195,70196,70199,70206,70207,70208,70209,70272,70273,70274,70275,70276,70277,70278,70280,70282,70283,70284,70285,70287,70288,70289,70290,70291,70292,70293,70294,70295,70296,70297,70298,70299,70300,70301,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70400,70401,70402,70403,70405,70406,70407,70408,70409,70410,70411,70412,70415,70416,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70442,70443,70444,70445,70446,70447,70448,70450,70451,70453,70454,70455,70456,70457,70461,70462,70463,70464,70465,70466,70467,70468,70471,70472,70475,70476,70480,70487,70493,70494,70495,70496,70497,70498,70499,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700,70701,70702,70703,70704,70705,70706,70707,70708,70709,70710,70711,70712,70713,70714,70715,70716,70717,70718,70719,70720,70721,70723,70724,70725,70727,70728,70729,70730,70751,70752,70753,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70832,70833,70834,70835,70836,70837,70838,70839,70840,70841,70842,70843,70844,70845,70846,70847,70848,70849,70852,70853,70855,71040,71041,71042,71043,71044,71045,71046,71047,71048,71049,71050,71051,71052,71053,71054,71055,71056,71057,71058,71059,71060,71061,71062,71063,71064,71065,71066,71067,71068,71069,71070,71071,71072,71073,71074,71075,71076,71077,71078,71079,71080,71081,71082,71083,71084,71085,71086,71087,71088,71089,71090,71091,71092,71093,71096,71097,71098,71099,71100,71101,71102,71128,71129,71130,71131,71132,71133,71168,71169,71170,71171,71172,71173,71174,71175,71176,71177,71178,71179,71180,71181,71182,71183,71184,71185,71186,71187,71188,71189,71190,71191,71192,71193,71194,71195,71196,71197,71198,71199,71200,71201,71202,71203,71204,71205,71206,71207,71208,71209,71210,71211,71212,71213,71214,71215,71216,71217,71218,71219,71220,71221,71222,71223,71224,71225,71226,71227,71228,71229,71230,71232,71236,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,71339,71340,71341,71342,71343,71344,71345,71346,71347,71348,71349,71352,71424,71425,71426,71427,71428,71429,71430,71431,71432,71433,71434,71435,71436,71437,71438,71439,71440,71441,71442,71443,71444,71445,71446,71447,71448,71449,71450,71453,71454,71455,71456,71457,71458,71459,71460,71461,71462,71463,71464,71465,71466,71488,71489,71490,71491,71492,71493,71494,71680,71681,71682,71683,71684,71685,71686,71687,71688,71689,71690,71691,71692,71693,71694,71695,71696,71697,71698,71699,71700,71701,71702,71703,71704,71705,71706,71707,71708,71709,71710,71711,71712,71713,71714,71715,71716,71717,71718,71719,71720,71721,71722,71723,71724,71725,71726,71727,71728,71729,71730,71731,71732,71733,71734,71735,71736,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,71935,71936,71937,71938,71939,71940,71941,71942,71945,71948,71949,71950,71951,71952,71953,71954,71955,71957,71958,71960,71961,71962,71963,71964,71965,71966,71967,71968,71969,71970,71971,71972,71973,71974,71975,71976,71977,71978,71979,71980,71981,71982,71983,71984,71985,71986,71987,71988,71989,71991,71992,71995,71996,71999,72000,72001,72002,72096,72097,72098,72099,72100,72101,72102,72103,72106,72107,72108,72109,72110,72111,72112,72113,72114,72115,72116,72117,72118,72119,72120,72121,72122,72123,72124,72125,72126,72127,72128,72129,72130,72131,72132,72133,72134,72135,72136,72137,72138,72139,72140,72141,72142,72143,72144,72145,72146,72147,72148,72149,72150,72151,72154,72155,72156,72157,72158,72159,72161,72163,72164,72192,72193,72194,72195,72196,72197,72198,72199,72200,72201,72202,72203,72204,72205,72206,72207,72208,72209,72210,72211,72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222,72223,72224,72225,72226,72227,72228,72229,72230,72231,72232,72233,72234,72235,72236,72237,72238,72239,72240,72241,72242,72245,72246,72247,72248,72249,72250,72251,72252,72253,72254,72272,72273,72274,72275,72276,72277,72278,72279,72280,72281,72282,72283,72284,72285,72286,72287,72288,72289,72290,72291,72292,72293,72294,72295,72296,72297,72298,72299,72300,72301,72302,72303,72304,72305,72306,72307,72308,72309,72310,72311,72312,72313,72314,72315,72316,72317,72318,72319,72320,72321,72322,72323,72324,72325,72326,72327,72328,72329,72330,72331,72332,72333,72334,72335,72336,72337,72338,72339,72340,72341,72342,72343,72349,72368,72369,72370,72371,72372,72373,72374,72375,72376,72377,72378,72379,72380,72381,72382,72383,72384,72385,72386,72387,72388,72389,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72404,72405,72406,72407,72408,72409,72410,72411,72412,72413,72414,72415,72416,72417,72418,72419,72420,72421,72422,72423,72424,72425,72426,72427,72428,72429,72430,72431,72432,72433,72434,72435,72436,72437,72438,72439,72440,72704,72705,72706,72707,72708,72709,72710,72711,72712,72714,72715,72716,72717,72718,72719,72720,72721,72722,72723,72724,72725,72726,72727,72728,72729,72730,72731,72732,72733,72734,72735,72736,72737,72738,72739,72740,72741,72742,72743,72744,72745,72746,72747,72748,72749,72750,72751,72752,72753,72754,72755,72756,72757,72758,72760,72761,72762,72763,72764,72765,72766,72768,72818,72819,72820,72821,72822,72823,72824,72825,72826,72827,72828,72829,72830,72831,72832,72833,72834,72835,72836,72837,72838,72839,72840,72841,72842,72843,72844,72845,72846,72847,72850,72851,72852,72853,72854,72855,72856,72857,72858,72859,72860,72861,72862,72863,72864,72865,72866,72867,72868,72869,72870,72871,72873,72874,72875,72876,72877,72878,72879,72880,72881,72882,72883,72884,72885,72886,72960,72961,72962,72963,72964,72965,72966,72968,72969,72971,72972,72973,72974,72975,72976,72977,72978,72979,72980,72981,72982,72983,72984,72985,72986,72987,72988,72989,72990,72991,72992,72993,72994,72995,72996,72997,72998,72999,73000,73001,73002,73003,73004,73005,73006,73007,73008,73009,73010,73011,73012,73013,73014,73018,73020,73021,73023,73024,73025,73027,73030,73031,73056,73057,73058,73059,73060,73061,73063,73064,73066,73067,73068,73069,73070,73071,73072,73073,73074,73075,73076,73077,73078,73079,73080,73081,73082,73083,73084,73085,73086,73087,73088,73089,73090,73091,73092,73093,73094,73095,73096,73097,73098,73099,73100,73101,73102,73104,73105,73107,73108,73109,73110,73112,73440,73441,73442,73443,73444,73445,73446,73447,73448,73449,73450,73451,73452,73453,73454,73455,73456,73457,73458,73459,73460,73461,73462,73472,73473,73474,73475,73476,73477,73478,73479,73480,73481,73482,73483,73484,73485,73486,73487,73488,73490,73491,73492,73493,73494,73495,73496,73497,73498,73499,73500,73501,73502,73503,73504,73505,73506,73507,73508,73509,73510,73511,73512,73513,73514,73515,73516,73517,73518,73519,73520,73521,73522,73523,73524,73525,73526,73527,73528,73529,73530,73534,73535,73536,73648,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,74607,74608,74609,74610,74611,74612,74613,74614,74615,74616,74617,74618,74619,74620,74621,74622,74623,74624,74625,74626,74627,74628,74629,74630,74631,74632,74633,74634,74635,74636,74637,74638,74639,74640,74641,74642,74643,74644,74645,74646,74647,74648,74649,74752,74753,74754,74755,74756,74757,74758,74759,74760,74761,74762,74763,74764,74765,74766,74767,74768,74769,74770,74771,74772,74773,74774,74775,74776,74777,74778,74779,74780,74781,74782,74783,74784,74785,74786,74787,74788,74789,74790,74791,74792,74793,74794,74795,74796,74797,74798,74799,74800,74801,74802,74803,74804,74805,74806,74807,74808,74809,74810,74811,74812,74813,74814,74815,74816,74817,74818,74819,74820,74821,74822,74823,74824,74825,74826,74827,74828,74829,74830,74831,74832,74833,74834,74835,74836,74837,74838,74839,74840,74841,74842,74843,74844,74845,74846,74847,74848,74849,74850,74851,74852,74853,74854,74855,74856,74857,74858,74859,74860,74861,74862,74880,74881,74882,74883,74884,74885,74886,74887,74888,74889,74890,74891,74892,74893,74894,74895,74896,74897,74898,74899,74900,74901,74902,74903,74904,74905,74906,74907,74908,74909,74910,74911,74912,74913,74914,74915,74916,74917,74918,74919,74920,74921,74922,74923,74924,74925,74926,74927,74928,74929,74930,74931,74932,74933,74934,74935,74936,74937,74938,74939,74940,74941,74942,74943,74944,74945,74946,74947,74948,74949,74950,74951,74952,74953,74954,74955,74956,74957,74958,74959,74960,74961,74962,74963,74964,74965,74966,74967,74968,74969,74970,74971,74972,74973,74974,74975,74976,74977,74978,74979,74980,74981,74982,74983,74984,74985,74986,74987,74988,74989,74990,74991,74992,74993,74994,74995,74996,74997,74998,74999,75000,75001,75002,75003,75004,75005,75006,75007,75008,75009,75010,75011,75012,75013,75014,75015,75016,75017,75018,75019,75020,75021,75022,75023,75024,75025,75026,75027,75028,75029,75030,75031,75032,75033,75034,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75049,75050,75051,75052,75053,75054,75055,75056,75057,75058,75059,75060,75061,75062,75063,75064,75065,75066,75067,75068,75069,75070,75071,75072,75073,75074,75075,77712,77713,77714,77715,77716,77717,77718,77719,77720,77721,77722,77723,77724,77725,77726,77727,77728,77729,77730,77731,77732,77733,77734,77735,77736,77737,77738,77739,77740,77741,77742,77743,77744,77745,77746,77747,77748,77749,77750,77751,77752,77753,77754,77755,77756,77757,77758,77759,77760,77761,77762,77763,77764,77765,77766,77767,77768,77769,77770,77771,77772,77773,77774,77775,77776,77777,77778,77779,77780,77781,77782,77783,77784,77785,77786,77787,77788,77789,77790,77791,77792,77793,77794,77795,77796,77797,77798,77799,77800,77801,77802,77803,77804,77805,77806,77807,77808,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,78895,78913,78914,78915,78916,78917,78918,82944,82945,82946,82947,82948,82949,82950,82951,82952,82953,82954,82955,82956,82957,82958,82959,82960,82961,82962,82963,82964,82965,82966,82967,82968,82969,82970,82971,82972,82973,82974,82975,82976,82977,82978,82979,82980,82981,82982,82983,82984,82985,82986,82987,82988,82989,82990,82991,82992,82993,82994,82995,82996,82997,82998,82999,83000,83001,83002,83003,83004,83005,83006,83007,83008,83009,83010,83011,83012,83013,83014,83015,83016,83017,83018,83019,83020,83021,83022,83023,83024,83025,83026,83027,83028,83029,83030,83031,83032,83033,83034,83035,83036,83037,83038,83039,83040,83041,83042,83043,83044,83045,83046,83047,83048,83049,83050,83051,83052,83053,83054,83055,83056,83057,83058,83059,83060,83061,83062,83063,83064,83065,83066,83067,83068,83069,83070,83071,83072,83073,83074,83075,83076,83077,83078,83079,83080,83081,83082,83083,83084,83085,83086,83087,83088,83089,83090,83091,83092,83093,83094,83095,83096,83097,83098,83099,83100,83101,83102,83103,83104,83105,83106,83107,83108,83109,83110,83111,83112,83113,83114,83115,83116,83117,83118,83119,83120,83121,83122,83123,83124,83125,83126,83127,83128,83129,83130,83131,83132,83133,83134,83135,83136,83137,83138,83139,83140,83141,83142,83143,83144,83145,83146,83147,83148,83149,83150,83151,83152,83153,83154,83155,83156,83157,83158,83159,83160,83161,83162,83163,83164,83165,83166,83167,83168,83169,83170,83171,83172,83173,83174,83175,83176,83177,83178,83179,83180,83181,83182,83183,83184,83185,83186,83187,83188,83189,83190,83191,83192,83193,83194,83195,83196,83197,83198,83199,83200,83201,83202,83203,83204,83205,83206,83207,83208,83209,83210,83211,83212,83213,83214,83215,83216,83217,83218,83219,83220,83221,83222,83223,83224,83225,83226,83227,83228,83229,83230,83231,83232,83233,83234,83235,83236,83237,83238,83239,83240,83241,83242,83243,83244,83245,83246,83247,83248,83249,83250,83251,83252,83253,83254,83255,83256,83257,83258,83259,83260,83261,83262,83263,83264,83265,83266,83267,83268,83269,83270,83271,83272,83273,83274,83275,83276,83277,83278,83279,83280,83281,83282,83283,83284,83285,83286,83287,83288,83289,83290,83291,83292,83293,83294,83295,83296,83297,83298,83299,83300,83301,83302,83303,83304,83305,83306,83307,83308,83309,83310,83311,83312,83313,83314,83315,83316,83317,83318,83319,83320,83321,83322,83323,83324,83325,83326,83327,83328,83329,83330,83331,83332,83333,83334,83335,83336,83337,83338,83339,83340,83341,83342,83343,83344,83345,83346,83347,83348,83349,83350,83351,83352,83353,83354,83355,83356,83357,83358,83359,83360,83361,83362,83363,83364,83365,83366,83367,83368,83369,83370,83371,83372,83373,83374,83375,83376,83377,83378,83379,83380,83381,83382,83383,83384,83385,83386,83387,83388,83389,83390,83391,83392,83393,83394,83395,83396,83397,83398,83399,83400,83401,83402,83403,83404,83405,83406,83407,83408,83409,83410,83411,83412,83413,83414,83415,83416,83417,83418,83419,83420,83421,83422,83423,83424,83425,83426,83427,83428,83429,83430,83431,83432,83433,83434,83435,83436,83437,83438,83439,83440,83441,83442,83443,83444,83445,83446,83447,83448,83449,83450,83451,83452,83453,83454,83455,83456,83457,83458,83459,83460,83461,83462,83463,83464,83465,83466,83467,83468,83469,83470,83471,83472,83473,83474,83475,83476,83477,83478,83479,83480,83481,83482,83483,83484,83485,83486,83487,83488,83489,83490,83491,83492,83493,83494,83495,83496,83497,83498,83499,83500,83501,83502,83503,83504,83505,83506,83507,83508,83509,83510,83511,83512,83513,83514,83515,83516,83517,83518,83519,83520,83521,83522,83523,83524,83525,83526,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,92736,92737,92738,92739,92740,92741,92742,92743,92744,92745,92746,92747,92748,92749,92750,92751,92752,92753,92754,92755,92756,92757,92758,92759,92760,92761,92762,92763,92764,92765,92766,92784,92785,92786,92787,92788,92789,92790,92791,92792,92793,92794,92795,92796,92797,92798,92799,92800,92801,92802,92803,92804,92805,92806,92807,92808,92809,92810,92811,92812,92813,92814,92815,92816,92817,92818,92819,92820,92821,92822,92823,92824,92825,92826,92827,92828,92829,92830,92831,92832,92833,92834,92835,92836,92837,92838,92839,92840,92841,92842,92843,92844,92845,92846,92847,92848,92849,92850,92851,92852,92853,92854,92855,92856,92857,92858,92859,92860,92861,92862,92880,92881,92882,92883,92884,92885,92886,92887,92888,92889,92890,92891,92892,92893,92894,92895,92896,92897,92898,92899,92900,92901,92902,92903,92904,92905,92906,92907,92908,92909,92928,92929,92930,92931,92932,92933,92934,92935,92936,92937,92938,92939,92940,92941,92942,92943,92944,92945,92946,92947,92948,92949,92950,92951,92952,92953,92954,92955,92956,92957,92958,92959,92960,92961,92962,92963,92964,92965,92966,92967,92968,92969,92970,92971,92972,92973,92974,92975,92992,92993,92994,92995,93027,93028,93029,93030,93031,93032,93033,93034,93035,93036,93037,93038,93039,93040,93041,93042,93043,93044,93045,93046,93047,93053,93054,93055,93056,93057,93058,93059,93060,93061,93062,93063,93064,93065,93066,93067,93068,93069,93070,93071,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94021,94022,94023,94024,94025,94026,94031,94032,94033,94034,94035,94036,94037,94038,94039,94040,94041,94042,94043,94044,94045,94046,94047,94048,94049,94050,94051,94052,94053,94054,94055,94056,94057,94058,94059,94060,94061,94062,94063,94064,94065,94066,94067,94068,94069,94070,94071,94072,94073,94074,94075,94076,94077,94078,94079,94080,94081,94082,94083,94084,94085,94086,94087,94095,94096,94097,94098,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94179,94192,94193,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,110592,110593,110594,110595,110596,110597,110598,110599,110600,110601,110602,110603,110604,110605,110606,110607,110608,110609,110610,110611,110612,110613,110614,110615,110616,110617,110618,110619,110620,110621,110622,110623,110624,110625,110626,110627,110628,110629,110630,110631,110632,110633,110634,110635,110636,110637,110638,110639,110640,110641,110642,110643,110644,110645,110646,110647,110648,110649,110650,110651,110652,110653,110654,110655,110656,110657,110658,110659,110660,110661,110662,110663,110664,110665,110666,110667,110668,110669,110670,110671,110672,110673,110674,110675,110676,110677,110678,110679,110680,110681,110682,110683,110684,110685,110686,110687,110688,110689,110690,110691,110692,110693,110694,110695,110696,110697,110698,110699,110700,110701,110702,110703,110704,110705,110706,110707,110708,110709,110710,110711,110712,110713,110714,110715,110716,110717,110718,110719,110720,110721,110722,110723,110724,110725,110726,110727,110728,110729,110730,110731,110732,110733,110734,110735,110736,110737,110738,110739,110740,110741,110742,110743,110744,110745,110746,110747,110748,110749,110750,110751,110752,110753,110754,110755,110756,110757,110758,110759,110760,110761,110762,110763,110764,110765,110766,110767,110768,110769,110770,110771,110772,110773,110774,110775,110776,110777,110778,110779,110780,110781,110782,110783,110784,110785,110786,110787,110788,110789,110790,110791,110792,110793,110794,110795,110796,110797,110798,110799,110800,110801,110802,110803,110804,110805,110806,110807,110808,110809,110810,110811,110812,110813,110814,110815,110816,110817,110818,110819,110820,110821,110822,110823,110824,110825,110826,110827,110828,110829,110830,110831,110832,110833,110834,110835,110836,110837,110838,110839,110840,110841,110842,110843,110844,110845,110846,110847,110848,110849,110850,110851,110852,110853,110854,110855,110856,110857,110858,110859,110860,110861,110862,110863,110864,110865,110866,110867,110868,110869,110870,110871,110872,110873,110874,110875,110876,110877,110878,110879,110880,110881,110882,110898,110928,110929,110930,110933,110948,110949,110950,110951,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,113664,113665,113666,113667,113668,113669,113670,113671,113672,113673,113674,113675,113676,113677,113678,113679,113680,113681,113682,113683,113684,113685,113686,113687,113688,113689,113690,113691,113692,113693,113694,113695,113696,113697,113698,113699,113700,113701,113702,113703,113704,113705,113706,113707,113708,113709,113710,113711,113712,113713,113714,113715,113716,113717,113718,113719,113720,113721,113722,113723,113724,113725,113726,113727,113728,113729,113730,113731,113732,113733,113734,113735,113736,113737,113738,113739,113740,113741,113742,113743,113744,113745,113746,113747,113748,113749,113750,113751,113752,113753,113754,113755,113756,113757,113758,113759,113760,113761,113762,113763,113764,113765,113766,113767,113768,113769,113770,113776,113777,113778,113779,113780,113781,113782,113783,113784,113785,113786,113787,113788,113792,113793,113794,113795,113796,113797,113798,113799,113800,113808,113809,113810,113811,113812,113813,113814,113815,113816,113817,113822,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122634,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122880,122881,122882,122883,122884,122885,122886,122888,122889,122890,122891,122892,122893,122894,122895,122896,122897,122898,122899,122900,122901,122902,122903,122904,122907,122908,122909,122910,122911,122912,122913,122915,122916,122918,122919,122920,122921,122922,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123023,123136,123137,123138,123139,123140,123141,123142,123143,123144,123145,123146,123147,123148,123149,123150,123151,123152,123153,123154,123155,123156,123157,123158,123159,123160,123161,123162,123163,123164,123165,123166,123167,123168,123169,123170,123171,123172,123173,123174,123175,123176,123177,123178,123179,123180,123191,123192,123193,123194,123195,123196,123197,123214,123536,123537,123538,123539,123540,123541,123542,123543,123544,123545,123546,123547,123548,123549,123550,123551,123552,123553,123554,123555,123556,123557,123558,123559,123560,123561,123562,123563,123564,123565,123584,123585,123586,123587,123588,123589,123590,123591,123592,123593,123594,123595,123596,123597,123598,123599,123600,123601,123602,123603,123604,123605,123606,123607,123608,123609,123610,123611,123612,123613,123614,123615,123616,123617,123618,123619,123620,123621,123622,123623,123624,123625,123626,123627,124112,124113,124114,124115,124116,124117,124118,124119,124120,124121,124122,124123,124124,124125,124126,124127,124128,124129,124130,124131,124132,124133,124134,124135,124136,124137,124138,124139,124896,124897,124898,124899,124900,124901,124902,124904,124905,124906,124907,124909,124910,124912,124913,124914,124915,124916,124917,124918,124919,124920,124921,124922,124923,124924,124925,124926,124928,124929,124930,124931,124932,124933,124934,124935,124936,124937,124938,124939,124940,124941,124942,124943,124944,124945,124946,124947,124948,124949,124950,124951,124952,124953,124954,124955,124956,124957,124958,124959,124960,124961,124962,124963,124964,124965,124966,124967,124968,124969,124970,124971,124972,124973,124974,124975,124976,124977,124978,124979,124980,124981,124982,124983,124984,124985,124986,124987,124988,124989,124990,124991,124992,124993,124994,124995,124996,124997,124998,124999,125000,125001,125002,125003,125004,125005,125006,125007,125008,125009,125010,125011,125012,125013,125014,125015,125016,125017,125018,125019,125020,125021,125022,125023,125024,125025,125026,125027,125028,125029,125030,125031,125032,125033,125034,125035,125036,125037,125038,125039,125040,125041,125042,125043,125044,125045,125046,125047,125048,125049,125050,125051,125052,125053,125054,125055,125056,125057,125058,125059,125060,125061,125062,125063,125064,125065,125066,125067,125068,125069,125070,125071,125072,125073,125074,125075,125076,125077,125078,125079,125080,125081,125082,125083,125084,125085,125086,125087,125088,125089,125090,125091,125092,125093,125094,125095,125096,125097,125098,125099,125100,125101,125102,125103,125104,125105,125106,125107,125108,125109,125110,125111,125112,125113,125114,125115,125116,125117,125118,125119,125120,125121,125122,125123,125124,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,125255,125259,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,127280,127281,127282,127283,127284,127285,127286,127287,127288,127289,127290,127291,127292,127293,127294,127295,127296,127297,127298,127299,127300,127301,127302,127303,127304,127305,127312,127313,127314,127315,127316,127317,127318,127319,127320,127321,127322,127323,127324,127325,127326,127327,127328,127329,127330,127331,127332,127333,127334,127335,127336,127337,127344,127345,127346,127347,127348,127349,127350,127351,127352,127353,127354,127355,127356,127357,127358,127359,127360,127361,127362,127363,127364,127365,127366,127367,127368,127369,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743],"Lowercase":[97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,186,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293,295,297,299,301,303,305,307,309,311,312,314,316,318,320,322,324,326,328,329,331,333,335,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,378,380,382,383,384,387,389,392,396,397,402,405,409,410,411,414,417,419,421,424,426,427,429,432,436,438,441,442,445,446,447,454,457,460,462,464,466,468,470,472,474,476,477,479,481,483,485,487,489,491,493,495,496,499,501,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,564,565,566,567,568,569,572,575,576,578,583,585,587,589,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,704,705,736,737,738,739,740,837,881,883,887,890,891,892,893,912,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,976,977,981,982,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1008,1009,1010,1011,1013,1016,1019,1020,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1218,1220,1222,1224,1226,1228,1230,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825,7827,7829,7830,7831,7832,7833,7834,7835,7836,7837,7839,7841,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7897,7899,7901,7903,7905,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,7936,7937,7938,7939,7940,7941,7942,7943,7952,7953,7954,7955,7956,7957,7968,7969,7970,7971,7972,7973,7974,7975,7984,7985,7986,7987,7988,7989,7990,7991,8000,8001,8002,8003,8004,8005,8016,8017,8018,8019,8020,8021,8022,8023,8032,8033,8034,8035,8036,8037,8038,8039,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8080,8081,8082,8083,8084,8085,8086,8087,8096,8097,8098,8099,8100,8101,8102,8103,8112,8113,8114,8115,8116,8118,8119,8126,8130,8131,8132,8134,8135,8144,8145,8146,8147,8150,8151,8160,8161,8162,8163,8164,8165,8166,8167,8178,8179,8180,8182,8183,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8458,8462,8463,8467,8495,8500,8505,8508,8509,8518,8519,8520,8521,8526,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8580,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11361,11365,11366,11368,11370,11372,11377,11379,11380,11382,11383,11384,11385,11386,11387,11388,11389,11393,11395,11397,11399,11401,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11433,11435,11437,11439,11441,11443,11445,11447,11449,11451,11453,11455,11457,11459,11461,11463,11465,11467,11469,11471,11473,11475,11477,11479,11481,11483,11485,11487,11489,11491,11492,11500,11502,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42561,42563,42565,42567,42569,42571,42573,42575,42577,42579,42581,42583,42585,42587,42589,42591,42593,42595,42597,42599,42601,42603,42605,42625,42627,42629,42631,42633,42635,42637,42639,42641,42643,42645,42647,42649,42651,42652,42653,42787,42789,42791,42793,42795,42797,42799,42800,42801,42803,42805,42807,42809,42811,42813,42815,42817,42819,42821,42823,42825,42827,42829,42831,42833,42835,42837,42839,42841,42843,42845,42847,42849,42851,42853,42855,42857,42859,42861,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42874,42876,42879,42881,42883,42885,42887,42892,42894,42897,42899,42900,42901,42903,42905,42907,42909,42911,42913,42915,42917,42919,42921,42927,42933,42935,42937,42939,42941,42943,42945,42947,42952,42954,42961,42963,42965,42967,42969,42994,42995,42996,42998,43000,43001,43002,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67456,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120779,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251],"Uppercase":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,313,315,317,319,321,323,325,327,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,377,379,381,385,386,388,390,391,393,394,395,398,399,400,401,403,404,406,407,408,412,413,415,416,418,420,422,423,425,428,430,431,433,434,435,437,439,440,444,452,455,458,461,463,465,467,469,471,473,475,478,480,482,484,486,488,490,492,494,497,500,502,503,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,570,571,573,574,577,579,580,581,582,584,586,588,590,880,882,886,895,902,904,905,906,908,910,911,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,975,978,979,980,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1012,1015,1017,1018,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7702,7704,7706,7708,7710,7712,7714,7716,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,7828,7838,7840,7842,7844,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,8011,8012,8013,8025,8027,8029,8031,8040,8041,8042,8043,8044,8045,8046,8047,8120,8121,8122,8123,8136,8137,8138,8139,8152,8153,8154,8155,8168,8169,8170,8171,8172,8184,8185,8186,8187,8450,8455,8459,8460,8461,8464,8465,8466,8469,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8496,8497,8498,8499,8510,8511,8517,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8579,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11360,11362,11363,11364,11367,11369,11371,11373,11374,11375,11376,11378,11381,11390,11391,11392,11394,11396,11398,11400,11402,11404,11406,11408,11410,11412,11414,11416,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458,11460,11462,11464,11466,11468,11470,11472,11474,11476,11478,11480,11482,11484,11486,11488,11490,11499,11501,11506,42560,42562,42564,42566,42568,42570,42572,42574,42576,42578,42580,42582,42584,42586,42588,42590,42592,42594,42596,42598,42600,42602,42604,42624,42626,42628,42630,42632,42634,42636,42638,42640,42642,42644,42646,42648,42650,42786,42788,42790,42792,42794,42796,42798,42802,42804,42806,42808,42810,42812,42814,42816,42818,42820,42822,42824,42826,42828,42830,42832,42834,42836,42838,42840,42842,42844,42846,42848,42850,42852,42854,42856,42858,42860,42862,42873,42875,42877,42878,42880,42882,42884,42886,42891,42893,42896,42898,42902,42904,42906,42908,42910,42912,42914,42916,42918,42920,42922,42923,42924,42925,42926,42928,42929,42930,42931,42932,42934,42936,42938,42940,42942,42944,42946,42948,42949,42950,42951,42953,42960,42966,42968,42997,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120778,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,127280,127281,127282,127283,127284,127285,127286,127287,127288,127289,127290,127291,127292,127293,127294,127295,127296,127297,127298,127299,127300,127301,127302,127303,127304,127305,127312,127313,127314,127315,127316,127317,127318,127319,127320,127321,127322,127323,127324,127325,127326,127327,127328,127329,127330,127331,127332,127333,127334,127335,127336,127337,127344,127345,127346,127347,127348,127349,127350,127351,127352,127353,127354,127355,127356,127357,127358,127359,127360,127361,127362,127363,127364,127365,127366,127367,127368,127369],"Cased":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,444,445,446,447,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,704,705,736,737,738,739,740,837,880,881,882,883,886,887,890,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8495,8496,8497,8498,8499,8500,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8579,8580,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42891,42892,42893,42894,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,43000,43001,43002,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67456,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,127280,127281,127282,127283,127284,127285,127286,127287,127288,127289,127290,127291,127292,127293,127294,127295,127296,127297,127298,127299,127300,127301,127302,127303,127304,127305,127312,127313,127314,127315,127316,127317,127318,127319,127320,127321,127322,127323,127324,127325,127326,127327,127328,127329,127330,127331,127332,127333,127334,127335,127336,127337,127344,127345,127346,127347,127348,127349,127350,127351,127352,127353,127354,127355,127356,127357,127358,127359,127360,127361,127362,127363,127364,127365,127366,127367,127368,127369],"Case_Ignorable":[39,46,58,94,96,168,173,175,180,183,184,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,884,885,890,900,901,903,1155,1156,1157,1158,1159,1160,1161,1369,1375,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1524,1536,1537,1538,1539,1540,1541,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1564,1600,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1648,1750,1751,1752,1753,1754,1755,1756,1757,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1807,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2042,2045,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2137,2138,2139,2184,2192,2193,2200,2201,2202,2203,2204,2205,2206,2207,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2362,2364,2369,2370,2371,2372,2373,2374,2375,2376,2381,2385,2386,2387,2388,2389,2390,2391,2402,2403,2417,2433,2492,2497,2498,2499,2500,2509,2530,2531,2558,2561,2562,2620,2625,2626,2631,2632,2635,2636,2637,2641,2672,2673,2677,2689,2690,2748,2753,2754,2755,2756,2757,2759,2760,2765,2786,2787,2810,2811,2812,2813,2814,2815,2817,2876,2879,2881,2882,2883,2884,2893,2901,2902,2914,2915,2946,3008,3021,3072,3076,3132,3134,3135,3136,3142,3143,3144,3146,3147,3148,3149,3157,3158,3170,3171,3201,3260,3263,3270,3276,3277,3298,3299,3328,3329,3387,3388,3393,3394,3395,3396,3405,3426,3427,3457,3530,3538,3539,3540,3542,3633,3636,3637,3638,3639,3640,3641,3642,3654,3655,3656,3657,3658,3659,3660,3661,3662,3761,3764,3765,3766,3767,3768,3769,3770,3771,3772,3782,3784,3785,3786,3787,3788,3789,3790,3864,3865,3893,3895,3897,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3968,3969,3970,3971,3972,3974,3975,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4141,4142,4143,4144,4146,4147,4148,4149,4150,4151,4153,4154,4157,4158,4184,4185,4190,4191,4192,4209,4210,4211,4212,4226,4229,4230,4237,4253,4348,4957,4958,4959,5906,5907,5908,5938,5939,5970,5971,6002,6003,6068,6069,6071,6072,6073,6074,6075,6076,6077,6086,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6103,6109,6155,6156,6157,6158,6159,6211,6277,6278,6313,6432,6433,6434,6439,6440,6450,6457,6458,6459,6679,6680,6683,6742,6744,6745,6746,6747,6748,6749,6750,6752,6754,6757,6758,6759,6760,6761,6762,6763,6764,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6823,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6912,6913,6914,6915,6964,6966,6967,6968,6969,6970,6972,6978,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7074,7075,7076,7077,7080,7081,7083,7084,7085,7142,7144,7145,7149,7151,7152,7153,7212,7213,7214,7215,7216,7217,7218,7219,7222,7223,7288,7289,7290,7291,7292,7293,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7394,7395,7396,7397,7398,7399,7400,7405,7412,7416,7417,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7544,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,8125,8127,8128,8129,8141,8142,8143,8157,8158,8159,8173,8174,8175,8189,8190,8203,8204,8205,8206,8207,8216,8217,8228,8231,8234,8235,8236,8237,8238,8288,8289,8290,8291,8292,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,11388,11389,11503,11504,11505,11631,11647,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11823,12293,12330,12331,12332,12333,12337,12338,12339,12340,12341,12347,12441,12442,12443,12444,12445,12446,12540,12541,12542,40981,42232,42233,42234,42235,42236,42237,42508,42607,42608,42609,42610,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42623,42652,42653,42654,42655,42736,42737,42752,42753,42754,42755,42756,42757,42758,42759,42760,42761,42762,42763,42764,42765,42766,42767,42768,42769,42770,42771,42772,42773,42774,42775,42776,42777,42778,42779,42780,42781,42782,42783,42784,42785,42864,42888,42889,42890,42994,42995,42996,43000,43001,43010,43014,43019,43045,43046,43052,43204,43205,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43263,43302,43303,43304,43305,43306,43307,43308,43309,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43392,43393,43394,43443,43446,43447,43448,43449,43452,43453,43471,43493,43494,43561,43562,43563,43564,43565,43566,43569,43570,43573,43574,43587,43596,43632,43644,43696,43698,43699,43700,43703,43704,43710,43711,43713,43741,43756,43757,43763,43764,43766,43867,43868,43869,43870,43871,43881,43882,43883,44005,44008,44013,64286,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64450,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65043,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65106,65109,65279,65287,65294,65306,65342,65344,65392,65438,65439,65507,65529,65530,65531,66045,66272,66422,66423,66424,66425,66426,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,68097,68098,68099,68101,68102,68108,68109,68110,68111,68152,68153,68154,68159,68325,68326,68900,68901,68902,68903,69291,69292,69373,69374,69375,69446,69447,69448,69449,69450,69451,69452,69453,69454,69455,69456,69506,69507,69508,69509,69633,69688,69689,69690,69691,69692,69693,69694,69695,69696,69697,69698,69699,69700,69701,69702,69744,69747,69748,69759,69760,69761,69811,69812,69813,69814,69817,69818,69821,69826,69837,69888,69889,69890,69927,69928,69929,69930,69931,69933,69934,69935,69936,69937,69938,69939,69940,70003,70016,70017,70070,70071,70072,70073,70074,70075,70076,70077,70078,70089,70090,70091,70092,70095,70191,70192,70193,70196,70198,70199,70206,70209,70367,70371,70372,70373,70374,70375,70376,70377,70378,70400,70401,70459,70460,70464,70502,70503,70504,70505,70506,70507,70508,70512,70513,70514,70515,70516,70712,70713,70714,70715,70716,70717,70718,70719,70722,70723,70724,70726,70750,70835,70836,70837,70838,70839,70840,70842,70847,70848,70850,70851,71090,71091,71092,71093,71100,71101,71103,71104,71132,71133,71219,71220,71221,71222,71223,71224,71225,71226,71229,71231,71232,71339,71341,71344,71345,71346,71347,71348,71349,71351,71453,71454,71455,71458,71459,71460,71461,71463,71464,71465,71466,71467,71727,71728,71729,71730,71731,71732,71733,71734,71735,71737,71738,71995,71996,71998,72003,72148,72149,72150,72151,72154,72155,72160,72193,72194,72195,72196,72197,72198,72199,72200,72201,72202,72243,72244,72245,72246,72247,72248,72251,72252,72253,72254,72263,72273,72274,72275,72276,72277,72278,72281,72282,72283,72330,72331,72332,72333,72334,72335,72336,72337,72338,72339,72340,72341,72342,72344,72345,72752,72753,72754,72755,72756,72757,72758,72760,72761,72762,72763,72764,72765,72767,72850,72851,72852,72853,72854,72855,72856,72857,72858,72859,72860,72861,72862,72863,72864,72865,72866,72867,72868,72869,72870,72871,72874,72875,72876,72877,72878,72879,72880,72882,72883,72885,72886,73009,73010,73011,73012,73013,73014,73018,73020,73021,73023,73024,73025,73026,73027,73028,73029,73031,73104,73105,73109,73111,73459,73460,73472,73473,73526,73527,73528,73529,73530,73536,73538,78896,78897,78898,78899,78900,78901,78902,78903,78904,78905,78906,78907,78908,78909,78910,78911,78912,78919,78920,78921,78922,78923,78924,78925,78926,78927,78928,78929,78930,78931,78932,78933,92912,92913,92914,92915,92916,92976,92977,92978,92979,92980,92981,92982,92992,92993,92994,92995,94031,94095,94096,94097,94098,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94179,94180,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,113821,113822,113824,113825,113826,113827,118528,118529,118530,118531,118532,118533,118534,118535,118536,118537,118538,118539,118540,118541,118542,118543,118544,118545,118546,118547,118548,118549,118550,118551,118552,118553,118554,118555,118556,118557,118558,118559,118560,118561,118562,118563,118564,118565,118566,118567,118568,118569,118570,118571,118572,118573,118576,118577,118578,118579,118580,118581,118582,118583,118584,118585,118586,118587,118588,118589,118590,118591,118592,118593,118594,118595,118596,118597,118598,119143,119144,119145,119155,119156,119157,119158,119159,119160,119161,119162,119163,119164,119165,119166,119167,119168,119169,119170,119173,119174,119175,119176,119177,119178,119179,119210,119211,119212,119213,119362,119363,119364,121344,121345,121346,121347,121348,121349,121350,121351,121352,121353,121354,121355,121356,121357,121358,121359,121360,121361,121362,121363,121364,121365,121366,121367,121368,121369,121370,121371,121372,121373,121374,121375,121376,121377,121378,121379,121380,121381,121382,121383,121384,121385,121386,121387,121388,121389,121390,121391,121392,121393,121394,121395,121396,121397,121398,121403,121404,121405,121406,121407,121408,121409,121410,121411,121412,121413,121414,121415,121416,121417,121418,121419,121420,121421,121422,121423,121424,121425,121426,121427,121428,121429,121430,121431,121432,121433,121434,121435,121436,121437,121438,121439,121440,121441,121442,121443,121444,121445,121446,121447,121448,121449,121450,121451,121452,121461,121476,121499,121500,121501,121502,121503,121505,121506,121507,121508,121509,121510,121511,121512,121513,121514,121515,121516,121517,121518,121519,122880,122881,122882,122883,122884,122885,122886,122888,122889,122890,122891,122892,122893,122894,122895,122896,122897,122898,122899,122900,122901,122902,122903,122904,122907,122908,122909,122910,122911,122912,122913,122915,122916,122918,122919,122920,122921,122922,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123023,123184,123185,123186,123187,123188,123189,123190,123191,123192,123193,123194,123195,123196,123197,123566,123628,123629,123630,123631,124139,124140,124141,124142,124143,125136,125137,125138,125139,125140,125141,125142,125252,125253,125254,125255,125256,125257,125258,125259,127995,127996,127997,127998,127999,917505,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999],"Changes_When_Lowercased":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,313,315,317,319,321,323,325,327,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,377,379,381,385,386,388,390,391,393,394,395,398,399,400,401,403,404,406,407,408,412,413,415,416,418,420,422,423,425,428,430,431,433,434,435,437,439,440,444,452,453,455,456,458,459,461,463,465,467,469,471,473,475,478,480,482,484,486,488,490,492,494,497,498,500,502,503,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,570,571,573,574,577,579,580,581,582,584,586,588,590,880,882,886,895,902,904,905,906,908,910,911,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,975,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1012,1015,1017,1018,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7702,7704,7706,7708,7710,7712,7714,7716,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,7828,7838,7840,7842,7844,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,8011,8012,8013,8025,8027,8029,8031,8040,8041,8042,8043,8044,8045,8046,8047,8072,8073,8074,8075,8076,8077,8078,8079,8088,8089,8090,8091,8092,8093,8094,8095,8104,8105,8106,8107,8108,8109,8110,8111,8120,8121,8122,8123,8124,8136,8137,8138,8139,8140,8152,8153,8154,8155,8168,8169,8170,8171,8172,8184,8185,8186,8187,8188,8486,8490,8491,8498,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8579,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11360,11362,11363,11364,11367,11369,11371,11373,11374,11375,11376,11378,11381,11390,11391,11392,11394,11396,11398,11400,11402,11404,11406,11408,11410,11412,11414,11416,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458,11460,11462,11464,11466,11468,11470,11472,11474,11476,11478,11480,11482,11484,11486,11488,11490,11499,11501,11506,42560,42562,42564,42566,42568,42570,42572,42574,42576,42578,42580,42582,42584,42586,42588,42590,42592,42594,42596,42598,42600,42602,42604,42624,42626,42628,42630,42632,42634,42636,42638,42640,42642,42644,42646,42648,42650,42786,42788,42790,42792,42794,42796,42798,42802,42804,42806,42808,42810,42812,42814,42816,42818,42820,42822,42824,42826,42828,42830,42832,42834,42836,42838,42840,42842,42844,42846,42848,42850,42852,42854,42856,42858,42860,42862,42873,42875,42877,42878,42880,42882,42884,42886,42891,42893,42896,42898,42902,42904,42906,42908,42910,42912,42914,42916,42918,42920,42922,42923,42924,42925,42926,42928,42929,42930,42931,42932,42934,42936,42938,42940,42942,42944,42946,42948,42949,42950,42951,42953,42960,42966,42968,42997,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217],"Changes_When_Uppercased":[97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,181,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293,295,297,299,301,303,305,307,309,311,314,316,318,320,322,324,326,328,329,331,333,335,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,378,380,382,383,384,387,389,392,396,402,405,409,410,414,417,419,421,424,429,432,436,438,441,445,447,453,454,456,457,459,460,462,464,466,468,470,472,474,476,477,479,481,483,485,487,489,491,493,495,496,498,499,501,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,547,549,551,553,555,557,559,561,563,572,575,576,578,583,585,587,589,591,592,593,594,595,596,598,599,601,603,604,608,609,611,613,614,616,617,618,619,620,623,625,626,629,637,640,642,643,647,648,649,650,651,652,658,669,670,837,881,883,887,891,892,893,912,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,976,977,981,982,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1008,1009,1010,1011,1013,1016,1019,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1218,1220,1222,1224,1226,1228,1230,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4349,4350,4351,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7545,7549,7566,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825,7827,7829,7830,7831,7832,7833,7834,7835,7841,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7897,7899,7901,7903,7905,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,7936,7937,7938,7939,7940,7941,7942,7943,7952,7953,7954,7955,7956,7957,7968,7969,7970,7971,7972,7973,7974,7975,7984,7985,7986,7987,7988,7989,7990,7991,8000,8001,8002,8003,8004,8005,8016,8017,8018,8019,8020,8021,8022,8023,8032,8033,8034,8035,8036,8037,8038,8039,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8124,8126,8130,8131,8132,8134,8135,8140,8144,8145,8146,8147,8150,8151,8160,8161,8162,8163,8164,8165,8166,8167,8178,8179,8180,8182,8183,8188,8526,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8580,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11361,11365,11366,11368,11370,11372,11379,11382,11393,11395,11397,11399,11401,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11433,11435,11437,11439,11441,11443,11445,11447,11449,11451,11453,11455,11457,11459,11461,11463,11465,11467,11469,11471,11473,11475,11477,11479,11481,11483,11485,11487,11489,11491,11500,11502,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42561,42563,42565,42567,42569,42571,42573,42575,42577,42579,42581,42583,42585,42587,42589,42591,42593,42595,42597,42599,42601,42603,42605,42625,42627,42629,42631,42633,42635,42637,42639,42641,42643,42645,42647,42649,42651,42787,42789,42791,42793,42795,42797,42799,42803,42805,42807,42809,42811,42813,42815,42817,42819,42821,42823,42825,42827,42829,42831,42833,42835,42837,42839,42841,42843,42845,42847,42849,42851,42853,42855,42857,42859,42861,42863,42874,42876,42879,42881,42883,42885,42887,42892,42897,42899,42900,42903,42905,42907,42909,42911,42913,42915,42917,42919,42921,42933,42935,42937,42939,42941,42943,42945,42947,42952,42954,42961,42967,42969,42998,43859,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251],"Changes_When_Titlecased":[97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,181,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293,295,297,299,301,303,305,307,309,311,314,316,318,320,322,324,326,328,329,331,333,335,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,378,380,382,383,384,387,389,392,396,402,405,409,410,414,417,419,421,424,429,432,436,438,441,445,447,452,454,455,457,458,460,462,464,466,468,470,472,474,476,477,479,481,483,485,487,489,491,493,495,496,497,499,501,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,547,549,551,553,555,557,559,561,563,572,575,576,578,583,585,587,589,591,592,593,594,595,596,598,599,601,603,604,608,609,611,613,614,616,617,618,619,620,623,625,626,629,637,640,642,643,647,648,649,650,651,652,658,669,670,837,881,883,887,891,892,893,912,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,976,977,981,982,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1008,1009,1010,1011,1013,1016,1019,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1218,1220,1222,1224,1226,1228,1230,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7545,7549,7566,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825,7827,7829,7830,7831,7832,7833,7834,7835,7841,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7897,7899,7901,7903,7905,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,7936,7937,7938,7939,7940,7941,7942,7943,7952,7953,7954,7955,7956,7957,7968,7969,7970,7971,7972,7973,7974,7975,7984,7985,7986,7987,7988,7989,7990,7991,8000,8001,8002,8003,8004,8005,8016,8017,8018,8019,8020,8021,8022,8023,8032,8033,8034,8035,8036,8037,8038,8039,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8080,8081,8082,8083,8084,8085,8086,8087,8096,8097,8098,8099,8100,8101,8102,8103,8112,8113,8114,8115,8116,8118,8119,8126,8130,8131,8132,8134,8135,8144,8145,8146,8147,8150,8151,8160,8161,8162,8163,8164,8165,8166,8167,8178,8179,8180,8182,8183,8526,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8580,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11361,11365,11366,11368,11370,11372,11379,11382,11393,11395,11397,11399,11401,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11433,11435,11437,11439,11441,11443,11445,11447,11449,11451,11453,11455,11457,11459,11461,11463,11465,11467,11469,11471,11473,11475,11477,11479,11481,11483,11485,11487,11489,11491,11500,11502,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42561,42563,42565,42567,42569,42571,42573,42575,42577,42579,42581,42583,42585,42587,42589,42591,42593,42595,42597,42599,42601,42603,42605,42625,42627,42629,42631,42633,42635,42637,42639,42641,42643,42645,42647,42649,42651,42787,42789,42791,42793,42795,42797,42799,42803,42805,42807,42809,42811,42813,42815,42817,42819,42821,42823,42825,42827,42829,42831,42833,42835,42837,42839,42841,42843,42845,42847,42849,42851,42853,42855,42857,42859,42861,42863,42874,42876,42879,42881,42883,42885,42887,42892,42897,42899,42900,42903,42905,42907,42909,42911,42913,42915,42917,42919,42921,42933,42935,42937,42939,42941,42943,42945,42947,42952,42954,42961,42967,42969,42998,43859,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251],"Changes_When_Casefolded":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,181,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,313,315,317,319,321,323,325,327,329,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,377,379,381,383,385,386,388,390,391,393,394,395,398,399,400,401,403,404,406,407,408,412,413,415,416,418,420,422,423,425,428,430,431,433,434,435,437,439,440,444,452,453,455,456,458,459,461,463,465,467,469,471,473,475,478,480,482,484,486,488,490,492,494,497,498,500,502,503,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,570,571,573,574,577,579,580,581,582,584,586,588,590,837,880,882,886,895,902,904,905,906,908,910,911,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,962,975,976,977,981,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1009,1012,1013,1015,1017,1018,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1415,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7702,7704,7706,7708,7710,7712,7714,7716,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,7828,7834,7835,7838,7840,7842,7844,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,8011,8012,8013,8025,8027,8029,8031,8040,8041,8042,8043,8044,8045,8046,8047,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8114,8115,8116,8119,8120,8121,8122,8123,8124,8130,8131,8132,8135,8136,8137,8138,8139,8140,8152,8153,8154,8155,8168,8169,8170,8171,8172,8178,8179,8180,8183,8184,8185,8186,8187,8188,8486,8490,8491,8498,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8579,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11360,11362,11363,11364,11367,11369,11371,11373,11374,11375,11376,11378,11381,11390,11391,11392,11394,11396,11398,11400,11402,11404,11406,11408,11410,11412,11414,11416,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458,11460,11462,11464,11466,11468,11470,11472,11474,11476,11478,11480,11482,11484,11486,11488,11490,11499,11501,11506,42560,42562,42564,42566,42568,42570,42572,42574,42576,42578,42580,42582,42584,42586,42588,42590,42592,42594,42596,42598,42600,42602,42604,42624,42626,42628,42630,42632,42634,42636,42638,42640,42642,42644,42646,42648,42650,42786,42788,42790,42792,42794,42796,42798,42802,42804,42806,42808,42810,42812,42814,42816,42818,42820,42822,42824,42826,42828,42830,42832,42834,42836,42838,42840,42842,42844,42846,42848,42850,42852,42854,42856,42858,42860,42862,42873,42875,42877,42878,42880,42882,42884,42886,42891,42893,42896,42898,42902,42904,42906,42908,42910,42912,42914,42916,42918,42920,42922,42923,42924,42925,42926,42928,42929,42930,42931,42932,42934,42936,42938,42940,42942,42944,42946,42948,42949,42950,42951,42953,42960,42966,42968,42997,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217],"Changes_When_Casemapped":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,181,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,398,399,400,401,402,403,404,405,406,407,408,409,410,412,413,414,415,416,417,418,419,420,421,422,423,424,425,428,429,430,431,432,433,434,435,436,437,438,439,440,441,444,445,447,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,598,599,601,603,604,608,609,611,613,614,616,617,618,619,620,623,625,626,629,637,640,642,643,647,648,649,650,651,652,658,669,670,837,880,881,882,883,886,887,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4349,4350,4351,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7545,7549,7566,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7838,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8486,8490,8491,8498,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8579,8580,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11378,11379,11381,11382,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42891,42892,42893,42896,42897,42898,42899,42900,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42966,42967,42968,42969,42997,42998,43859,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251],"ID_Start":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,880,881,882,883,884,886,887,890,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1765,1766,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2185,2186,2187,2188,2189,2190,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2556,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2809,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3160,3161,3162,3165,3168,3169,3200,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3293,3294,3296,3297,3313,3314,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3412,3413,3414,3423,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3648,3649,3650,3651,3652,3653,3654,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3782,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6103,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6823,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,6988,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7401,7402,7403,7404,7406,7407,7408,7409,7410,7411,7413,7414,7418,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12443,12444,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43261,43262,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43471,43488,43489,43490,43491,43492,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43763,43764,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66369,66370,66371,66372,66373,66374,66375,66376,66377,66378,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66513,66514,66515,66516,66517,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68148,68149,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68224,68225,68226,68227,68228,68229,68230,68231,68232,68233,68234,68235,68236,68237,68238,68239,68240,68241,68242,68243,68244,68245,68246,68247,68248,68249,68250,68251,68252,68288,68289,68290,68291,68292,68293,68294,68295,68297,68298,68299,68300,68301,68302,68303,68304,68305,68306,68307,68308,68309,68310,68311,68312,68313,68314,68315,68316,68317,68318,68319,68320,68321,68322,68323,68324,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68480,68481,68482,68483,68484,68485,68486,68487,68488,68489,68490,68491,68492,68493,68494,68495,68496,68497,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,68864,68865,68866,68867,68868,68869,68870,68871,68872,68873,68874,68875,68876,68877,68878,68879,68880,68881,68882,68883,68884,68885,68886,68887,68888,68889,68890,68891,68892,68893,68894,68895,68896,68897,68898,68899,69248,69249,69250,69251,69252,69253,69254,69255,69256,69257,69258,69259,69260,69261,69262,69263,69264,69265,69266,69267,69268,69269,69270,69271,69272,69273,69274,69275,69276,69277,69278,69279,69280,69281,69282,69283,69284,69285,69286,69287,69288,69289,69296,69297,69376,69377,69378,69379,69380,69381,69382,69383,69384,69385,69386,69387,69388,69389,69390,69391,69392,69393,69394,69395,69396,69397,69398,69399,69400,69401,69402,69403,69404,69415,69424,69425,69426,69427,69428,69429,69430,69431,69432,69433,69434,69435,69436,69437,69438,69439,69440,69441,69442,69443,69444,69445,69488,69489,69490,69491,69492,69493,69494,69495,69496,69497,69498,69499,69500,69501,69502,69503,69504,69505,69552,69553,69554,69555,69556,69557,69558,69559,69560,69561,69562,69563,69564,69565,69566,69567,69568,69569,69570,69571,69572,69600,69601,69602,69603,69604,69605,69606,69607,69608,69609,69610,69611,69612,69613,69614,69615,69616,69617,69618,69619,69620,69621,69622,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69745,69746,69749,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,69956,69959,69968,69969,69970,69971,69972,69973,69974,69975,69976,69977,69978,69979,69980,69981,69982,69983,69984,69985,69986,69987,69988,69989,69990,69991,69992,69993,69994,69995,69996,69997,69998,69999,70000,70001,70002,70006,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70081,70082,70083,70084,70106,70108,70144,70145,70146,70147,70148,70149,70150,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70182,70183,70184,70185,70186,70187,70207,70208,70272,70273,70274,70275,70276,70277,70278,70280,70282,70283,70284,70285,70287,70288,70289,70290,70291,70292,70293,70294,70295,70296,70297,70298,70299,70300,70301,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70405,70406,70407,70408,70409,70410,70411,70412,70415,70416,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70442,70443,70444,70445,70446,70447,70448,70450,70451,70453,70454,70455,70456,70457,70461,70480,70493,70494,70495,70496,70497,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700,70701,70702,70703,70704,70705,70706,70707,70708,70727,70728,70729,70730,70751,70752,70753,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70852,70853,70855,71040,71041,71042,71043,71044,71045,71046,71047,71048,71049,71050,71051,71052,71053,71054,71055,71056,71057,71058,71059,71060,71061,71062,71063,71064,71065,71066,71067,71068,71069,71070,71071,71072,71073,71074,71075,71076,71077,71078,71079,71080,71081,71082,71083,71084,71085,71086,71128,71129,71130,71131,71168,71169,71170,71171,71172,71173,71174,71175,71176,71177,71178,71179,71180,71181,71182,71183,71184,71185,71186,71187,71188,71189,71190,71191,71192,71193,71194,71195,71196,71197,71198,71199,71200,71201,71202,71203,71204,71205,71206,71207,71208,71209,71210,71211,71212,71213,71214,71215,71236,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,71352,71424,71425,71426,71427,71428,71429,71430,71431,71432,71433,71434,71435,71436,71437,71438,71439,71440,71441,71442,71443,71444,71445,71446,71447,71448,71449,71450,71488,71489,71490,71491,71492,71493,71494,71680,71681,71682,71683,71684,71685,71686,71687,71688,71689,71690,71691,71692,71693,71694,71695,71696,71697,71698,71699,71700,71701,71702,71703,71704,71705,71706,71707,71708,71709,71710,71711,71712,71713,71714,71715,71716,71717,71718,71719,71720,71721,71722,71723,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,71935,71936,71937,71938,71939,71940,71941,71942,71945,71948,71949,71950,71951,71952,71953,71954,71955,71957,71958,71960,71961,71962,71963,71964,71965,71966,71967,71968,71969,71970,71971,71972,71973,71974,71975,71976,71977,71978,71979,71980,71981,71982,71983,71999,72001,72096,72097,72098,72099,72100,72101,72102,72103,72106,72107,72108,72109,72110,72111,72112,72113,72114,72115,72116,72117,72118,72119,72120,72121,72122,72123,72124,72125,72126,72127,72128,72129,72130,72131,72132,72133,72134,72135,72136,72137,72138,72139,72140,72141,72142,72143,72144,72161,72163,72192,72203,72204,72205,72206,72207,72208,72209,72210,72211,72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222,72223,72224,72225,72226,72227,72228,72229,72230,72231,72232,72233,72234,72235,72236,72237,72238,72239,72240,72241,72242,72250,72272,72284,72285,72286,72287,72288,72289,72290,72291,72292,72293,72294,72295,72296,72297,72298,72299,72300,72301,72302,72303,72304,72305,72306,72307,72308,72309,72310,72311,72312,72313,72314,72315,72316,72317,72318,72319,72320,72321,72322,72323,72324,72325,72326,72327,72328,72329,72349,72368,72369,72370,72371,72372,72373,72374,72375,72376,72377,72378,72379,72380,72381,72382,72383,72384,72385,72386,72387,72388,72389,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72404,72405,72406,72407,72408,72409,72410,72411,72412,72413,72414,72415,72416,72417,72418,72419,72420,72421,72422,72423,72424,72425,72426,72427,72428,72429,72430,72431,72432,72433,72434,72435,72436,72437,72438,72439,72440,72704,72705,72706,72707,72708,72709,72710,72711,72712,72714,72715,72716,72717,72718,72719,72720,72721,72722,72723,72724,72725,72726,72727,72728,72729,72730,72731,72732,72733,72734,72735,72736,72737,72738,72739,72740,72741,72742,72743,72744,72745,72746,72747,72748,72749,72750,72768,72818,72819,72820,72821,72822,72823,72824,72825,72826,72827,72828,72829,72830,72831,72832,72833,72834,72835,72836,72837,72838,72839,72840,72841,72842,72843,72844,72845,72846,72847,72960,72961,72962,72963,72964,72965,72966,72968,72969,72971,72972,72973,72974,72975,72976,72977,72978,72979,72980,72981,72982,72983,72984,72985,72986,72987,72988,72989,72990,72991,72992,72993,72994,72995,72996,72997,72998,72999,73000,73001,73002,73003,73004,73005,73006,73007,73008,73030,73056,73057,73058,73059,73060,73061,73063,73064,73066,73067,73068,73069,73070,73071,73072,73073,73074,73075,73076,73077,73078,73079,73080,73081,73082,73083,73084,73085,73086,73087,73088,73089,73090,73091,73092,73093,73094,73095,73096,73097,73112,73440,73441,73442,73443,73444,73445,73446,73447,73448,73449,73450,73451,73452,73453,73454,73455,73456,73457,73458,73474,73476,73477,73478,73479,73480,73481,73482,73483,73484,73485,73486,73487,73488,73490,73491,73492,73493,73494,73495,73496,73497,73498,73499,73500,73501,73502,73503,73504,73505,73506,73507,73508,73509,73510,73511,73512,73513,73514,73515,73516,73517,73518,73519,73520,73521,73522,73523,73648,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,74607,74608,74609,74610,74611,74612,74613,74614,74615,74616,74617,74618,74619,74620,74621,74622,74623,74624,74625,74626,74627,74628,74629,74630,74631,74632,74633,74634,74635,74636,74637,74638,74639,74640,74641,74642,74643,74644,74645,74646,74647,74648,74649,74752,74753,74754,74755,74756,74757,74758,74759,74760,74761,74762,74763,74764,74765,74766,74767,74768,74769,74770,74771,74772,74773,74774,74775,74776,74777,74778,74779,74780,74781,74782,74783,74784,74785,74786,74787,74788,74789,74790,74791,74792,74793,74794,74795,74796,74797,74798,74799,74800,74801,74802,74803,74804,74805,74806,74807,74808,74809,74810,74811,74812,74813,74814,74815,74816,74817,74818,74819,74820,74821,74822,74823,74824,74825,74826,74827,74828,74829,74830,74831,74832,74833,74834,74835,74836,74837,74838,74839,74840,74841,74842,74843,74844,74845,74846,74847,74848,74849,74850,74851,74852,74853,74854,74855,74856,74857,74858,74859,74860,74861,74862,74880,74881,74882,74883,74884,74885,74886,74887,74888,74889,74890,74891,74892,74893,74894,74895,74896,74897,74898,74899,74900,74901,74902,74903,74904,74905,74906,74907,74908,74909,74910,74911,74912,74913,74914,74915,74916,74917,74918,74919,74920,74921,74922,74923,74924,74925,74926,74927,74928,74929,74930,74931,74932,74933,74934,74935,74936,74937,74938,74939,74940,74941,74942,74943,74944,74945,74946,74947,74948,74949,74950,74951,74952,74953,74954,74955,74956,74957,74958,74959,74960,74961,74962,74963,74964,74965,74966,74967,74968,74969,74970,74971,74972,74973,74974,74975,74976,74977,74978,74979,74980,74981,74982,74983,74984,74985,74986,74987,74988,74989,74990,74991,74992,74993,74994,74995,74996,74997,74998,74999,75000,75001,75002,75003,75004,75005,75006,75007,75008,75009,75010,75011,75012,75013,75014,75015,75016,75017,75018,75019,75020,75021,75022,75023,75024,75025,75026,75027,75028,75029,75030,75031,75032,75033,75034,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75049,75050,75051,75052,75053,75054,75055,75056,75057,75058,75059,75060,75061,75062,75063,75064,75065,75066,75067,75068,75069,75070,75071,75072,75073,75074,75075,77712,77713,77714,77715,77716,77717,77718,77719,77720,77721,77722,77723,77724,77725,77726,77727,77728,77729,77730,77731,77732,77733,77734,77735,77736,77737,77738,77739,77740,77741,77742,77743,77744,77745,77746,77747,77748,77749,77750,77751,77752,77753,77754,77755,77756,77757,77758,77759,77760,77761,77762,77763,77764,77765,77766,77767,77768,77769,77770,77771,77772,77773,77774,77775,77776,77777,77778,77779,77780,77781,77782,77783,77784,77785,77786,77787,77788,77789,77790,77791,77792,77793,77794,77795,77796,77797,77798,77799,77800,77801,77802,77803,77804,77805,77806,77807,77808,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,78895,78913,78914,78915,78916,78917,78918,82944,82945,82946,82947,82948,82949,82950,82951,82952,82953,82954,82955,82956,82957,82958,82959,82960,82961,82962,82963,82964,82965,82966,82967,82968,82969,82970,82971,82972,82973,82974,82975,82976,82977,82978,82979,82980,82981,82982,82983,82984,82985,82986,82987,82988,82989,82990,82991,82992,82993,82994,82995,82996,82997,82998,82999,83000,83001,83002,83003,83004,83005,83006,83007,83008,83009,83010,83011,83012,83013,83014,83015,83016,83017,83018,83019,83020,83021,83022,83023,83024,83025,83026,83027,83028,83029,83030,83031,83032,83033,83034,83035,83036,83037,83038,83039,83040,83041,83042,83043,83044,83045,83046,83047,83048,83049,83050,83051,83052,83053,83054,83055,83056,83057,83058,83059,83060,83061,83062,83063,83064,83065,83066,83067,83068,83069,83070,83071,83072,83073,83074,83075,83076,83077,83078,83079,83080,83081,83082,83083,83084,83085,83086,83087,83088,83089,83090,83091,83092,83093,83094,83095,83096,83097,83098,83099,83100,83101,83102,83103,83104,83105,83106,83107,83108,83109,83110,83111,83112,83113,83114,83115,83116,83117,83118,83119,83120,83121,83122,83123,83124,83125,83126,83127,83128,83129,83130,83131,83132,83133,83134,83135,83136,83137,83138,83139,83140,83141,83142,83143,83144,83145,83146,83147,83148,83149,83150,83151,83152,83153,83154,83155,83156,83157,83158,83159,83160,83161,83162,83163,83164,83165,83166,83167,83168,83169,83170,83171,83172,83173,83174,83175,83176,83177,83178,83179,83180,83181,83182,83183,83184,83185,83186,83187,83188,83189,83190,83191,83192,83193,83194,83195,83196,83197,83198,83199,83200,83201,83202,83203,83204,83205,83206,83207,83208,83209,83210,83211,83212,83213,83214,83215,83216,83217,83218,83219,83220,83221,83222,83223,83224,83225,83226,83227,83228,83229,83230,83231,83232,83233,83234,83235,83236,83237,83238,83239,83240,83241,83242,83243,83244,83245,83246,83247,83248,83249,83250,83251,83252,83253,83254,83255,83256,83257,83258,83259,83260,83261,83262,83263,83264,83265,83266,83267,83268,83269,83270,83271,83272,83273,83274,83275,83276,83277,83278,83279,83280,83281,83282,83283,83284,83285,83286,83287,83288,83289,83290,83291,83292,83293,83294,83295,83296,83297,83298,83299,83300,83301,83302,83303,83304,83305,83306,83307,83308,83309,83310,83311,83312,83313,83314,83315,83316,83317,83318,83319,83320,83321,83322,83323,83324,83325,83326,83327,83328,83329,83330,83331,83332,83333,83334,83335,83336,83337,83338,83339,83340,83341,83342,83343,83344,83345,83346,83347,83348,83349,83350,83351,83352,83353,83354,83355,83356,83357,83358,83359,83360,83361,83362,83363,83364,83365,83366,83367,83368,83369,83370,83371,83372,83373,83374,83375,83376,83377,83378,83379,83380,83381,83382,83383,83384,83385,83386,83387,83388,83389,83390,83391,83392,83393,83394,83395,83396,83397,83398,83399,83400,83401,83402,83403,83404,83405,83406,83407,83408,83409,83410,83411,83412,83413,83414,83415,83416,83417,83418,83419,83420,83421,83422,83423,83424,83425,83426,83427,83428,83429,83430,83431,83432,83433,83434,83435,83436,83437,83438,83439,83440,83441,83442,83443,83444,83445,83446,83447,83448,83449,83450,83451,83452,83453,83454,83455,83456,83457,83458,83459,83460,83461,83462,83463,83464,83465,83466,83467,83468,83469,83470,83471,83472,83473,83474,83475,83476,83477,83478,83479,83480,83481,83482,83483,83484,83485,83486,83487,83488,83489,83490,83491,83492,83493,83494,83495,83496,83497,83498,83499,83500,83501,83502,83503,83504,83505,83506,83507,83508,83509,83510,83511,83512,83513,83514,83515,83516,83517,83518,83519,83520,83521,83522,83523,83524,83525,83526,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,92736,92737,92738,92739,92740,92741,92742,92743,92744,92745,92746,92747,92748,92749,92750,92751,92752,92753,92754,92755,92756,92757,92758,92759,92760,92761,92762,92763,92764,92765,92766,92784,92785,92786,92787,92788,92789,92790,92791,92792,92793,92794,92795,92796,92797,92798,92799,92800,92801,92802,92803,92804,92805,92806,92807,92808,92809,92810,92811,92812,92813,92814,92815,92816,92817,92818,92819,92820,92821,92822,92823,92824,92825,92826,92827,92828,92829,92830,92831,92832,92833,92834,92835,92836,92837,92838,92839,92840,92841,92842,92843,92844,92845,92846,92847,92848,92849,92850,92851,92852,92853,92854,92855,92856,92857,92858,92859,92860,92861,92862,92880,92881,92882,92883,92884,92885,92886,92887,92888,92889,92890,92891,92892,92893,92894,92895,92896,92897,92898,92899,92900,92901,92902,92903,92904,92905,92906,92907,92908,92909,92928,92929,92930,92931,92932,92933,92934,92935,92936,92937,92938,92939,92940,92941,92942,92943,92944,92945,92946,92947,92948,92949,92950,92951,92952,92953,92954,92955,92956,92957,92958,92959,92960,92961,92962,92963,92964,92965,92966,92967,92968,92969,92970,92971,92972,92973,92974,92975,92992,92993,92994,92995,93027,93028,93029,93030,93031,93032,93033,93034,93035,93036,93037,93038,93039,93040,93041,93042,93043,93044,93045,93046,93047,93053,93054,93055,93056,93057,93058,93059,93060,93061,93062,93063,93064,93065,93066,93067,93068,93069,93070,93071,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94021,94022,94023,94024,94025,94026,94032,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94179,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,110592,110593,110594,110595,110596,110597,110598,110599,110600,110601,110602,110603,110604,110605,110606,110607,110608,110609,110610,110611,110612,110613,110614,110615,110616,110617,110618,110619,110620,110621,110622,110623,110624,110625,110626,110627,110628,110629,110630,110631,110632,110633,110634,110635,110636,110637,110638,110639,110640,110641,110642,110643,110644,110645,110646,110647,110648,110649,110650,110651,110652,110653,110654,110655,110656,110657,110658,110659,110660,110661,110662,110663,110664,110665,110666,110667,110668,110669,110670,110671,110672,110673,110674,110675,110676,110677,110678,110679,110680,110681,110682,110683,110684,110685,110686,110687,110688,110689,110690,110691,110692,110693,110694,110695,110696,110697,110698,110699,110700,110701,110702,110703,110704,110705,110706,110707,110708,110709,110710,110711,110712,110713,110714,110715,110716,110717,110718,110719,110720,110721,110722,110723,110724,110725,110726,110727,110728,110729,110730,110731,110732,110733,110734,110735,110736,110737,110738,110739,110740,110741,110742,110743,110744,110745,110746,110747,110748,110749,110750,110751,110752,110753,110754,110755,110756,110757,110758,110759,110760,110761,110762,110763,110764,110765,110766,110767,110768,110769,110770,110771,110772,110773,110774,110775,110776,110777,110778,110779,110780,110781,110782,110783,110784,110785,110786,110787,110788,110789,110790,110791,110792,110793,110794,110795,110796,110797,110798,110799,110800,110801,110802,110803,110804,110805,110806,110807,110808,110809,110810,110811,110812,110813,110814,110815,110816,110817,110818,110819,110820,110821,110822,110823,110824,110825,110826,110827,110828,110829,110830,110831,110832,110833,110834,110835,110836,110837,110838,110839,110840,110841,110842,110843,110844,110845,110846,110847,110848,110849,110850,110851,110852,110853,110854,110855,110856,110857,110858,110859,110860,110861,110862,110863,110864,110865,110866,110867,110868,110869,110870,110871,110872,110873,110874,110875,110876,110877,110878,110879,110880,110881,110882,110898,110928,110929,110930,110933,110948,110949,110950,110951,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,113664,113665,113666,113667,113668,113669,113670,113671,113672,113673,113674,113675,113676,113677,113678,113679,113680,113681,113682,113683,113684,113685,113686,113687,113688,113689,113690,113691,113692,113693,113694,113695,113696,113697,113698,113699,113700,113701,113702,113703,113704,113705,113706,113707,113708,113709,113710,113711,113712,113713,113714,113715,113716,113717,113718,113719,113720,113721,113722,113723,113724,113725,113726,113727,113728,113729,113730,113731,113732,113733,113734,113735,113736,113737,113738,113739,113740,113741,113742,113743,113744,113745,113746,113747,113748,113749,113750,113751,113752,113753,113754,113755,113756,113757,113758,113759,113760,113761,113762,113763,113764,113765,113766,113767,113768,113769,113770,113776,113777,113778,113779,113780,113781,113782,113783,113784,113785,113786,113787,113788,113792,113793,113794,113795,113796,113797,113798,113799,113800,113808,113809,113810,113811,113812,113813,113814,113815,113816,113817,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122634,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123136,123137,123138,123139,123140,123141,123142,123143,123144,123145,123146,123147,123148,123149,123150,123151,123152,123153,123154,123155,123156,123157,123158,123159,123160,123161,123162,123163,123164,123165,123166,123167,123168,123169,123170,123171,123172,123173,123174,123175,123176,123177,123178,123179,123180,123191,123192,123193,123194,123195,123196,123197,123214,123536,123537,123538,123539,123540,123541,123542,123543,123544,123545,123546,123547,123548,123549,123550,123551,123552,123553,123554,123555,123556,123557,123558,123559,123560,123561,123562,123563,123564,123565,123584,123585,123586,123587,123588,123589,123590,123591,123592,123593,123594,123595,123596,123597,123598,123599,123600,123601,123602,123603,123604,123605,123606,123607,123608,123609,123610,123611,123612,123613,123614,123615,123616,123617,123618,123619,123620,123621,123622,123623,123624,123625,123626,123627,124112,124113,124114,124115,124116,124117,124118,124119,124120,124121,124122,124123,124124,124125,124126,124127,124128,124129,124130,124131,124132,124133,124134,124135,124136,124137,124138,124139,124896,124897,124898,124899,124900,124901,124902,124904,124905,124906,124907,124909,124910,124912,124913,124914,124915,124916,124917,124918,124919,124920,124921,124922,124923,124924,124925,124926,124928,124929,124930,124931,124932,124933,124934,124935,124936,124937,124938,124939,124940,124941,124942,124943,124944,124945,124946,124947,124948,124949,124950,124951,124952,124953,124954,124955,124956,124957,124958,124959,124960,124961,124962,124963,124964,124965,124966,124967,124968,124969,124970,124971,124972,124973,124974,124975,124976,124977,124978,124979,124980,124981,124982,124983,124984,124985,124986,124987,124988,124989,124990,124991,124992,124993,124994,124995,124996,124997,124998,124999,125000,125001,125002,125003,125004,125005,125006,125007,125008,125009,125010,125011,125012,125013,125014,125015,125016,125017,125018,125019,125020,125021,125022,125023,125024,125025,125026,125027,125028,125029,125030,125031,125032,125033,125034,125035,125036,125037,125038,125039,125040,125041,125042,125043,125044,125045,125046,125047,125048,125049,125050,125051,125052,125053,125054,125055,125056,125057,125058,125059,125060,125061,125062,125063,125064,125065,125066,125067,125068,125069,125070,125071,125072,125073,125074,125075,125076,125077,125078,125079,125080,125081,125082,125083,125084,125085,125086,125087,125088,125089,125090,125091,125092,125093,125094,125095,125096,125097,125098,125099,125100,125101,125102,125103,125104,125105,125106,125107,125108,125109,125110,125111,125112,125113,125114,125115,125116,125117,125118,125119,125120,125121,125122,125123,125124,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,125259,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743],"ID_Continue":[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,183,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,886,887,890,891,892,893,895,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1155,1156,1157,1158,1159,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1791,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2042,2045,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2185,2186,2187,2188,2189,2190,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2492,2493,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2509,2510,2519,2524,2525,2527,2528,2529,2530,2531,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2556,2558,2561,2562,2563,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2620,2622,2623,2624,2625,2626,2631,2632,2635,2636,2637,2641,2649,2650,2651,2652,2654,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2689,2690,2691,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2765,2768,2784,2785,2786,2787,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2809,2810,2811,2812,2813,2814,2815,2817,2818,2819,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2876,2877,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2893,2901,2902,2903,2908,2909,2911,2912,2913,2914,2915,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2929,2946,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3021,3024,3031,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3132,3133,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3149,3157,3158,3160,3161,3162,3165,3168,3169,3170,3171,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3200,3201,3202,3203,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3260,3261,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3277,3285,3286,3293,3294,3296,3297,3298,3299,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3313,3314,3315,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3405,3406,3412,3413,3414,3415,3423,3424,3425,3426,3427,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3450,3451,3452,3453,3454,3455,3457,3458,3459,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3530,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3570,3571,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3776,3777,3778,3779,3780,3782,3784,3785,3786,3787,3788,3789,3790,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3804,3805,3806,3807,3840,3864,3865,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3893,3895,3897,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4957,4958,4959,4969,4970,4971,4972,4973,4974,4975,4976,4977,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908,5909,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6002,6003,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6103,6108,6109,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6155,6156,6157,6159,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6618,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6823,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984,6985,6986,6987,6988,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7042,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,7155,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8204,8205,8255,8256,8276,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11503,11504,11505,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11647,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334,12335,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12441,12442,12443,12444,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42607,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42654,42655,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42736,42737,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43010,43011,43012,43013,43014,43015,43016,43017,43018,43019,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43043,43044,43045,43046,43047,43052,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43136,43137,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43204,43205,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43250,43251,43252,43253,43254,43255,43259,43261,43262,43263,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43302,43303,43304,43305,43306,43307,43308,43309,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43347,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43392,43393,43394,43395,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43443,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43456,43471,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43488,43489,43490,43491,43492,43493,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43584,43585,43586,43587,43588,43589,43590,43591,43592,43593,43594,43595,43596,43597,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43643,43644,43645,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43696,43697,43698,43699,43700,43701,43702,43703,43704,43705,43706,43707,43708,43709,43710,43711,43712,43713,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43755,43756,43757,43758,43759,43762,43763,43764,43765,43766,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44003,44004,44005,44006,44007,44008,44009,44010,44012,44013,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64286,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65075,65076,65101,65102,65103,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65343,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65381,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,66045,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66272,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66369,66370,66371,66372,66373,66374,66375,66376,66377,66378,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66422,66423,66424,66425,66426,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66513,66514,66515,66516,66517,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66720,66721,66722,66723,66724,66725,66726,66727,66728,66729,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68097,68098,68099,68101,68102,68108,68109,68110,68111,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68148,68149,68152,68153,68154,68159,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68224,68225,68226,68227,68228,68229,68230,68231,68232,68233,68234,68235,68236,68237,68238,68239,68240,68241,68242,68243,68244,68245,68246,68247,68248,68249,68250,68251,68252,68288,68289,68290,68291,68292,68293,68294,68295,68297,68298,68299,68300,68301,68302,68303,68304,68305,68306,68307,68308,68309,68310,68311,68312,68313,68314,68315,68316,68317,68318,68319,68320,68321,68322,68323,68324,68325,68326,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68480,68481,68482,68483,68484,68485,68486,68487,68488,68489,68490,68491,68492,68493,68494,68495,68496,68497,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,68864,68865,68866,68867,68868,68869,68870,68871,68872,68873,68874,68875,68876,68877,68878,68879,68880,68881,68882,68883,68884,68885,68886,68887,68888,68889,68890,68891,68892,68893,68894,68895,68896,68897,68898,68899,68900,68901,68902,68903,68912,68913,68914,68915,68916,68917,68918,68919,68920,68921,69248,69249,69250,69251,69252,69253,69254,69255,69256,69257,69258,69259,69260,69261,69262,69263,69264,69265,69266,69267,69268,69269,69270,69271,69272,69273,69274,69275,69276,69277,69278,69279,69280,69281,69282,69283,69284,69285,69286,69287,69288,69289,69291,69292,69296,69297,69373,69374,69375,69376,69377,69378,69379,69380,69381,69382,69383,69384,69385,69386,69387,69388,69389,69390,69391,69392,69393,69394,69395,69396,69397,69398,69399,69400,69401,69402,69403,69404,69415,69424,69425,69426,69427,69428,69429,69430,69431,69432,69433,69434,69435,69436,69437,69438,69439,69440,69441,69442,69443,69444,69445,69446,69447,69448,69449,69450,69451,69452,69453,69454,69455,69456,69488,69489,69490,69491,69492,69493,69494,69495,69496,69497,69498,69499,69500,69501,69502,69503,69504,69505,69506,69507,69508,69509,69552,69553,69554,69555,69556,69557,69558,69559,69560,69561,69562,69563,69564,69565,69566,69567,69568,69569,69570,69571,69572,69600,69601,69602,69603,69604,69605,69606,69607,69608,69609,69610,69611,69612,69613,69614,69615,69616,69617,69618,69619,69620,69621,69622,69632,69633,69634,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69688,69689,69690,69691,69692,69693,69694,69695,69696,69697,69698,69699,69700,69701,69702,69734,69735,69736,69737,69738,69739,69740,69741,69742,69743,69744,69745,69746,69747,69748,69749,69759,69760,69761,69762,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69808,69809,69810,69811,69812,69813,69814,69815,69816,69817,69818,69826,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69872,69873,69874,69875,69876,69877,69878,69879,69880,69881,69888,69889,69890,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,69927,69928,69929,69930,69931,69932,69933,69934,69935,69936,69937,69938,69939,69940,69942,69943,69944,69945,69946,69947,69948,69949,69950,69951,69956,69957,69958,69959,69968,69969,69970,69971,69972,69973,69974,69975,69976,69977,69978,69979,69980,69981,69982,69983,69984,69985,69986,69987,69988,69989,69990,69991,69992,69993,69994,69995,69996,69997,69998,69999,70000,70001,70002,70003,70006,70016,70017,70018,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70067,70068,70069,70070,70071,70072,70073,70074,70075,70076,70077,70078,70079,70080,70081,70082,70083,70084,70089,70090,70091,70092,70094,70095,70096,70097,70098,70099,70100,70101,70102,70103,70104,70105,70106,70108,70144,70145,70146,70147,70148,70149,70150,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70182,70183,70184,70185,70186,70187,70188,70189,70190,70191,70192,70193,70194,70195,70196,70197,70198,70199,70206,70207,70208,70209,70272,70273,70274,70275,70276,70277,70278,70280,70282,70283,70284,70285,70287,70288,70289,70290,70291,70292,70293,70294,70295,70296,70297,70298,70299,70300,70301,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70377,70378,70384,70385,70386,70387,70388,70389,70390,70391,70392,70393,70400,70401,70402,70403,70405,70406,70407,70408,70409,70410,70411,70412,70415,70416,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70442,70443,70444,70445,70446,70447,70448,70450,70451,70453,70454,70455,70456,70457,70459,70460,70461,70462,70463,70464,70465,70466,70467,70468,70471,70472,70475,70476,70477,70480,70487,70493,70494,70495,70496,70497,70498,70499,70502,70503,70504,70505,70506,70507,70508,70512,70513,70514,70515,70516,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700,70701,70702,70703,70704,70705,70706,70707,70708,70709,70710,70711,70712,70713,70714,70715,70716,70717,70718,70719,70720,70721,70722,70723,70724,70725,70726,70727,70728,70729,70730,70736,70737,70738,70739,70740,70741,70742,70743,70744,70745,70750,70751,70752,70753,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70832,70833,70834,70835,70836,70837,70838,70839,70840,70841,70842,70843,70844,70845,70846,70847,70848,70849,70850,70851,70852,70853,70855,70864,70865,70866,70867,70868,70869,70870,70871,70872,70873,71040,71041,71042,71043,71044,71045,71046,71047,71048,71049,71050,71051,71052,71053,71054,71055,71056,71057,71058,71059,71060,71061,71062,71063,71064,71065,71066,71067,71068,71069,71070,71071,71072,71073,71074,71075,71076,71077,71078,71079,71080,71081,71082,71083,71084,71085,71086,71087,71088,71089,71090,71091,71092,71093,71096,71097,71098,71099,71100,71101,71102,71103,71104,71128,71129,71130,71131,71132,71133,71168,71169,71170,71171,71172,71173,71174,71175,71176,71177,71178,71179,71180,71181,71182,71183,71184,71185,71186,71187,71188,71189,71190,71191,71192,71193,71194,71195,71196,71197,71198,71199,71200,71201,71202,71203,71204,71205,71206,71207,71208,71209,71210,71211,71212,71213,71214,71215,71216,71217,71218,71219,71220,71221,71222,71223,71224,71225,71226,71227,71228,71229,71230,71231,71232,71236,71248,71249,71250,71251,71252,71253,71254,71255,71256,71257,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,71339,71340,71341,71342,71343,71344,71345,71346,71347,71348,71349,71350,71351,71352,71360,71361,71362,71363,71364,71365,71366,71367,71368,71369,71424,71425,71426,71427,71428,71429,71430,71431,71432,71433,71434,71435,71436,71437,71438,71439,71440,71441,71442,71443,71444,71445,71446,71447,71448,71449,71450,71453,71454,71455,71456,71457,71458,71459,71460,71461,71462,71463,71464,71465,71466,71467,71472,71473,71474,71475,71476,71477,71478,71479,71480,71481,71488,71489,71490,71491,71492,71493,71494,71680,71681,71682,71683,71684,71685,71686,71687,71688,71689,71690,71691,71692,71693,71694,71695,71696,71697,71698,71699,71700,71701,71702,71703,71704,71705,71706,71707,71708,71709,71710,71711,71712,71713,71714,71715,71716,71717,71718,71719,71720,71721,71722,71723,71724,71725,71726,71727,71728,71729,71730,71731,71732,71733,71734,71735,71736,71737,71738,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,71904,71905,71906,71907,71908,71909,71910,71911,71912,71913,71935,71936,71937,71938,71939,71940,71941,71942,71945,71948,71949,71950,71951,71952,71953,71954,71955,71957,71958,71960,71961,71962,71963,71964,71965,71966,71967,71968,71969,71970,71971,71972,71973,71974,71975,71976,71977,71978,71979,71980,71981,71982,71983,71984,71985,71986,71987,71988,71989,71991,71992,71995,71996,71997,71998,71999,72000,72001,72002,72003,72016,72017,72018,72019,72020,72021,72022,72023,72024,72025,72096,72097,72098,72099,72100,72101,72102,72103,72106,72107,72108,72109,72110,72111,72112,72113,72114,72115,72116,72117,72118,72119,72120,72121,72122,72123,72124,72125,72126,72127,72128,72129,72130,72131,72132,72133,72134,72135,72136,72137,72138,72139,72140,72141,72142,72143,72144,72145,72146,72147,72148,72149,72150,72151,72154,72155,72156,72157,72158,72159,72160,72161,72163,72164,72192,72193,72194,72195,72196,72197,72198,72199,72200,72201,72202,72203,72204,72205,72206,72207,72208,72209,72210,72211,72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222,72223,72224,72225,72226,72227,72228,72229,72230,72231,72232,72233,72234,72235,72236,72237,72238,72239,72240,72241,72242,72243,72244,72245,72246,72247,72248,72249,72250,72251,72252,72253,72254,72263,72272,72273,72274,72275,72276,72277,72278,72279,72280,72281,72282,72283,72284,72285,72286,72287,72288,72289,72290,72291,72292,72293,72294,72295,72296,72297,72298,72299,72300,72301,72302,72303,72304,72305,72306,72307,72308,72309,72310,72311,72312,72313,72314,72315,72316,72317,72318,72319,72320,72321,72322,72323,72324,72325,72326,72327,72328,72329,72330,72331,72332,72333,72334,72335,72336,72337,72338,72339,72340,72341,72342,72343,72344,72345,72349,72368,72369,72370,72371,72372,72373,72374,72375,72376,72377,72378,72379,72380,72381,72382,72383,72384,72385,72386,72387,72388,72389,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72404,72405,72406,72407,72408,72409,72410,72411,72412,72413,72414,72415,72416,72417,72418,72419,72420,72421,72422,72423,72424,72425,72426,72427,72428,72429,72430,72431,72432,72433,72434,72435,72436,72437,72438,72439,72440,72704,72705,72706,72707,72708,72709,72710,72711,72712,72714,72715,72716,72717,72718,72719,72720,72721,72722,72723,72724,72725,72726,72727,72728,72729,72730,72731,72732,72733,72734,72735,72736,72737,72738,72739,72740,72741,72742,72743,72744,72745,72746,72747,72748,72749,72750,72751,72752,72753,72754,72755,72756,72757,72758,72760,72761,72762,72763,72764,72765,72766,72767,72768,72784,72785,72786,72787,72788,72789,72790,72791,72792,72793,72818,72819,72820,72821,72822,72823,72824,72825,72826,72827,72828,72829,72830,72831,72832,72833,72834,72835,72836,72837,72838,72839,72840,72841,72842,72843,72844,72845,72846,72847,72850,72851,72852,72853,72854,72855,72856,72857,72858,72859,72860,72861,72862,72863,72864,72865,72866,72867,72868,72869,72870,72871,72873,72874,72875,72876,72877,72878,72879,72880,72881,72882,72883,72884,72885,72886,72960,72961,72962,72963,72964,72965,72966,72968,72969,72971,72972,72973,72974,72975,72976,72977,72978,72979,72980,72981,72982,72983,72984,72985,72986,72987,72988,72989,72990,72991,72992,72993,72994,72995,72996,72997,72998,72999,73000,73001,73002,73003,73004,73005,73006,73007,73008,73009,73010,73011,73012,73013,73014,73018,73020,73021,73023,73024,73025,73026,73027,73028,73029,73030,73031,73040,73041,73042,73043,73044,73045,73046,73047,73048,73049,73056,73057,73058,73059,73060,73061,73063,73064,73066,73067,73068,73069,73070,73071,73072,73073,73074,73075,73076,73077,73078,73079,73080,73081,73082,73083,73084,73085,73086,73087,73088,73089,73090,73091,73092,73093,73094,73095,73096,73097,73098,73099,73100,73101,73102,73104,73105,73107,73108,73109,73110,73111,73112,73120,73121,73122,73123,73124,73125,73126,73127,73128,73129,73440,73441,73442,73443,73444,73445,73446,73447,73448,73449,73450,73451,73452,73453,73454,73455,73456,73457,73458,73459,73460,73461,73462,73472,73473,73474,73475,73476,73477,73478,73479,73480,73481,73482,73483,73484,73485,73486,73487,73488,73490,73491,73492,73493,73494,73495,73496,73497,73498,73499,73500,73501,73502,73503,73504,73505,73506,73507,73508,73509,73510,73511,73512,73513,73514,73515,73516,73517,73518,73519,73520,73521,73522,73523,73524,73525,73526,73527,73528,73529,73530,73534,73535,73536,73537,73538,73552,73553,73554,73555,73556,73557,73558,73559,73560,73561,73648,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,74607,74608,74609,74610,74611,74612,74613,74614,74615,74616,74617,74618,74619,74620,74621,74622,74623,74624,74625,74626,74627,74628,74629,74630,74631,74632,74633,74634,74635,74636,74637,74638,74639,74640,74641,74642,74643,74644,74645,74646,74647,74648,74649,74752,74753,74754,74755,74756,74757,74758,74759,74760,74761,74762,74763,74764,74765,74766,74767,74768,74769,74770,74771,74772,74773,74774,74775,74776,74777,74778,74779,74780,74781,74782,74783,74784,74785,74786,74787,74788,74789,74790,74791,74792,74793,74794,74795,74796,74797,74798,74799,74800,74801,74802,74803,74804,74805,74806,74807,74808,74809,74810,74811,74812,74813,74814,74815,74816,74817,74818,74819,74820,74821,74822,74823,74824,74825,74826,74827,74828,74829,74830,74831,74832,74833,74834,74835,74836,74837,74838,74839,74840,74841,74842,74843,74844,74845,74846,74847,74848,74849,74850,74851,74852,74853,74854,74855,74856,74857,74858,74859,74860,74861,74862,74880,74881,74882,74883,74884,74885,74886,74887,74888,74889,74890,74891,74892,74893,74894,74895,74896,74897,74898,74899,74900,74901,74902,74903,74904,74905,74906,74907,74908,74909,74910,74911,74912,74913,74914,74915,74916,74917,74918,74919,74920,74921,74922,74923,74924,74925,74926,74927,74928,74929,74930,74931,74932,74933,74934,74935,74936,74937,74938,74939,74940,74941,74942,74943,74944,74945,74946,74947,74948,74949,74950,74951,74952,74953,74954,74955,74956,74957,74958,74959,74960,74961,74962,74963,74964,74965,74966,74967,74968,74969,74970,74971,74972,74973,74974,74975,74976,74977,74978,74979,74980,74981,74982,74983,74984,74985,74986,74987,74988,74989,74990,74991,74992,74993,74994,74995,74996,74997,74998,74999,75000,75001,75002,75003,75004,75005,75006,75007,75008,75009,75010,75011,75012,75013,75014,75015,75016,75017,75018,75019,75020,75021,75022,75023,75024,75025,75026,75027,75028,75029,75030,75031,75032,75033,75034,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75049,75050,75051,75052,75053,75054,75055,75056,75057,75058,75059,75060,75061,75062,75063,75064,75065,75066,75067,75068,75069,75070,75071,75072,75073,75074,75075,77712,77713,77714,77715,77716,77717,77718,77719,77720,77721,77722,77723,77724,77725,77726,77727,77728,77729,77730,77731,77732,77733,77734,77735,77736,77737,77738,77739,77740,77741,77742,77743,77744,77745,77746,77747,77748,77749,77750,77751,77752,77753,77754,77755,77756,77757,77758,77759,77760,77761,77762,77763,77764,77765,77766,77767,77768,77769,77770,77771,77772,77773,77774,77775,77776,77777,77778,77779,77780,77781,77782,77783,77784,77785,77786,77787,77788,77789,77790,77791,77792,77793,77794,77795,77796,77797,77798,77799,77800,77801,77802,77803,77804,77805,77806,77807,77808,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,78895,78912,78913,78914,78915,78916,78917,78918,78919,78920,78921,78922,78923,78924,78925,78926,78927,78928,78929,78930,78931,78932,78933,82944,82945,82946,82947,82948,82949,82950,82951,82952,82953,82954,82955,82956,82957,82958,82959,82960,82961,82962,82963,82964,82965,82966,82967,82968,82969,82970,82971,82972,82973,82974,82975,82976,82977,82978,82979,82980,82981,82982,82983,82984,82985,82986,82987,82988,82989,82990,82991,82992,82993,82994,82995,82996,82997,82998,82999,83000,83001,83002,83003,83004,83005,83006,83007,83008,83009,83010,83011,83012,83013,83014,83015,83016,83017,83018,83019,83020,83021,83022,83023,83024,83025,83026,83027,83028,83029,83030,83031,83032,83033,83034,83035,83036,83037,83038,83039,83040,83041,83042,83043,83044,83045,83046,83047,83048,83049,83050,83051,83052,83053,83054,83055,83056,83057,83058,83059,83060,83061,83062,83063,83064,83065,83066,83067,83068,83069,83070,83071,83072,83073,83074,83075,83076,83077,83078,83079,83080,83081,83082,83083,83084,83085,83086,83087,83088,83089,83090,83091,83092,83093,83094,83095,83096,83097,83098,83099,83100,83101,83102,83103,83104,83105,83106,83107,83108,83109,83110,83111,83112,83113,83114,83115,83116,83117,83118,83119,83120,83121,83122,83123,83124,83125,83126,83127,83128,83129,83130,83131,83132,83133,83134,83135,83136,83137,83138,83139,83140,83141,83142,83143,83144,83145,83146,83147,83148,83149,83150,83151,83152,83153,83154,83155,83156,83157,83158,83159,83160,83161,83162,83163,83164,83165,83166,83167,83168,83169,83170,83171,83172,83173,83174,83175,83176,83177,83178,83179,83180,83181,83182,83183,83184,83185,83186,83187,83188,83189,83190,83191,83192,83193,83194,83195,83196,83197,83198,83199,83200,83201,83202,83203,83204,83205,83206,83207,83208,83209,83210,83211,83212,83213,83214,83215,83216,83217,83218,83219,83220,83221,83222,83223,83224,83225,83226,83227,83228,83229,83230,83231,83232,83233,83234,83235,83236,83237,83238,83239,83240,83241,83242,83243,83244,83245,83246,83247,83248,83249,83250,83251,83252,83253,83254,83255,83256,83257,83258,83259,83260,83261,83262,83263,83264,83265,83266,83267,83268,83269,83270,83271,83272,83273,83274,83275,83276,83277,83278,83279,83280,83281,83282,83283,83284,83285,83286,83287,83288,83289,83290,83291,83292,83293,83294,83295,83296,83297,83298,83299,83300,83301,83302,83303,83304,83305,83306,83307,83308,83309,83310,83311,83312,83313,83314,83315,83316,83317,83318,83319,83320,83321,83322,83323,83324,83325,83326,83327,83328,83329,83330,83331,83332,83333,83334,83335,83336,83337,83338,83339,83340,83341,83342,83343,83344,83345,83346,83347,83348,83349,83350,83351,83352,83353,83354,83355,83356,83357,83358,83359,83360,83361,83362,83363,83364,83365,83366,83367,83368,83369,83370,83371,83372,83373,83374,83375,83376,83377,83378,83379,83380,83381,83382,83383,83384,83385,83386,83387,83388,83389,83390,83391,83392,83393,83394,83395,83396,83397,83398,83399,83400,83401,83402,83403,83404,83405,83406,83407,83408,83409,83410,83411,83412,83413,83414,83415,83416,83417,83418,83419,83420,83421,83422,83423,83424,83425,83426,83427,83428,83429,83430,83431,83432,83433,83434,83435,83436,83437,83438,83439,83440,83441,83442,83443,83444,83445,83446,83447,83448,83449,83450,83451,83452,83453,83454,83455,83456,83457,83458,83459,83460,83461,83462,83463,83464,83465,83466,83467,83468,83469,83470,83471,83472,83473,83474,83475,83476,83477,83478,83479,83480,83481,83482,83483,83484,83485,83486,83487,83488,83489,83490,83491,83492,83493,83494,83495,83496,83497,83498,83499,83500,83501,83502,83503,83504,83505,83506,83507,83508,83509,83510,83511,83512,83513,83514,83515,83516,83517,83518,83519,83520,83521,83522,83523,83524,83525,83526,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,92736,92737,92738,92739,92740,92741,92742,92743,92744,92745,92746,92747,92748,92749,92750,92751,92752,92753,92754,92755,92756,92757,92758,92759,92760,92761,92762,92763,92764,92765,92766,92768,92769,92770,92771,92772,92773,92774,92775,92776,92777,92784,92785,92786,92787,92788,92789,92790,92791,92792,92793,92794,92795,92796,92797,92798,92799,92800,92801,92802,92803,92804,92805,92806,92807,92808,92809,92810,92811,92812,92813,92814,92815,92816,92817,92818,92819,92820,92821,92822,92823,92824,92825,92826,92827,92828,92829,92830,92831,92832,92833,92834,92835,92836,92837,92838,92839,92840,92841,92842,92843,92844,92845,92846,92847,92848,92849,92850,92851,92852,92853,92854,92855,92856,92857,92858,92859,92860,92861,92862,92864,92865,92866,92867,92868,92869,92870,92871,92872,92873,92880,92881,92882,92883,92884,92885,92886,92887,92888,92889,92890,92891,92892,92893,92894,92895,92896,92897,92898,92899,92900,92901,92902,92903,92904,92905,92906,92907,92908,92909,92912,92913,92914,92915,92916,92928,92929,92930,92931,92932,92933,92934,92935,92936,92937,92938,92939,92940,92941,92942,92943,92944,92945,92946,92947,92948,92949,92950,92951,92952,92953,92954,92955,92956,92957,92958,92959,92960,92961,92962,92963,92964,92965,92966,92967,92968,92969,92970,92971,92972,92973,92974,92975,92976,92977,92978,92979,92980,92981,92982,92992,92993,92994,92995,93008,93009,93010,93011,93012,93013,93014,93015,93016,93017,93027,93028,93029,93030,93031,93032,93033,93034,93035,93036,93037,93038,93039,93040,93041,93042,93043,93044,93045,93046,93047,93053,93054,93055,93056,93057,93058,93059,93060,93061,93062,93063,93064,93065,93066,93067,93068,93069,93070,93071,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94021,94022,94023,94024,94025,94026,94031,94032,94033,94034,94035,94036,94037,94038,94039,94040,94041,94042,94043,94044,94045,94046,94047,94048,94049,94050,94051,94052,94053,94054,94055,94056,94057,94058,94059,94060,94061,94062,94063,94064,94065,94066,94067,94068,94069,94070,94071,94072,94073,94074,94075,94076,94077,94078,94079,94080,94081,94082,94083,94084,94085,94086,94087,94095,94096,94097,94098,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94179,94180,94192,94193,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,110592,110593,110594,110595,110596,110597,110598,110599,110600,110601,110602,110603,110604,110605,110606,110607,110608,110609,110610,110611,110612,110613,110614,110615,110616,110617,110618,110619,110620,110621,110622,110623,110624,110625,110626,110627,110628,110629,110630,110631,110632,110633,110634,110635,110636,110637,110638,110639,110640,110641,110642,110643,110644,110645,110646,110647,110648,110649,110650,110651,110652,110653,110654,110655,110656,110657,110658,110659,110660,110661,110662,110663,110664,110665,110666,110667,110668,110669,110670,110671,110672,110673,110674,110675,110676,110677,110678,110679,110680,110681,110682,110683,110684,110685,110686,110687,110688,110689,110690,110691,110692,110693,110694,110695,110696,110697,110698,110699,110700,110701,110702,110703,110704,110705,110706,110707,110708,110709,110710,110711,110712,110713,110714,110715,110716,110717,110718,110719,110720,110721,110722,110723,110724,110725,110726,110727,110728,110729,110730,110731,110732,110733,110734,110735,110736,110737,110738,110739,110740,110741,110742,110743,110744,110745,110746,110747,110748,110749,110750,110751,110752,110753,110754,110755,110756,110757,110758,110759,110760,110761,110762,110763,110764,110765,110766,110767,110768,110769,110770,110771,110772,110773,110774,110775,110776,110777,110778,110779,110780,110781,110782,110783,110784,110785,110786,110787,110788,110789,110790,110791,110792,110793,110794,110795,110796,110797,110798,110799,110800,110801,110802,110803,110804,110805,110806,110807,110808,110809,110810,110811,110812,110813,110814,110815,110816,110817,110818,110819,110820,110821,110822,110823,110824,110825,110826,110827,110828,110829,110830,110831,110832,110833,110834,110835,110836,110837,110838,110839,110840,110841,110842,110843,110844,110845,110846,110847,110848,110849,110850,110851,110852,110853,110854,110855,110856,110857,110858,110859,110860,110861,110862,110863,110864,110865,110866,110867,110868,110869,110870,110871,110872,110873,110874,110875,110876,110877,110878,110879,110880,110881,110882,110898,110928,110929,110930,110933,110948,110949,110950,110951,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,113664,113665,113666,113667,113668,113669,113670,113671,113672,113673,113674,113675,113676,113677,113678,113679,113680,113681,113682,113683,113684,113685,113686,113687,113688,113689,113690,113691,113692,113693,113694,113695,113696,113697,113698,113699,113700,113701,113702,113703,113704,113705,113706,113707,113708,113709,113710,113711,113712,113713,113714,113715,113716,113717,113718,113719,113720,113721,113722,113723,113724,113725,113726,113727,113728,113729,113730,113731,113732,113733,113734,113735,113736,113737,113738,113739,113740,113741,113742,113743,113744,113745,113746,113747,113748,113749,113750,113751,113752,113753,113754,113755,113756,113757,113758,113759,113760,113761,113762,113763,113764,113765,113766,113767,113768,113769,113770,113776,113777,113778,113779,113780,113781,113782,113783,113784,113785,113786,113787,113788,113792,113793,113794,113795,113796,113797,113798,113799,113800,113808,113809,113810,113811,113812,113813,113814,113815,113816,113817,113821,113822,118528,118529,118530,118531,118532,118533,118534,118535,118536,118537,118538,118539,118540,118541,118542,118543,118544,118545,118546,118547,118548,118549,118550,118551,118552,118553,118554,118555,118556,118557,118558,118559,118560,118561,118562,118563,118564,118565,118566,118567,118568,118569,118570,118571,118572,118573,118576,118577,118578,118579,118580,118581,118582,118583,118584,118585,118586,118587,118588,118589,118590,118591,118592,118593,118594,118595,118596,118597,118598,119141,119142,119143,119144,119145,119149,119150,119151,119152,119153,119154,119163,119164,119165,119166,119167,119168,119169,119170,119173,119174,119175,119176,119177,119178,119179,119210,119211,119212,119213,119362,119363,119364,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,120782,120783,120784,120785,120786,120787,120788,120789,120790,120791,120792,120793,120794,120795,120796,120797,120798,120799,120800,120801,120802,120803,120804,120805,120806,120807,120808,120809,120810,120811,120812,120813,120814,120815,120816,120817,120818,120819,120820,120821,120822,120823,120824,120825,120826,120827,120828,120829,120830,120831,121344,121345,121346,121347,121348,121349,121350,121351,121352,121353,121354,121355,121356,121357,121358,121359,121360,121361,121362,121363,121364,121365,121366,121367,121368,121369,121370,121371,121372,121373,121374,121375,121376,121377,121378,121379,121380,121381,121382,121383,121384,121385,121386,121387,121388,121389,121390,121391,121392,121393,121394,121395,121396,121397,121398,121403,121404,121405,121406,121407,121408,121409,121410,121411,121412,121413,121414,121415,121416,121417,121418,121419,121420,121421,121422,121423,121424,121425,121426,121427,121428,121429,121430,121431,121432,121433,121434,121435,121436,121437,121438,121439,121440,121441,121442,121443,121444,121445,121446,121447,121448,121449,121450,121451,121452,121461,121476,121499,121500,121501,121502,121503,121505,121506,121507,121508,121509,121510,121511,121512,121513,121514,121515,121516,121517,121518,121519,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122634,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122880,122881,122882,122883,122884,122885,122886,122888,122889,122890,122891,122892,122893,122894,122895,122896,122897,122898,122899,122900,122901,122902,122903,122904,122907,122908,122909,122910,122911,122912,122913,122915,122916,122918,122919,122920,122921,122922,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123023,123136,123137,123138,123139,123140,123141,123142,123143,123144,123145,123146,123147,123148,123149,123150,123151,123152,123153,123154,123155,123156,123157,123158,123159,123160,123161,123162,123163,123164,123165,123166,123167,123168,123169,123170,123171,123172,123173,123174,123175,123176,123177,123178,123179,123180,123184,123185,123186,123187,123188,123189,123190,123191,123192,123193,123194,123195,123196,123197,123200,123201,123202,123203,123204,123205,123206,123207,123208,123209,123214,123536,123537,123538,123539,123540,123541,123542,123543,123544,123545,123546,123547,123548,123549,123550,123551,123552,123553,123554,123555,123556,123557,123558,123559,123560,123561,123562,123563,123564,123565,123566,123584,123585,123586,123587,123588,123589,123590,123591,123592,123593,123594,123595,123596,123597,123598,123599,123600,123601,123602,123603,123604,123605,123606,123607,123608,123609,123610,123611,123612,123613,123614,123615,123616,123617,123618,123619,123620,123621,123622,123623,123624,123625,123626,123627,123628,123629,123630,123631,123632,123633,123634,123635,123636,123637,123638,123639,123640,123641,124112,124113,124114,124115,124116,124117,124118,124119,124120,124121,124122,124123,124124,124125,124126,124127,124128,124129,124130,124131,124132,124133,124134,124135,124136,124137,124138,124139,124140,124141,124142,124143,124144,124145,124146,124147,124148,124149,124150,124151,124152,124153,124896,124897,124898,124899,124900,124901,124902,124904,124905,124906,124907,124909,124910,124912,124913,124914,124915,124916,124917,124918,124919,124920,124921,124922,124923,124924,124925,124926,124928,124929,124930,124931,124932,124933,124934,124935,124936,124937,124938,124939,124940,124941,124942,124943,124944,124945,124946,124947,124948,124949,124950,124951,124952,124953,124954,124955,124956,124957,124958,124959,124960,124961,124962,124963,124964,124965,124966,124967,124968,124969,124970,124971,124972,124973,124974,124975,124976,124977,124978,124979,124980,124981,124982,124983,124984,124985,124986,124987,124988,124989,124990,124991,124992,124993,124994,124995,124996,124997,124998,124999,125000,125001,125002,125003,125004,125005,125006,125007,125008,125009,125010,125011,125012,125013,125014,125015,125016,125017,125018,125019,125020,125021,125022,125023,125024,125025,125026,125027,125028,125029,125030,125031,125032,125033,125034,125035,125036,125037,125038,125039,125040,125041,125042,125043,125044,125045,125046,125047,125048,125049,125050,125051,125052,125053,125054,125055,125056,125057,125058,125059,125060,125061,125062,125063,125064,125065,125066,125067,125068,125069,125070,125071,125072,125073,125074,125075,125076,125077,125078,125079,125080,125081,125082,125083,125084,125085,125086,125087,125088,125089,125090,125091,125092,125093,125094,125095,125096,125097,125098,125099,125100,125101,125102,125103,125104,125105,125106,125107,125108,125109,125110,125111,125112,125113,125114,125115,125116,125117,125118,125119,125120,125121,125122,125123,125124,125136,125137,125138,125139,125140,125141,125142,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,125252,125253,125254,125255,125256,125257,125258,125259,125264,125265,125266,125267,125268,125269,125270,125271,125272,125273,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,130032,130033,130034,130035,130036,130037,130038,130039,130040,130041,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999],"XID_Start":[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,880,881,882,883,884,886,887,891,892,893,895,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1765,1766,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2185,2186,2187,2188,2189,2190,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2556,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2809,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3160,3161,3162,3165,3168,3169,3200,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3293,3294,3296,3297,3313,3314,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3412,3413,3414,3423,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3648,3649,3650,3651,3652,3653,3654,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3762,3773,3776,3777,3778,3779,3780,3782,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6103,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6823,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,6988,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7401,7402,7403,7404,7406,7407,7408,7409,7410,7411,7413,7414,7418,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43261,43262,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43471,43488,43489,43490,43491,43492,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43763,43764,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65137,65139,65143,65145,65147,65149,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66369,66370,66371,66372,66373,66374,66375,66376,66377,66378,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66513,66514,66515,66516,66517,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68148,68149,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68224,68225,68226,68227,68228,68229,68230,68231,68232,68233,68234,68235,68236,68237,68238,68239,68240,68241,68242,68243,68244,68245,68246,68247,68248,68249,68250,68251,68252,68288,68289,68290,68291,68292,68293,68294,68295,68297,68298,68299,68300,68301,68302,68303,68304,68305,68306,68307,68308,68309,68310,68311,68312,68313,68314,68315,68316,68317,68318,68319,68320,68321,68322,68323,68324,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68480,68481,68482,68483,68484,68485,68486,68487,68488,68489,68490,68491,68492,68493,68494,68495,68496,68497,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,68864,68865,68866,68867,68868,68869,68870,68871,68872,68873,68874,68875,68876,68877,68878,68879,68880,68881,68882,68883,68884,68885,68886,68887,68888,68889,68890,68891,68892,68893,68894,68895,68896,68897,68898,68899,69248,69249,69250,69251,69252,69253,69254,69255,69256,69257,69258,69259,69260,69261,69262,69263,69264,69265,69266,69267,69268,69269,69270,69271,69272,69273,69274,69275,69276,69277,69278,69279,69280,69281,69282,69283,69284,69285,69286,69287,69288,69289,69296,69297,69376,69377,69378,69379,69380,69381,69382,69383,69384,69385,69386,69387,69388,69389,69390,69391,69392,69393,69394,69395,69396,69397,69398,69399,69400,69401,69402,69403,69404,69415,69424,69425,69426,69427,69428,69429,69430,69431,69432,69433,69434,69435,69436,69437,69438,69439,69440,69441,69442,69443,69444,69445,69488,69489,69490,69491,69492,69493,69494,69495,69496,69497,69498,69499,69500,69501,69502,69503,69504,69505,69552,69553,69554,69555,69556,69557,69558,69559,69560,69561,69562,69563,69564,69565,69566,69567,69568,69569,69570,69571,69572,69600,69601,69602,69603,69604,69605,69606,69607,69608,69609,69610,69611,69612,69613,69614,69615,69616,69617,69618,69619,69620,69621,69622,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69745,69746,69749,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,69956,69959,69968,69969,69970,69971,69972,69973,69974,69975,69976,69977,69978,69979,69980,69981,69982,69983,69984,69985,69986,69987,69988,69989,69990,69991,69992,69993,69994,69995,69996,69997,69998,69999,70000,70001,70002,70006,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70081,70082,70083,70084,70106,70108,70144,70145,70146,70147,70148,70149,70150,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70182,70183,70184,70185,70186,70187,70207,70208,70272,70273,70274,70275,70276,70277,70278,70280,70282,70283,70284,70285,70287,70288,70289,70290,70291,70292,70293,70294,70295,70296,70297,70298,70299,70300,70301,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70405,70406,70407,70408,70409,70410,70411,70412,70415,70416,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70442,70443,70444,70445,70446,70447,70448,70450,70451,70453,70454,70455,70456,70457,70461,70480,70493,70494,70495,70496,70497,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700,70701,70702,70703,70704,70705,70706,70707,70708,70727,70728,70729,70730,70751,70752,70753,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70852,70853,70855,71040,71041,71042,71043,71044,71045,71046,71047,71048,71049,71050,71051,71052,71053,71054,71055,71056,71057,71058,71059,71060,71061,71062,71063,71064,71065,71066,71067,71068,71069,71070,71071,71072,71073,71074,71075,71076,71077,71078,71079,71080,71081,71082,71083,71084,71085,71086,71128,71129,71130,71131,71168,71169,71170,71171,71172,71173,71174,71175,71176,71177,71178,71179,71180,71181,71182,71183,71184,71185,71186,71187,71188,71189,71190,71191,71192,71193,71194,71195,71196,71197,71198,71199,71200,71201,71202,71203,71204,71205,71206,71207,71208,71209,71210,71211,71212,71213,71214,71215,71236,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,71352,71424,71425,71426,71427,71428,71429,71430,71431,71432,71433,71434,71435,71436,71437,71438,71439,71440,71441,71442,71443,71444,71445,71446,71447,71448,71449,71450,71488,71489,71490,71491,71492,71493,71494,71680,71681,71682,71683,71684,71685,71686,71687,71688,71689,71690,71691,71692,71693,71694,71695,71696,71697,71698,71699,71700,71701,71702,71703,71704,71705,71706,71707,71708,71709,71710,71711,71712,71713,71714,71715,71716,71717,71718,71719,71720,71721,71722,71723,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,71935,71936,71937,71938,71939,71940,71941,71942,71945,71948,71949,71950,71951,71952,71953,71954,71955,71957,71958,71960,71961,71962,71963,71964,71965,71966,71967,71968,71969,71970,71971,71972,71973,71974,71975,71976,71977,71978,71979,71980,71981,71982,71983,71999,72001,72096,72097,72098,72099,72100,72101,72102,72103,72106,72107,72108,72109,72110,72111,72112,72113,72114,72115,72116,72117,72118,72119,72120,72121,72122,72123,72124,72125,72126,72127,72128,72129,72130,72131,72132,72133,72134,72135,72136,72137,72138,72139,72140,72141,72142,72143,72144,72161,72163,72192,72203,72204,72205,72206,72207,72208,72209,72210,72211,72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222,72223,72224,72225,72226,72227,72228,72229,72230,72231,72232,72233,72234,72235,72236,72237,72238,72239,72240,72241,72242,72250,72272,72284,72285,72286,72287,72288,72289,72290,72291,72292,72293,72294,72295,72296,72297,72298,72299,72300,72301,72302,72303,72304,72305,72306,72307,72308,72309,72310,72311,72312,72313,72314,72315,72316,72317,72318,72319,72320,72321,72322,72323,72324,72325,72326,72327,72328,72329,72349,72368,72369,72370,72371,72372,72373,72374,72375,72376,72377,72378,72379,72380,72381,72382,72383,72384,72385,72386,72387,72388,72389,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72404,72405,72406,72407,72408,72409,72410,72411,72412,72413,72414,72415,72416,72417,72418,72419,72420,72421,72422,72423,72424,72425,72426,72427,72428,72429,72430,72431,72432,72433,72434,72435,72436,72437,72438,72439,72440,72704,72705,72706,72707,72708,72709,72710,72711,72712,72714,72715,72716,72717,72718,72719,72720,72721,72722,72723,72724,72725,72726,72727,72728,72729,72730,72731,72732,72733,72734,72735,72736,72737,72738,72739,72740,72741,72742,72743,72744,72745,72746,72747,72748,72749,72750,72768,72818,72819,72820,72821,72822,72823,72824,72825,72826,72827,72828,72829,72830,72831,72832,72833,72834,72835,72836,72837,72838,72839,72840,72841,72842,72843,72844,72845,72846,72847,72960,72961,72962,72963,72964,72965,72966,72968,72969,72971,72972,72973,72974,72975,72976,72977,72978,72979,72980,72981,72982,72983,72984,72985,72986,72987,72988,72989,72990,72991,72992,72993,72994,72995,72996,72997,72998,72999,73000,73001,73002,73003,73004,73005,73006,73007,73008,73030,73056,73057,73058,73059,73060,73061,73063,73064,73066,73067,73068,73069,73070,73071,73072,73073,73074,73075,73076,73077,73078,73079,73080,73081,73082,73083,73084,73085,73086,73087,73088,73089,73090,73091,73092,73093,73094,73095,73096,73097,73112,73440,73441,73442,73443,73444,73445,73446,73447,73448,73449,73450,73451,73452,73453,73454,73455,73456,73457,73458,73474,73476,73477,73478,73479,73480,73481,73482,73483,73484,73485,73486,73487,73488,73490,73491,73492,73493,73494,73495,73496,73497,73498,73499,73500,73501,73502,73503,73504,73505,73506,73507,73508,73509,73510,73511,73512,73513,73514,73515,73516,73517,73518,73519,73520,73521,73522,73523,73648,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,74607,74608,74609,74610,74611,74612,74613,74614,74615,74616,74617,74618,74619,74620,74621,74622,74623,74624,74625,74626,74627,74628,74629,74630,74631,74632,74633,74634,74635,74636,74637,74638,74639,74640,74641,74642,74643,74644,74645,74646,74647,74648,74649,74752,74753,74754,74755,74756,74757,74758,74759,74760,74761,74762,74763,74764,74765,74766,74767,74768,74769,74770,74771,74772,74773,74774,74775,74776,74777,74778,74779,74780,74781,74782,74783,74784,74785,74786,74787,74788,74789,74790,74791,74792,74793,74794,74795,74796,74797,74798,74799,74800,74801,74802,74803,74804,74805,74806,74807,74808,74809,74810,74811,74812,74813,74814,74815,74816,74817,74818,74819,74820,74821,74822,74823,74824,74825,74826,74827,74828,74829,74830,74831,74832,74833,74834,74835,74836,74837,74838,74839,74840,74841,74842,74843,74844,74845,74846,74847,74848,74849,74850,74851,74852,74853,74854,74855,74856,74857,74858,74859,74860,74861,74862,74880,74881,74882,74883,74884,74885,74886,74887,74888,74889,74890,74891,74892,74893,74894,74895,74896,74897,74898,74899,74900,74901,74902,74903,74904,74905,74906,74907,74908,74909,74910,74911,74912,74913,74914,74915,74916,74917,74918,74919,74920,74921,74922,74923,74924,74925,74926,74927,74928,74929,74930,74931,74932,74933,74934,74935,74936,74937,74938,74939,74940,74941,74942,74943,74944,74945,74946,74947,74948,74949,74950,74951,74952,74953,74954,74955,74956,74957,74958,74959,74960,74961,74962,74963,74964,74965,74966,74967,74968,74969,74970,74971,74972,74973,74974,74975,74976,74977,74978,74979,74980,74981,74982,74983,74984,74985,74986,74987,74988,74989,74990,74991,74992,74993,74994,74995,74996,74997,74998,74999,75000,75001,75002,75003,75004,75005,75006,75007,75008,75009,75010,75011,75012,75013,75014,75015,75016,75017,75018,75019,75020,75021,75022,75023,75024,75025,75026,75027,75028,75029,75030,75031,75032,75033,75034,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75049,75050,75051,75052,75053,75054,75055,75056,75057,75058,75059,75060,75061,75062,75063,75064,75065,75066,75067,75068,75069,75070,75071,75072,75073,75074,75075,77712,77713,77714,77715,77716,77717,77718,77719,77720,77721,77722,77723,77724,77725,77726,77727,77728,77729,77730,77731,77732,77733,77734,77735,77736,77737,77738,77739,77740,77741,77742,77743,77744,77745,77746,77747,77748,77749,77750,77751,77752,77753,77754,77755,77756,77757,77758,77759,77760,77761,77762,77763,77764,77765,77766,77767,77768,77769,77770,77771,77772,77773,77774,77775,77776,77777,77778,77779,77780,77781,77782,77783,77784,77785,77786,77787,77788,77789,77790,77791,77792,77793,77794,77795,77796,77797,77798,77799,77800,77801,77802,77803,77804,77805,77806,77807,77808,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,78895,78913,78914,78915,78916,78917,78918,82944,82945,82946,82947,82948,82949,82950,82951,82952,82953,82954,82955,82956,82957,82958,82959,82960,82961,82962,82963,82964,82965,82966,82967,82968,82969,82970,82971,82972,82973,82974,82975,82976,82977,82978,82979,82980,82981,82982,82983,82984,82985,82986,82987,82988,82989,82990,82991,82992,82993,82994,82995,82996,82997,82998,82999,83000,83001,83002,83003,83004,83005,83006,83007,83008,83009,83010,83011,83012,83013,83014,83015,83016,83017,83018,83019,83020,83021,83022,83023,83024,83025,83026,83027,83028,83029,83030,83031,83032,83033,83034,83035,83036,83037,83038,83039,83040,83041,83042,83043,83044,83045,83046,83047,83048,83049,83050,83051,83052,83053,83054,83055,83056,83057,83058,83059,83060,83061,83062,83063,83064,83065,83066,83067,83068,83069,83070,83071,83072,83073,83074,83075,83076,83077,83078,83079,83080,83081,83082,83083,83084,83085,83086,83087,83088,83089,83090,83091,83092,83093,83094,83095,83096,83097,83098,83099,83100,83101,83102,83103,83104,83105,83106,83107,83108,83109,83110,83111,83112,83113,83114,83115,83116,83117,83118,83119,83120,83121,83122,83123,83124,83125,83126,83127,83128,83129,83130,83131,83132,83133,83134,83135,83136,83137,83138,83139,83140,83141,83142,83143,83144,83145,83146,83147,83148,83149,83150,83151,83152,83153,83154,83155,83156,83157,83158,83159,83160,83161,83162,83163,83164,83165,83166,83167,83168,83169,83170,83171,83172,83173,83174,83175,83176,83177,83178,83179,83180,83181,83182,83183,83184,83185,83186,83187,83188,83189,83190,83191,83192,83193,83194,83195,83196,83197,83198,83199,83200,83201,83202,83203,83204,83205,83206,83207,83208,83209,83210,83211,83212,83213,83214,83215,83216,83217,83218,83219,83220,83221,83222,83223,83224,83225,83226,83227,83228,83229,83230,83231,83232,83233,83234,83235,83236,83237,83238,83239,83240,83241,83242,83243,83244,83245,83246,83247,83248,83249,83250,83251,83252,83253,83254,83255,83256,83257,83258,83259,83260,83261,83262,83263,83264,83265,83266,83267,83268,83269,83270,83271,83272,83273,83274,83275,83276,83277,83278,83279,83280,83281,83282,83283,83284,83285,83286,83287,83288,83289,83290,83291,83292,83293,83294,83295,83296,83297,83298,83299,83300,83301,83302,83303,83304,83305,83306,83307,83308,83309,83310,83311,83312,83313,83314,83315,83316,83317,83318,83319,83320,83321,83322,83323,83324,83325,83326,83327,83328,83329,83330,83331,83332,83333,83334,83335,83336,83337,83338,83339,83340,83341,83342,83343,83344,83345,83346,83347,83348,83349,83350,83351,83352,83353,83354,83355,83356,83357,83358,83359,83360,83361,83362,83363,83364,83365,83366,83367,83368,83369,83370,83371,83372,83373,83374,83375,83376,83377,83378,83379,83380,83381,83382,83383,83384,83385,83386,83387,83388,83389,83390,83391,83392,83393,83394,83395,83396,83397,83398,83399,83400,83401,83402,83403,83404,83405,83406,83407,83408,83409,83410,83411,83412,83413,83414,83415,83416,83417,83418,83419,83420,83421,83422,83423,83424,83425,83426,83427,83428,83429,83430,83431,83432,83433,83434,83435,83436,83437,83438,83439,83440,83441,83442,83443,83444,83445,83446,83447,83448,83449,83450,83451,83452,83453,83454,83455,83456,83457,83458,83459,83460,83461,83462,83463,83464,83465,83466,83467,83468,83469,83470,83471,83472,83473,83474,83475,83476,83477,83478,83479,83480,83481,83482,83483,83484,83485,83486,83487,83488,83489,83490,83491,83492,83493,83494,83495,83496,83497,83498,83499,83500,83501,83502,83503,83504,83505,83506,83507,83508,83509,83510,83511,83512,83513,83514,83515,83516,83517,83518,83519,83520,83521,83522,83523,83524,83525,83526,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,92736,92737,92738,92739,92740,92741,92742,92743,92744,92745,92746,92747,92748,92749,92750,92751,92752,92753,92754,92755,92756,92757,92758,92759,92760,92761,92762,92763,92764,92765,92766,92784,92785,92786,92787,92788,92789,92790,92791,92792,92793,92794,92795,92796,92797,92798,92799,92800,92801,92802,92803,92804,92805,92806,92807,92808,92809,92810,92811,92812,92813,92814,92815,92816,92817,92818,92819,92820,92821,92822,92823,92824,92825,92826,92827,92828,92829,92830,92831,92832,92833,92834,92835,92836,92837,92838,92839,92840,92841,92842,92843,92844,92845,92846,92847,92848,92849,92850,92851,92852,92853,92854,92855,92856,92857,92858,92859,92860,92861,92862,92880,92881,92882,92883,92884,92885,92886,92887,92888,92889,92890,92891,92892,92893,92894,92895,92896,92897,92898,92899,92900,92901,92902,92903,92904,92905,92906,92907,92908,92909,92928,92929,92930,92931,92932,92933,92934,92935,92936,92937,92938,92939,92940,92941,92942,92943,92944,92945,92946,92947,92948,92949,92950,92951,92952,92953,92954,92955,92956,92957,92958,92959,92960,92961,92962,92963,92964,92965,92966,92967,92968,92969,92970,92971,92972,92973,92974,92975,92992,92993,92994,92995,93027,93028,93029,93030,93031,93032,93033,93034,93035,93036,93037,93038,93039,93040,93041,93042,93043,93044,93045,93046,93047,93053,93054,93055,93056,93057,93058,93059,93060,93061,93062,93063,93064,93065,93066,93067,93068,93069,93070,93071,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94021,94022,94023,94024,94025,94026,94032,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94179,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,110592,110593,110594,110595,110596,110597,110598,110599,110600,110601,110602,110603,110604,110605,110606,110607,110608,110609,110610,110611,110612,110613,110614,110615,110616,110617,110618,110619,110620,110621,110622,110623,110624,110625,110626,110627,110628,110629,110630,110631,110632,110633,110634,110635,110636,110637,110638,110639,110640,110641,110642,110643,110644,110645,110646,110647,110648,110649,110650,110651,110652,110653,110654,110655,110656,110657,110658,110659,110660,110661,110662,110663,110664,110665,110666,110667,110668,110669,110670,110671,110672,110673,110674,110675,110676,110677,110678,110679,110680,110681,110682,110683,110684,110685,110686,110687,110688,110689,110690,110691,110692,110693,110694,110695,110696,110697,110698,110699,110700,110701,110702,110703,110704,110705,110706,110707,110708,110709,110710,110711,110712,110713,110714,110715,110716,110717,110718,110719,110720,110721,110722,110723,110724,110725,110726,110727,110728,110729,110730,110731,110732,110733,110734,110735,110736,110737,110738,110739,110740,110741,110742,110743,110744,110745,110746,110747,110748,110749,110750,110751,110752,110753,110754,110755,110756,110757,110758,110759,110760,110761,110762,110763,110764,110765,110766,110767,110768,110769,110770,110771,110772,110773,110774,110775,110776,110777,110778,110779,110780,110781,110782,110783,110784,110785,110786,110787,110788,110789,110790,110791,110792,110793,110794,110795,110796,110797,110798,110799,110800,110801,110802,110803,110804,110805,110806,110807,110808,110809,110810,110811,110812,110813,110814,110815,110816,110817,110818,110819,110820,110821,110822,110823,110824,110825,110826,110827,110828,110829,110830,110831,110832,110833,110834,110835,110836,110837,110838,110839,110840,110841,110842,110843,110844,110845,110846,110847,110848,110849,110850,110851,110852,110853,110854,110855,110856,110857,110858,110859,110860,110861,110862,110863,110864,110865,110866,110867,110868,110869,110870,110871,110872,110873,110874,110875,110876,110877,110878,110879,110880,110881,110882,110898,110928,110929,110930,110933,110948,110949,110950,110951,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,113664,113665,113666,113667,113668,113669,113670,113671,113672,113673,113674,113675,113676,113677,113678,113679,113680,113681,113682,113683,113684,113685,113686,113687,113688,113689,113690,113691,113692,113693,113694,113695,113696,113697,113698,113699,113700,113701,113702,113703,113704,113705,113706,113707,113708,113709,113710,113711,113712,113713,113714,113715,113716,113717,113718,113719,113720,113721,113722,113723,113724,113725,113726,113727,113728,113729,113730,113731,113732,113733,113734,113735,113736,113737,113738,113739,113740,113741,113742,113743,113744,113745,113746,113747,113748,113749,113750,113751,113752,113753,113754,113755,113756,113757,113758,113759,113760,113761,113762,113763,113764,113765,113766,113767,113768,113769,113770,113776,113777,113778,113779,113780,113781,113782,113783,113784,113785,113786,113787,113788,113792,113793,113794,113795,113796,113797,113798,113799,113800,113808,113809,113810,113811,113812,113813,113814,113815,113816,113817,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122634,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123136,123137,123138,123139,123140,123141,123142,123143,123144,123145,123146,123147,123148,123149,123150,123151,123152,123153,123154,123155,123156,123157,123158,123159,123160,123161,123162,123163,123164,123165,123166,123167,123168,123169,123170,123171,123172,123173,123174,123175,123176,123177,123178,123179,123180,123191,123192,123193,123194,123195,123196,123197,123214,123536,123537,123538,123539,123540,123541,123542,123543,123544,123545,123546,123547,123548,123549,123550,123551,123552,123553,123554,123555,123556,123557,123558,123559,123560,123561,123562,123563,123564,123565,123584,123585,123586,123587,123588,123589,123590,123591,123592,123593,123594,123595,123596,123597,123598,123599,123600,123601,123602,123603,123604,123605,123606,123607,123608,123609,123610,123611,123612,123613,123614,123615,123616,123617,123618,123619,123620,123621,123622,123623,123624,123625,123626,123627,124112,124113,124114,124115,124116,124117,124118,124119,124120,124121,124122,124123,124124,124125,124126,124127,124128,124129,124130,124131,124132,124133,124134,124135,124136,124137,124138,124139,124896,124897,124898,124899,124900,124901,124902,124904,124905,124906,124907,124909,124910,124912,124913,124914,124915,124916,124917,124918,124919,124920,124921,124922,124923,124924,124925,124926,124928,124929,124930,124931,124932,124933,124934,124935,124936,124937,124938,124939,124940,124941,124942,124943,124944,124945,124946,124947,124948,124949,124950,124951,124952,124953,124954,124955,124956,124957,124958,124959,124960,124961,124962,124963,124964,124965,124966,124967,124968,124969,124970,124971,124972,124973,124974,124975,124976,124977,124978,124979,124980,124981,124982,124983,124984,124985,124986,124987,124988,124989,124990,124991,124992,124993,124994,124995,124996,124997,124998,124999,125000,125001,125002,125003,125004,125005,125006,125007,125008,125009,125010,125011,125012,125013,125014,125015,125016,125017,125018,125019,125020,125021,125022,125023,125024,125025,125026,125027,125028,125029,125030,125031,125032,125033,125034,125035,125036,125037,125038,125039,125040,125041,125042,125043,125044,125045,125046,125047,125048,125049,125050,125051,125052,125053,125054,125055,125056,125057,125058,125059,125060,125061,125062,125063,125064,125065,125066,125067,125068,125069,125070,125071,125072,125073,125074,125075,125076,125077,125078,125079,125080,125081,125082,125083,125084,125085,125086,125087,125088,125089,125090,125091,125092,125093,125094,125095,125096,125097,125098,125099,125100,125101,125102,125103,125104,125105,125106,125107,125108,125109,125110,125111,125112,125113,125114,125115,125116,125117,125118,125119,125120,125121,125122,125123,125124,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,125259,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743],"XID_Continue":[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,170,181,183,186,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,886,887,891,892,893,895,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1155,1156,1157,1158,1159,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1791,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2037,2042,2045,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2185,2186,2187,2188,2189,2190,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2492,2493,2494,2495,2496,2497,2498,2499,2500,2503,2504,2507,2508,2509,2510,2519,2524,2525,2527,2528,2529,2530,2531,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2556,2558,2561,2562,2563,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2620,2622,2623,2624,2625,2626,2631,2632,2635,2636,2637,2641,2649,2650,2651,2652,2654,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2689,2690,2691,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2759,2760,2761,2763,2764,2765,2768,2784,2785,2786,2787,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2809,2810,2811,2812,2813,2814,2815,2817,2818,2819,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2876,2877,2878,2879,2880,2881,2882,2883,2884,2887,2888,2891,2892,2893,2901,2902,2903,2908,2909,2911,2912,2913,2914,2915,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2929,2946,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3006,3007,3008,3009,3010,3014,3015,3016,3018,3019,3020,3021,3024,3031,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3132,3133,3134,3135,3136,3137,3138,3139,3140,3142,3143,3144,3146,3147,3148,3149,3157,3158,3160,3161,3162,3165,3168,3169,3170,3171,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3200,3201,3202,3203,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3260,3261,3262,3263,3264,3265,3266,3267,3268,3270,3271,3272,3274,3275,3276,3277,3285,3286,3293,3294,3296,3297,3298,3299,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3313,3314,3315,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3398,3399,3400,3402,3403,3404,3405,3406,3412,3413,3414,3415,3423,3424,3425,3426,3427,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3450,3451,3452,3453,3454,3455,3457,3458,3459,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3530,3535,3536,3537,3538,3539,3540,3542,3544,3545,3546,3547,3548,3549,3550,3551,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3570,3571,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3776,3777,3778,3779,3780,3782,3784,3785,3786,3787,3788,3789,3790,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3804,3805,3806,3807,3840,3864,3865,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3893,3895,3897,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,3970,3971,3972,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4957,4958,4959,4969,4970,4971,4972,4973,4974,4975,4976,4977,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908,5909,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6002,6003,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6103,6108,6109,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6155,6156,6157,6159,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6618,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6823,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984,6985,6986,6987,6988,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7042,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154,7155,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8126,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8204,8205,8255,8256,8276,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8417,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8450,8455,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8469,8472,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8508,8509,8510,8511,8517,8518,8519,8520,8521,8526,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11499,11500,11501,11502,11503,11504,11505,11506,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11647,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12293,12294,12295,12321,12322,12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334,12335,12337,12338,12339,12340,12341,12344,12345,12346,12347,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12441,12442,12445,12446,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42607,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42654,42655,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42736,42737,42775,42776,42777,42778,42779,42780,42781,42782,42783,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43010,43011,43012,43013,43014,43015,43016,43017,43018,43019,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43043,43044,43045,43046,43047,43052,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43136,43137,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43204,43205,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43250,43251,43252,43253,43254,43255,43259,43261,43262,43263,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43302,43303,43304,43305,43306,43307,43308,43309,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43346,43347,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43392,43393,43394,43395,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43443,43444,43445,43446,43447,43448,43449,43450,43451,43452,43453,43454,43455,43456,43471,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43488,43489,43490,43491,43492,43493,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43561,43562,43563,43564,43565,43566,43567,43568,43569,43570,43571,43572,43573,43574,43584,43585,43586,43587,43588,43589,43590,43591,43592,43593,43594,43595,43596,43597,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43642,43643,43644,43645,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43696,43697,43698,43699,43700,43701,43702,43703,43704,43705,43706,43707,43708,43709,43710,43711,43712,43713,43714,43739,43740,43741,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43755,43756,43757,43758,43759,43762,43763,43764,43765,43766,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44003,44004,44005,44006,44007,44008,44009,44010,44012,44013,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64286,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65075,65076,65101,65102,65103,65137,65139,65143,65145,65147,65149,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65343,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65381,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65438,65439,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,66045,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66272,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66369,66370,66371,66372,66373,66374,66375,66376,66377,66378,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66422,66423,66424,66425,66426,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66513,66514,66515,66516,66517,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66720,66721,66722,66723,66724,66725,66726,66727,66728,66729,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68097,68098,68099,68101,68102,68108,68109,68110,68111,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68148,68149,68152,68153,68154,68159,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68224,68225,68226,68227,68228,68229,68230,68231,68232,68233,68234,68235,68236,68237,68238,68239,68240,68241,68242,68243,68244,68245,68246,68247,68248,68249,68250,68251,68252,68288,68289,68290,68291,68292,68293,68294,68295,68297,68298,68299,68300,68301,68302,68303,68304,68305,68306,68307,68308,68309,68310,68311,68312,68313,68314,68315,68316,68317,68318,68319,68320,68321,68322,68323,68324,68325,68326,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68480,68481,68482,68483,68484,68485,68486,68487,68488,68489,68490,68491,68492,68493,68494,68495,68496,68497,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,68864,68865,68866,68867,68868,68869,68870,68871,68872,68873,68874,68875,68876,68877,68878,68879,68880,68881,68882,68883,68884,68885,68886,68887,68888,68889,68890,68891,68892,68893,68894,68895,68896,68897,68898,68899,68900,68901,68902,68903,68912,68913,68914,68915,68916,68917,68918,68919,68920,68921,69248,69249,69250,69251,69252,69253,69254,69255,69256,69257,69258,69259,69260,69261,69262,69263,69264,69265,69266,69267,69268,69269,69270,69271,69272,69273,69274,69275,69276,69277,69278,69279,69280,69281,69282,69283,69284,69285,69286,69287,69288,69289,69291,69292,69296,69297,69373,69374,69375,69376,69377,69378,69379,69380,69381,69382,69383,69384,69385,69386,69387,69388,69389,69390,69391,69392,69393,69394,69395,69396,69397,69398,69399,69400,69401,69402,69403,69404,69415,69424,69425,69426,69427,69428,69429,69430,69431,69432,69433,69434,69435,69436,69437,69438,69439,69440,69441,69442,69443,69444,69445,69446,69447,69448,69449,69450,69451,69452,69453,69454,69455,69456,69488,69489,69490,69491,69492,69493,69494,69495,69496,69497,69498,69499,69500,69501,69502,69503,69504,69505,69506,69507,69508,69509,69552,69553,69554,69555,69556,69557,69558,69559,69560,69561,69562,69563,69564,69565,69566,69567,69568,69569,69570,69571,69572,69600,69601,69602,69603,69604,69605,69606,69607,69608,69609,69610,69611,69612,69613,69614,69615,69616,69617,69618,69619,69620,69621,69622,69632,69633,69634,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69688,69689,69690,69691,69692,69693,69694,69695,69696,69697,69698,69699,69700,69701,69702,69734,69735,69736,69737,69738,69739,69740,69741,69742,69743,69744,69745,69746,69747,69748,69749,69759,69760,69761,69762,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69808,69809,69810,69811,69812,69813,69814,69815,69816,69817,69818,69826,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69872,69873,69874,69875,69876,69877,69878,69879,69880,69881,69888,69889,69890,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,69927,69928,69929,69930,69931,69932,69933,69934,69935,69936,69937,69938,69939,69940,69942,69943,69944,69945,69946,69947,69948,69949,69950,69951,69956,69957,69958,69959,69968,69969,69970,69971,69972,69973,69974,69975,69976,69977,69978,69979,69980,69981,69982,69983,69984,69985,69986,69987,69988,69989,69990,69991,69992,69993,69994,69995,69996,69997,69998,69999,70000,70001,70002,70003,70006,70016,70017,70018,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70067,70068,70069,70070,70071,70072,70073,70074,70075,70076,70077,70078,70079,70080,70081,70082,70083,70084,70089,70090,70091,70092,70094,70095,70096,70097,70098,70099,70100,70101,70102,70103,70104,70105,70106,70108,70144,70145,70146,70147,70148,70149,70150,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70182,70183,70184,70185,70186,70187,70188,70189,70190,70191,70192,70193,70194,70195,70196,70197,70198,70199,70206,70207,70208,70209,70272,70273,70274,70275,70276,70277,70278,70280,70282,70283,70284,70285,70287,70288,70289,70290,70291,70292,70293,70294,70295,70296,70297,70298,70299,70300,70301,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70367,70368,70369,70370,70371,70372,70373,70374,70375,70376,70377,70378,70384,70385,70386,70387,70388,70389,70390,70391,70392,70393,70400,70401,70402,70403,70405,70406,70407,70408,70409,70410,70411,70412,70415,70416,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70442,70443,70444,70445,70446,70447,70448,70450,70451,70453,70454,70455,70456,70457,70459,70460,70461,70462,70463,70464,70465,70466,70467,70468,70471,70472,70475,70476,70477,70480,70487,70493,70494,70495,70496,70497,70498,70499,70502,70503,70504,70505,70506,70507,70508,70512,70513,70514,70515,70516,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700,70701,70702,70703,70704,70705,70706,70707,70708,70709,70710,70711,70712,70713,70714,70715,70716,70717,70718,70719,70720,70721,70722,70723,70724,70725,70726,70727,70728,70729,70730,70736,70737,70738,70739,70740,70741,70742,70743,70744,70745,70750,70751,70752,70753,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70832,70833,70834,70835,70836,70837,70838,70839,70840,70841,70842,70843,70844,70845,70846,70847,70848,70849,70850,70851,70852,70853,70855,70864,70865,70866,70867,70868,70869,70870,70871,70872,70873,71040,71041,71042,71043,71044,71045,71046,71047,71048,71049,71050,71051,71052,71053,71054,71055,71056,71057,71058,71059,71060,71061,71062,71063,71064,71065,71066,71067,71068,71069,71070,71071,71072,71073,71074,71075,71076,71077,71078,71079,71080,71081,71082,71083,71084,71085,71086,71087,71088,71089,71090,71091,71092,71093,71096,71097,71098,71099,71100,71101,71102,71103,71104,71128,71129,71130,71131,71132,71133,71168,71169,71170,71171,71172,71173,71174,71175,71176,71177,71178,71179,71180,71181,71182,71183,71184,71185,71186,71187,71188,71189,71190,71191,71192,71193,71194,71195,71196,71197,71198,71199,71200,71201,71202,71203,71204,71205,71206,71207,71208,71209,71210,71211,71212,71213,71214,71215,71216,71217,71218,71219,71220,71221,71222,71223,71224,71225,71226,71227,71228,71229,71230,71231,71232,71236,71248,71249,71250,71251,71252,71253,71254,71255,71256,71257,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,71339,71340,71341,71342,71343,71344,71345,71346,71347,71348,71349,71350,71351,71352,71360,71361,71362,71363,71364,71365,71366,71367,71368,71369,71424,71425,71426,71427,71428,71429,71430,71431,71432,71433,71434,71435,71436,71437,71438,71439,71440,71441,71442,71443,71444,71445,71446,71447,71448,71449,71450,71453,71454,71455,71456,71457,71458,71459,71460,71461,71462,71463,71464,71465,71466,71467,71472,71473,71474,71475,71476,71477,71478,71479,71480,71481,71488,71489,71490,71491,71492,71493,71494,71680,71681,71682,71683,71684,71685,71686,71687,71688,71689,71690,71691,71692,71693,71694,71695,71696,71697,71698,71699,71700,71701,71702,71703,71704,71705,71706,71707,71708,71709,71710,71711,71712,71713,71714,71715,71716,71717,71718,71719,71720,71721,71722,71723,71724,71725,71726,71727,71728,71729,71730,71731,71732,71733,71734,71735,71736,71737,71738,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,71904,71905,71906,71907,71908,71909,71910,71911,71912,71913,71935,71936,71937,71938,71939,71940,71941,71942,71945,71948,71949,71950,71951,71952,71953,71954,71955,71957,71958,71960,71961,71962,71963,71964,71965,71966,71967,71968,71969,71970,71971,71972,71973,71974,71975,71976,71977,71978,71979,71980,71981,71982,71983,71984,71985,71986,71987,71988,71989,71991,71992,71995,71996,71997,71998,71999,72000,72001,72002,72003,72016,72017,72018,72019,72020,72021,72022,72023,72024,72025,72096,72097,72098,72099,72100,72101,72102,72103,72106,72107,72108,72109,72110,72111,72112,72113,72114,72115,72116,72117,72118,72119,72120,72121,72122,72123,72124,72125,72126,72127,72128,72129,72130,72131,72132,72133,72134,72135,72136,72137,72138,72139,72140,72141,72142,72143,72144,72145,72146,72147,72148,72149,72150,72151,72154,72155,72156,72157,72158,72159,72160,72161,72163,72164,72192,72193,72194,72195,72196,72197,72198,72199,72200,72201,72202,72203,72204,72205,72206,72207,72208,72209,72210,72211,72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222,72223,72224,72225,72226,72227,72228,72229,72230,72231,72232,72233,72234,72235,72236,72237,72238,72239,72240,72241,72242,72243,72244,72245,72246,72247,72248,72249,72250,72251,72252,72253,72254,72263,72272,72273,72274,72275,72276,72277,72278,72279,72280,72281,72282,72283,72284,72285,72286,72287,72288,72289,72290,72291,72292,72293,72294,72295,72296,72297,72298,72299,72300,72301,72302,72303,72304,72305,72306,72307,72308,72309,72310,72311,72312,72313,72314,72315,72316,72317,72318,72319,72320,72321,72322,72323,72324,72325,72326,72327,72328,72329,72330,72331,72332,72333,72334,72335,72336,72337,72338,72339,72340,72341,72342,72343,72344,72345,72349,72368,72369,72370,72371,72372,72373,72374,72375,72376,72377,72378,72379,72380,72381,72382,72383,72384,72385,72386,72387,72388,72389,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72404,72405,72406,72407,72408,72409,72410,72411,72412,72413,72414,72415,72416,72417,72418,72419,72420,72421,72422,72423,72424,72425,72426,72427,72428,72429,72430,72431,72432,72433,72434,72435,72436,72437,72438,72439,72440,72704,72705,72706,72707,72708,72709,72710,72711,72712,72714,72715,72716,72717,72718,72719,72720,72721,72722,72723,72724,72725,72726,72727,72728,72729,72730,72731,72732,72733,72734,72735,72736,72737,72738,72739,72740,72741,72742,72743,72744,72745,72746,72747,72748,72749,72750,72751,72752,72753,72754,72755,72756,72757,72758,72760,72761,72762,72763,72764,72765,72766,72767,72768,72784,72785,72786,72787,72788,72789,72790,72791,72792,72793,72818,72819,72820,72821,72822,72823,72824,72825,72826,72827,72828,72829,72830,72831,72832,72833,72834,72835,72836,72837,72838,72839,72840,72841,72842,72843,72844,72845,72846,72847,72850,72851,72852,72853,72854,72855,72856,72857,72858,72859,72860,72861,72862,72863,72864,72865,72866,72867,72868,72869,72870,72871,72873,72874,72875,72876,72877,72878,72879,72880,72881,72882,72883,72884,72885,72886,72960,72961,72962,72963,72964,72965,72966,72968,72969,72971,72972,72973,72974,72975,72976,72977,72978,72979,72980,72981,72982,72983,72984,72985,72986,72987,72988,72989,72990,72991,72992,72993,72994,72995,72996,72997,72998,72999,73000,73001,73002,73003,73004,73005,73006,73007,73008,73009,73010,73011,73012,73013,73014,73018,73020,73021,73023,73024,73025,73026,73027,73028,73029,73030,73031,73040,73041,73042,73043,73044,73045,73046,73047,73048,73049,73056,73057,73058,73059,73060,73061,73063,73064,73066,73067,73068,73069,73070,73071,73072,73073,73074,73075,73076,73077,73078,73079,73080,73081,73082,73083,73084,73085,73086,73087,73088,73089,73090,73091,73092,73093,73094,73095,73096,73097,73098,73099,73100,73101,73102,73104,73105,73107,73108,73109,73110,73111,73112,73120,73121,73122,73123,73124,73125,73126,73127,73128,73129,73440,73441,73442,73443,73444,73445,73446,73447,73448,73449,73450,73451,73452,73453,73454,73455,73456,73457,73458,73459,73460,73461,73462,73472,73473,73474,73475,73476,73477,73478,73479,73480,73481,73482,73483,73484,73485,73486,73487,73488,73490,73491,73492,73493,73494,73495,73496,73497,73498,73499,73500,73501,73502,73503,73504,73505,73506,73507,73508,73509,73510,73511,73512,73513,73514,73515,73516,73517,73518,73519,73520,73521,73522,73523,73524,73525,73526,73527,73528,73529,73530,73534,73535,73536,73537,73538,73552,73553,73554,73555,73556,73557,73558,73559,73560,73561,73648,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,74607,74608,74609,74610,74611,74612,74613,74614,74615,74616,74617,74618,74619,74620,74621,74622,74623,74624,74625,74626,74627,74628,74629,74630,74631,74632,74633,74634,74635,74636,74637,74638,74639,74640,74641,74642,74643,74644,74645,74646,74647,74648,74649,74752,74753,74754,74755,74756,74757,74758,74759,74760,74761,74762,74763,74764,74765,74766,74767,74768,74769,74770,74771,74772,74773,74774,74775,74776,74777,74778,74779,74780,74781,74782,74783,74784,74785,74786,74787,74788,74789,74790,74791,74792,74793,74794,74795,74796,74797,74798,74799,74800,74801,74802,74803,74804,74805,74806,74807,74808,74809,74810,74811,74812,74813,74814,74815,74816,74817,74818,74819,74820,74821,74822,74823,74824,74825,74826,74827,74828,74829,74830,74831,74832,74833,74834,74835,74836,74837,74838,74839,74840,74841,74842,74843,74844,74845,74846,74847,74848,74849,74850,74851,74852,74853,74854,74855,74856,74857,74858,74859,74860,74861,74862,74880,74881,74882,74883,74884,74885,74886,74887,74888,74889,74890,74891,74892,74893,74894,74895,74896,74897,74898,74899,74900,74901,74902,74903,74904,74905,74906,74907,74908,74909,74910,74911,74912,74913,74914,74915,74916,74917,74918,74919,74920,74921,74922,74923,74924,74925,74926,74927,74928,74929,74930,74931,74932,74933,74934,74935,74936,74937,74938,74939,74940,74941,74942,74943,74944,74945,74946,74947,74948,74949,74950,74951,74952,74953,74954,74955,74956,74957,74958,74959,74960,74961,74962,74963,74964,74965,74966,74967,74968,74969,74970,74971,74972,74973,74974,74975,74976,74977,74978,74979,74980,74981,74982,74983,74984,74985,74986,74987,74988,74989,74990,74991,74992,74993,74994,74995,74996,74997,74998,74999,75000,75001,75002,75003,75004,75005,75006,75007,75008,75009,75010,75011,75012,75013,75014,75015,75016,75017,75018,75019,75020,75021,75022,75023,75024,75025,75026,75027,75028,75029,75030,75031,75032,75033,75034,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75049,75050,75051,75052,75053,75054,75055,75056,75057,75058,75059,75060,75061,75062,75063,75064,75065,75066,75067,75068,75069,75070,75071,75072,75073,75074,75075,77712,77713,77714,77715,77716,77717,77718,77719,77720,77721,77722,77723,77724,77725,77726,77727,77728,77729,77730,77731,77732,77733,77734,77735,77736,77737,77738,77739,77740,77741,77742,77743,77744,77745,77746,77747,77748,77749,77750,77751,77752,77753,77754,77755,77756,77757,77758,77759,77760,77761,77762,77763,77764,77765,77766,77767,77768,77769,77770,77771,77772,77773,77774,77775,77776,77777,77778,77779,77780,77781,77782,77783,77784,77785,77786,77787,77788,77789,77790,77791,77792,77793,77794,77795,77796,77797,77798,77799,77800,77801,77802,77803,77804,77805,77806,77807,77808,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,78895,78912,78913,78914,78915,78916,78917,78918,78919,78920,78921,78922,78923,78924,78925,78926,78927,78928,78929,78930,78931,78932,78933,82944,82945,82946,82947,82948,82949,82950,82951,82952,82953,82954,82955,82956,82957,82958,82959,82960,82961,82962,82963,82964,82965,82966,82967,82968,82969,82970,82971,82972,82973,82974,82975,82976,82977,82978,82979,82980,82981,82982,82983,82984,82985,82986,82987,82988,82989,82990,82991,82992,82993,82994,82995,82996,82997,82998,82999,83000,83001,83002,83003,83004,83005,83006,83007,83008,83009,83010,83011,83012,83013,83014,83015,83016,83017,83018,83019,83020,83021,83022,83023,83024,83025,83026,83027,83028,83029,83030,83031,83032,83033,83034,83035,83036,83037,83038,83039,83040,83041,83042,83043,83044,83045,83046,83047,83048,83049,83050,83051,83052,83053,83054,83055,83056,83057,83058,83059,83060,83061,83062,83063,83064,83065,83066,83067,83068,83069,83070,83071,83072,83073,83074,83075,83076,83077,83078,83079,83080,83081,83082,83083,83084,83085,83086,83087,83088,83089,83090,83091,83092,83093,83094,83095,83096,83097,83098,83099,83100,83101,83102,83103,83104,83105,83106,83107,83108,83109,83110,83111,83112,83113,83114,83115,83116,83117,83118,83119,83120,83121,83122,83123,83124,83125,83126,83127,83128,83129,83130,83131,83132,83133,83134,83135,83136,83137,83138,83139,83140,83141,83142,83143,83144,83145,83146,83147,83148,83149,83150,83151,83152,83153,83154,83155,83156,83157,83158,83159,83160,83161,83162,83163,83164,83165,83166,83167,83168,83169,83170,83171,83172,83173,83174,83175,83176,83177,83178,83179,83180,83181,83182,83183,83184,83185,83186,83187,83188,83189,83190,83191,83192,83193,83194,83195,83196,83197,83198,83199,83200,83201,83202,83203,83204,83205,83206,83207,83208,83209,83210,83211,83212,83213,83214,83215,83216,83217,83218,83219,83220,83221,83222,83223,83224,83225,83226,83227,83228,83229,83230,83231,83232,83233,83234,83235,83236,83237,83238,83239,83240,83241,83242,83243,83244,83245,83246,83247,83248,83249,83250,83251,83252,83253,83254,83255,83256,83257,83258,83259,83260,83261,83262,83263,83264,83265,83266,83267,83268,83269,83270,83271,83272,83273,83274,83275,83276,83277,83278,83279,83280,83281,83282,83283,83284,83285,83286,83287,83288,83289,83290,83291,83292,83293,83294,83295,83296,83297,83298,83299,83300,83301,83302,83303,83304,83305,83306,83307,83308,83309,83310,83311,83312,83313,83314,83315,83316,83317,83318,83319,83320,83321,83322,83323,83324,83325,83326,83327,83328,83329,83330,83331,83332,83333,83334,83335,83336,83337,83338,83339,83340,83341,83342,83343,83344,83345,83346,83347,83348,83349,83350,83351,83352,83353,83354,83355,83356,83357,83358,83359,83360,83361,83362,83363,83364,83365,83366,83367,83368,83369,83370,83371,83372,83373,83374,83375,83376,83377,83378,83379,83380,83381,83382,83383,83384,83385,83386,83387,83388,83389,83390,83391,83392,83393,83394,83395,83396,83397,83398,83399,83400,83401,83402,83403,83404,83405,83406,83407,83408,83409,83410,83411,83412,83413,83414,83415,83416,83417,83418,83419,83420,83421,83422,83423,83424,83425,83426,83427,83428,83429,83430,83431,83432,83433,83434,83435,83436,83437,83438,83439,83440,83441,83442,83443,83444,83445,83446,83447,83448,83449,83450,83451,83452,83453,83454,83455,83456,83457,83458,83459,83460,83461,83462,83463,83464,83465,83466,83467,83468,83469,83470,83471,83472,83473,83474,83475,83476,83477,83478,83479,83480,83481,83482,83483,83484,83485,83486,83487,83488,83489,83490,83491,83492,83493,83494,83495,83496,83497,83498,83499,83500,83501,83502,83503,83504,83505,83506,83507,83508,83509,83510,83511,83512,83513,83514,83515,83516,83517,83518,83519,83520,83521,83522,83523,83524,83525,83526,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,92736,92737,92738,92739,92740,92741,92742,92743,92744,92745,92746,92747,92748,92749,92750,92751,92752,92753,92754,92755,92756,92757,92758,92759,92760,92761,92762,92763,92764,92765,92766,92768,92769,92770,92771,92772,92773,92774,92775,92776,92777,92784,92785,92786,92787,92788,92789,92790,92791,92792,92793,92794,92795,92796,92797,92798,92799,92800,92801,92802,92803,92804,92805,92806,92807,92808,92809,92810,92811,92812,92813,92814,92815,92816,92817,92818,92819,92820,92821,92822,92823,92824,92825,92826,92827,92828,92829,92830,92831,92832,92833,92834,92835,92836,92837,92838,92839,92840,92841,92842,92843,92844,92845,92846,92847,92848,92849,92850,92851,92852,92853,92854,92855,92856,92857,92858,92859,92860,92861,92862,92864,92865,92866,92867,92868,92869,92870,92871,92872,92873,92880,92881,92882,92883,92884,92885,92886,92887,92888,92889,92890,92891,92892,92893,92894,92895,92896,92897,92898,92899,92900,92901,92902,92903,92904,92905,92906,92907,92908,92909,92912,92913,92914,92915,92916,92928,92929,92930,92931,92932,92933,92934,92935,92936,92937,92938,92939,92940,92941,92942,92943,92944,92945,92946,92947,92948,92949,92950,92951,92952,92953,92954,92955,92956,92957,92958,92959,92960,92961,92962,92963,92964,92965,92966,92967,92968,92969,92970,92971,92972,92973,92974,92975,92976,92977,92978,92979,92980,92981,92982,92992,92993,92994,92995,93008,93009,93010,93011,93012,93013,93014,93015,93016,93017,93027,93028,93029,93030,93031,93032,93033,93034,93035,93036,93037,93038,93039,93040,93041,93042,93043,93044,93045,93046,93047,93053,93054,93055,93056,93057,93058,93059,93060,93061,93062,93063,93064,93065,93066,93067,93068,93069,93070,93071,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94021,94022,94023,94024,94025,94026,94031,94032,94033,94034,94035,94036,94037,94038,94039,94040,94041,94042,94043,94044,94045,94046,94047,94048,94049,94050,94051,94052,94053,94054,94055,94056,94057,94058,94059,94060,94061,94062,94063,94064,94065,94066,94067,94068,94069,94070,94071,94072,94073,94074,94075,94076,94077,94078,94079,94080,94081,94082,94083,94084,94085,94086,94087,94095,94096,94097,94098,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94179,94180,94192,94193,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,110592,110593,110594,110595,110596,110597,110598,110599,110600,110601,110602,110603,110604,110605,110606,110607,110608,110609,110610,110611,110612,110613,110614,110615,110616,110617,110618,110619,110620,110621,110622,110623,110624,110625,110626,110627,110628,110629,110630,110631,110632,110633,110634,110635,110636,110637,110638,110639,110640,110641,110642,110643,110644,110645,110646,110647,110648,110649,110650,110651,110652,110653,110654,110655,110656,110657,110658,110659,110660,110661,110662,110663,110664,110665,110666,110667,110668,110669,110670,110671,110672,110673,110674,110675,110676,110677,110678,110679,110680,110681,110682,110683,110684,110685,110686,110687,110688,110689,110690,110691,110692,110693,110694,110695,110696,110697,110698,110699,110700,110701,110702,110703,110704,110705,110706,110707,110708,110709,110710,110711,110712,110713,110714,110715,110716,110717,110718,110719,110720,110721,110722,110723,110724,110725,110726,110727,110728,110729,110730,110731,110732,110733,110734,110735,110736,110737,110738,110739,110740,110741,110742,110743,110744,110745,110746,110747,110748,110749,110750,110751,110752,110753,110754,110755,110756,110757,110758,110759,110760,110761,110762,110763,110764,110765,110766,110767,110768,110769,110770,110771,110772,110773,110774,110775,110776,110777,110778,110779,110780,110781,110782,110783,110784,110785,110786,110787,110788,110789,110790,110791,110792,110793,110794,110795,110796,110797,110798,110799,110800,110801,110802,110803,110804,110805,110806,110807,110808,110809,110810,110811,110812,110813,110814,110815,110816,110817,110818,110819,110820,110821,110822,110823,110824,110825,110826,110827,110828,110829,110830,110831,110832,110833,110834,110835,110836,110837,110838,110839,110840,110841,110842,110843,110844,110845,110846,110847,110848,110849,110850,110851,110852,110853,110854,110855,110856,110857,110858,110859,110860,110861,110862,110863,110864,110865,110866,110867,110868,110869,110870,110871,110872,110873,110874,110875,110876,110877,110878,110879,110880,110881,110882,110898,110928,110929,110930,110933,110948,110949,110950,110951,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,113664,113665,113666,113667,113668,113669,113670,113671,113672,113673,113674,113675,113676,113677,113678,113679,113680,113681,113682,113683,113684,113685,113686,113687,113688,113689,113690,113691,113692,113693,113694,113695,113696,113697,113698,113699,113700,113701,113702,113703,113704,113705,113706,113707,113708,113709,113710,113711,113712,113713,113714,113715,113716,113717,113718,113719,113720,113721,113722,113723,113724,113725,113726,113727,113728,113729,113730,113731,113732,113733,113734,113735,113736,113737,113738,113739,113740,113741,113742,113743,113744,113745,113746,113747,113748,113749,113750,113751,113752,113753,113754,113755,113756,113757,113758,113759,113760,113761,113762,113763,113764,113765,113766,113767,113768,113769,113770,113776,113777,113778,113779,113780,113781,113782,113783,113784,113785,113786,113787,113788,113792,113793,113794,113795,113796,113797,113798,113799,113800,113808,113809,113810,113811,113812,113813,113814,113815,113816,113817,113821,113822,118528,118529,118530,118531,118532,118533,118534,118535,118536,118537,118538,118539,118540,118541,118542,118543,118544,118545,118546,118547,118548,118549,118550,118551,118552,118553,118554,118555,118556,118557,118558,118559,118560,118561,118562,118563,118564,118565,118566,118567,118568,118569,118570,118571,118572,118573,118576,118577,118578,118579,118580,118581,118582,118583,118584,118585,118586,118587,118588,118589,118590,118591,118592,118593,118594,118595,118596,118597,118598,119141,119142,119143,119144,119145,119149,119150,119151,119152,119153,119154,119163,119164,119165,119166,119167,119168,119169,119170,119173,119174,119175,119176,119177,119178,119179,119210,119211,119212,119213,119362,119363,119364,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120778,120779,120782,120783,120784,120785,120786,120787,120788,120789,120790,120791,120792,120793,120794,120795,120796,120797,120798,120799,120800,120801,120802,120803,120804,120805,120806,120807,120808,120809,120810,120811,120812,120813,120814,120815,120816,120817,120818,120819,120820,120821,120822,120823,120824,120825,120826,120827,120828,120829,120830,120831,121344,121345,121346,121347,121348,121349,121350,121351,121352,121353,121354,121355,121356,121357,121358,121359,121360,121361,121362,121363,121364,121365,121366,121367,121368,121369,121370,121371,121372,121373,121374,121375,121376,121377,121378,121379,121380,121381,121382,121383,121384,121385,121386,121387,121388,121389,121390,121391,121392,121393,121394,121395,121396,121397,121398,121403,121404,121405,121406,121407,121408,121409,121410,121411,121412,121413,121414,121415,121416,121417,121418,121419,121420,121421,121422,121423,121424,121425,121426,121427,121428,121429,121430,121431,121432,121433,121434,121435,121436,121437,121438,121439,121440,121441,121442,121443,121444,121445,121446,121447,121448,121449,121450,121451,121452,121461,121476,121499,121500,121501,121502,121503,121505,121506,121507,121508,121509,121510,121511,121512,121513,121514,121515,121516,121517,121518,121519,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122634,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122880,122881,122882,122883,122884,122885,122886,122888,122889,122890,122891,122892,122893,122894,122895,122896,122897,122898,122899,122900,122901,122902,122903,122904,122907,122908,122909,122910,122911,122912,122913,122915,122916,122918,122919,122920,122921,122922,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123023,123136,123137,123138,123139,123140,123141,123142,123143,123144,123145,123146,123147,123148,123149,123150,123151,123152,123153,123154,123155,123156,123157,123158,123159,123160,123161,123162,123163,123164,123165,123166,123167,123168,123169,123170,123171,123172,123173,123174,123175,123176,123177,123178,123179,123180,123184,123185,123186,123187,123188,123189,123190,123191,123192,123193,123194,123195,123196,123197,123200,123201,123202,123203,123204,123205,123206,123207,123208,123209,123214,123536,123537,123538,123539,123540,123541,123542,123543,123544,123545,123546,123547,123548,123549,123550,123551,123552,123553,123554,123555,123556,123557,123558,123559,123560,123561,123562,123563,123564,123565,123566,123584,123585,123586,123587,123588,123589,123590,123591,123592,123593,123594,123595,123596,123597,123598,123599,123600,123601,123602,123603,123604,123605,123606,123607,123608,123609,123610,123611,123612,123613,123614,123615,123616,123617,123618,123619,123620,123621,123622,123623,123624,123625,123626,123627,123628,123629,123630,123631,123632,123633,123634,123635,123636,123637,123638,123639,123640,123641,124112,124113,124114,124115,124116,124117,124118,124119,124120,124121,124122,124123,124124,124125,124126,124127,124128,124129,124130,124131,124132,124133,124134,124135,124136,124137,124138,124139,124140,124141,124142,124143,124144,124145,124146,124147,124148,124149,124150,124151,124152,124153,124896,124897,124898,124899,124900,124901,124902,124904,124905,124906,124907,124909,124910,124912,124913,124914,124915,124916,124917,124918,124919,124920,124921,124922,124923,124924,124925,124926,124928,124929,124930,124931,124932,124933,124934,124935,124936,124937,124938,124939,124940,124941,124942,124943,124944,124945,124946,124947,124948,124949,124950,124951,124952,124953,124954,124955,124956,124957,124958,124959,124960,124961,124962,124963,124964,124965,124966,124967,124968,124969,124970,124971,124972,124973,124974,124975,124976,124977,124978,124979,124980,124981,124982,124983,124984,124985,124986,124987,124988,124989,124990,124991,124992,124993,124994,124995,124996,124997,124998,124999,125000,125001,125002,125003,125004,125005,125006,125007,125008,125009,125010,125011,125012,125013,125014,125015,125016,125017,125018,125019,125020,125021,125022,125023,125024,125025,125026,125027,125028,125029,125030,125031,125032,125033,125034,125035,125036,125037,125038,125039,125040,125041,125042,125043,125044,125045,125046,125047,125048,125049,125050,125051,125052,125053,125054,125055,125056,125057,125058,125059,125060,125061,125062,125063,125064,125065,125066,125067,125068,125069,125070,125071,125072,125073,125074,125075,125076,125077,125078,125079,125080,125081,125082,125083,125084,125085,125086,125087,125088,125089,125090,125091,125092,125093,125094,125095,125096,125097,125098,125099,125100,125101,125102,125103,125104,125105,125106,125107,125108,125109,125110,125111,125112,125113,125114,125115,125116,125117,125118,125119,125120,125121,125122,125123,125124,125136,125137,125138,125139,125140,125141,125142,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,125252,125253,125254,125255,125256,125257,125258,125259,125264,125265,125266,125267,125268,125269,125270,125271,125272,125273,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,130032,130033,130034,130035,130036,130037,130038,130039,130040,130041,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173783,173784,173785,173786,173787,173788,173789,173790,173791,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177973,177974,177975,177976,177977,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,178208,178209,178210,178211,178212,178213,178214,178215,178216,178217,178218,178219,178220,178221,178222,178223,178224,178225,178226,178227,178228,178229,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178242,178243,178244,178245,178246,178247,178248,178249,178250,178251,178252,178253,178254,178255,178256,178257,178258,178259,178260,178261,178262,178263,178264,178265,178266,178267,178268,178269,178270,178271,178272,178273,178274,178275,178276,178277,178278,178279,178280,178281,178282,178283,178284,178285,178286,178287,178288,178289,178290,178291,178292,178293,178294,178295,178296,178297,178298,178299,178300,178301,178302,178303,178304,178305,178306,178307,178308,178309,178310,178311,178312,178313,178314,178315,178316,178317,178318,178319,178320,178321,178322,178323,178324,178325,178326,178327,178328,178329,178330,178331,178332,178333,178334,178335,178336,178337,178338,178339,178340,178341,178342,178343,178344,178345,178346,178347,178348,178349,178350,178351,178352,178353,178354,178355,178356,178357,178358,178359,178360,178361,178362,178363,178364,178365,178366,178367,178368,178369,178370,178371,178372,178373,178374,178375,178376,178377,178378,178379,178380,178381,178382,178383,178384,178385,178386,178387,178388,178389,178390,178391,178392,178393,178394,178395,178396,178397,178398,178399,178400,178401,178402,178403,178404,178405,178406,178407,178408,178409,178410,178411,178412,178413,178414,178415,178416,178417,178418,178419,178420,178421,178422,178423,178424,178425,178426,178427,178428,178429,178430,178431,178432,178433,178434,178435,178436,178437,178438,178439,178440,178441,178442,178443,178444,178445,178446,178447,178448,178449,178450,178451,178452,178453,178454,178455,178456,178457,178458,178459,178460,178461,178462,178463,178464,178465,178466,178467,178468,178469,178470,178471,178472,178473,178474,178475,178476,178477,178478,178479,178480,178481,178482,178483,178484,178485,178486,178487,178488,178489,178490,178491,178492,178493,178494,178495,178496,178497,178498,178499,178500,178501,178502,178503,178504,178505,178506,178507,178508,178509,178510,178511,178512,178513,178514,178515,178516,178517,178518,178519,178520,178521,178522,178523,178524,178525,178526,178527,178528,178529,178530,178531,178532,178533,178534,178535,178536,178537,178538,178539,178540,178541,178542,178543,178544,178545,178546,178547,178548,178549,178550,178551,178552,178553,178554,178555,178556,178557,178558,178559,178560,178561,178562,178563,178564,178565,178566,178567,178568,178569,178570,178571,178572,178573,178574,178575,178576,178577,178578,178579,178580,178581,178582,178583,178584,178585,178586,178587,178588,178589,178590,178591,178592,178593,178594,178595,178596,178597,178598,178599,178600,178601,178602,178603,178604,178605,178606,178607,178608,178609,178610,178611,178612,178613,178614,178615,178616,178617,178618,178619,178620,178621,178622,178623,178624,178625,178626,178627,178628,178629,178630,178631,178632,178633,178634,178635,178636,178637,178638,178639,178640,178641,178642,178643,178644,178645,178646,178647,178648,178649,178650,178651,178652,178653,178654,178655,178656,178657,178658,178659,178660,178661,178662,178663,178664,178665,178666,178667,178668,178669,178670,178671,178672,178673,178674,178675,178676,178677,178678,178679,178680,178681,178682,178683,178684,178685,178686,178687,178688,178689,178690,178691,178692,178693,178694,178695,178696,178697,178698,178699,178700,178701,178702,178703,178704,178705,178706,178707,178708,178709,178710,178711,178712,178713,178714,178715,178716,178717,178718,178719,178720,178721,178722,178723,178724,178725,178726,178727,178728,178729,178730,178731,178732,178733,178734,178735,178736,178737,178738,178739,178740,178741,178742,178743,178744,178745,178746,178747,178748,178749,178750,178751,178752,178753,178754,178755,178756,178757,178758,178759,178760,178761,178762,178763,178764,178765,178766,178767,178768,178769,178770,178771,178772,178773,178774,178775,178776,178777,178778,178779,178780,178781,178782,178783,178784,178785,178786,178787,178788,178789,178790,178791,178792,178793,178794,178795,178796,178797,178798,178799,178800,178801,178802,178803,178804,178805,178806,178807,178808,178809,178810,178811,178812,178813,178814,178815,178816,178817,178818,178819,178820,178821,178822,178823,178824,178825,178826,178827,178828,178829,178830,178831,178832,178833,178834,178835,178836,178837,178838,178839,178840,178841,178842,178843,178844,178845,178846,178847,178848,178849,178850,178851,178852,178853,178854,178855,178856,178857,178858,178859,178860,178861,178862,178863,178864,178865,178866,178867,178868,178869,178870,178871,178872,178873,178874,178875,178876,178877,178878,178879,178880,178881,178882,178883,178884,178885,178886,178887,178888,178889,178890,178891,178892,178893,178894,178895,178896,178897,178898,178899,178900,178901,178902,178903,178904,178905,178906,178907,178908,178909,178910,178911,178912,178913,178914,178915,178916,178917,178918,178919,178920,178921,178922,178923,178924,178925,178926,178927,178928,178929,178930,178931,178932,178933,178934,178935,178936,178937,178938,178939,178940,178941,178942,178943,178944,178945,178946,178947,178948,178949,178950,178951,178952,178953,178954,178955,178956,178957,178958,178959,178960,178961,178962,178963,178964,178965,178966,178967,178968,178969,178970,178971,178972,178973,178974,178975,178976,178977,178978,178979,178980,178981,178982,178983,178984,178985,178986,178987,178988,178989,178990,178991,178992,178993,178994,178995,178996,178997,178998,178999,179000,179001,179002,179003,179004,179005,179006,179007,179008,179009,179010,179011,179012,179013,179014,179015,179016,179017,179018,179019,179020,179021,179022,179023,179024,179025,179026,179027,179028,179029,179030,179031,179032,179033,179034,179035,179036,179037,179038,179039,179040,179041,179042,179043,179044,179045,179046,179047,179048,179049,179050,179051,179052,179053,179054,179055,179056,179057,179058,179059,179060,179061,179062,179063,179064,179065,179066,179067,179068,179069,179070,179071,179072,179073,179074,179075,179076,179077,179078,179079,179080,179081,179082,179083,179084,179085,179086,179087,179088,179089,179090,179091,179092,179093,179094,179095,179096,179097,179098,179099,179100,179101,179102,179103,179104,179105,179106,179107,179108,179109,179110,179111,179112,179113,179114,179115,179116,179117,179118,179119,179120,179121,179122,179123,179124,179125,179126,179127,179128,179129,179130,179131,179132,179133,179134,179135,179136,179137,179138,179139,179140,179141,179142,179143,179144,179145,179146,179147,179148,179149,179150,179151,179152,179153,179154,179155,179156,179157,179158,179159,179160,179161,179162,179163,179164,179165,179166,179167,179168,179169,179170,179171,179172,179173,179174,179175,179176,179177,179178,179179,179180,179181,179182,179183,179184,179185,179186,179187,179188,179189,179190,179191,179192,179193,179194,179195,179196,179197,179198,179199,179200,179201,179202,179203,179204,179205,179206,179207,179208,179209,179210,179211,179212,179213,179214,179215,179216,179217,179218,179219,179220,179221,179222,179223,179224,179225,179226,179227,179228,179229,179230,179231,179232,179233,179234,179235,179236,179237,179238,179239,179240,179241,179242,179243,179244,179245,179246,179247,179248,179249,179250,179251,179252,179253,179254,179255,179256,179257,179258,179259,179260,179261,179262,179263,179264,179265,179266,179267,179268,179269,179270,179271,179272,179273,179274,179275,179276,179277,179278,179279,179280,179281,179282,179283,179284,179285,179286,179287,179288,179289,179290,179291,179292,179293,179294,179295,179296,179297,179298,179299,179300,179301,179302,179303,179304,179305,179306,179307,179308,179309,179310,179311,179312,179313,179314,179315,179316,179317,179318,179319,179320,179321,179322,179323,179324,179325,179326,179327,179328,179329,179330,179331,179332,179333,179334,179335,179336,179337,179338,179339,179340,179341,179342,179343,179344,179345,179346,179347,179348,179349,179350,179351,179352,179353,179354,179355,179356,179357,179358,179359,179360,179361,179362,179363,179364,179365,179366,179367,179368,179369,179370,179371,179372,179373,179374,179375,179376,179377,179378,179379,179380,179381,179382,179383,179384,179385,179386,179387,179388,179389,179390,179391,179392,179393,179394,179395,179396,179397,179398,179399,179400,179401,179402,179403,179404,179405,179406,179407,179408,179409,179410,179411,179412,179413,179414,179415,179416,179417,179418,179419,179420,179421,179422,179423,179424,179425,179426,179427,179428,179429,179430,179431,179432,179433,179434,179435,179436,179437,179438,179439,179440,179441,179442,179443,179444,179445,179446,179447,179448,179449,179450,179451,179452,179453,179454,179455,179456,179457,179458,179459,179460,179461,179462,179463,179464,179465,179466,179467,179468,179469,179470,179471,179472,179473,179474,179475,179476,179477,179478,179479,179480,179481,179482,179483,179484,179485,179486,179487,179488,179489,179490,179491,179492,179493,179494,179495,179496,179497,179498,179499,179500,179501,179502,179503,179504,179505,179506,179507,179508,179509,179510,179511,179512,179513,179514,179515,179516,179517,179518,179519,179520,179521,179522,179523,179524,179525,179526,179527,179528,179529,179530,179531,179532,179533,179534,179535,179536,179537,179538,179539,179540,179541,179542,179543,179544,179545,179546,179547,179548,179549,179550,179551,179552,179553,179554,179555,179556,179557,179558,179559,179560,179561,179562,179563,179564,179565,179566,179567,179568,179569,179570,179571,179572,179573,179574,179575,179576,179577,179578,179579,179580,179581,179582,179583,179584,179585,179586,179587,179588,179589,179590,179591,179592,179593,179594,179595,179596,179597,179598,179599,179600,179601,179602,179603,179604,179605,179606,179607,179608,179609,179610,179611,179612,179613,179614,179615,179616,179617,179618,179619,179620,179621,179622,179623,179624,179625,179626,179627,179628,179629,179630,179631,179632,179633,179634,179635,179636,179637,179638,179639,179640,179641,179642,179643,179644,179645,179646,179647,179648,179649,179650,179651,179652,179653,179654,179655,179656,179657,179658,179659,179660,179661,179662,179663,179664,179665,179666,179667,179668,179669,179670,179671,179672,179673,179674,179675,179676,179677,179678,179679,179680,179681,179682,179683,179684,179685,179686,179687,179688,179689,179690,179691,179692,179693,179694,179695,179696,179697,179698,179699,179700,179701,179702,179703,179704,179705,179706,179707,179708,179709,179710,179711,179712,179713,179714,179715,179716,179717,179718,179719,179720,179721,179722,179723,179724,179725,179726,179727,179728,179729,179730,179731,179732,179733,179734,179735,179736,179737,179738,179739,179740,179741,179742,179743,179744,179745,179746,179747,179748,179749,179750,179751,179752,179753,179754,179755,179756,179757,179758,179759,179760,179761,179762,179763,179764,179765,179766,179767,179768,179769,179770,179771,179772,179773,179774,179775,179776,179777,179778,179779,179780,179781,179782,179783,179784,179785,179786,179787,179788,179789,179790,179791,179792,179793,179794,179795,179796,179797,179798,179799,179800,179801,179802,179803,179804,179805,179806,179807,179808,179809,179810,179811,179812,179813,179814,179815,179816,179817,179818,179819,179820,179821,179822,179823,179824,179825,179826,179827,179828,179829,179830,179831,179832,179833,179834,179835,179836,179837,179838,179839,179840,179841,179842,179843,179844,179845,179846,179847,179848,179849,179850,179851,179852,179853,179854,179855,179856,179857,179858,179859,179860,179861,179862,179863,179864,179865,179866,179867,179868,179869,179870,179871,179872,179873,179874,179875,179876,179877,179878,179879,179880,179881,179882,179883,179884,179885,179886,179887,179888,179889,179890,179891,179892,179893,179894,179895,179896,179897,179898,179899,179900,179901,179902,179903,179904,179905,179906,179907,179908,179909,179910,179911,179912,179913,179914,179915,179916,179917,179918,179919,179920,179921,179922,179923,179924,179925,179926,179927,179928,179929,179930,179931,179932,179933,179934,179935,179936,179937,179938,179939,179940,179941,179942,179943,179944,179945,179946,179947,179948,179949,179950,179951,179952,179953,179954,179955,179956,179957,179958,179959,179960,179961,179962,179963,179964,179965,179966,179967,179968,179969,179970,179971,179972,179973,179974,179975,179976,179977,179978,179979,179980,179981,179982,179983,179984,179985,179986,179987,179988,179989,179990,179991,179992,179993,179994,179995,179996,179997,179998,179999,180000,180001,180002,180003,180004,180005,180006,180007,180008,180009,180010,180011,180012,180013,180014,180015,180016,180017,180018,180019,180020,180021,180022,180023,180024,180025,180026,180027,180028,180029,180030,180031,180032,180033,180034,180035,180036,180037,180038,180039,180040,180041,180042,180043,180044,180045,180046,180047,180048,180049,180050,180051,180052,180053,180054,180055,180056,180057,180058,180059,180060,180061,180062,180063,180064,180065,180066,180067,180068,180069,180070,180071,180072,180073,180074,180075,180076,180077,180078,180079,180080,180081,180082,180083,180084,180085,180086,180087,180088,180089,180090,180091,180092,180093,180094,180095,180096,180097,180098,180099,180100,180101,180102,180103,180104,180105,180106,180107,180108,180109,180110,180111,180112,180113,180114,180115,180116,180117,180118,180119,180120,180121,180122,180123,180124,180125,180126,180127,180128,180129,180130,180131,180132,180133,180134,180135,180136,180137,180138,180139,180140,180141,180142,180143,180144,180145,180146,180147,180148,180149,180150,180151,180152,180153,180154,180155,180156,180157,180158,180159,180160,180161,180162,180163,180164,180165,180166,180167,180168,180169,180170,180171,180172,180173,180174,180175,180176,180177,180178,180179,180180,180181,180182,180183,180184,180185,180186,180187,180188,180189,180190,180191,180192,180193,180194,180195,180196,180197,180198,180199,180200,180201,180202,180203,180204,180205,180206,180207,180208,180209,180210,180211,180212,180213,180214,180215,180216,180217,180218,180219,180220,180221,180222,180223,180224,180225,180226,180227,180228,180229,180230,180231,180232,180233,180234,180235,180236,180237,180238,180239,180240,180241,180242,180243,180244,180245,180246,180247,180248,180249,180250,180251,180252,180253,180254,180255,180256,180257,180258,180259,180260,180261,180262,180263,180264,180265,180266,180267,180268,180269,180270,180271,180272,180273,180274,180275,180276,180277,180278,180279,180280,180281,180282,180283,180284,180285,180286,180287,180288,180289,180290,180291,180292,180293,180294,180295,180296,180297,180298,180299,180300,180301,180302,180303,180304,180305,180306,180307,180308,180309,180310,180311,180312,180313,180314,180315,180316,180317,180318,180319,180320,180321,180322,180323,180324,180325,180326,180327,180328,180329,180330,180331,180332,180333,180334,180335,180336,180337,180338,180339,180340,180341,180342,180343,180344,180345,180346,180347,180348,180349,180350,180351,180352,180353,180354,180355,180356,180357,180358,180359,180360,180361,180362,180363,180364,180365,180366,180367,180368,180369,180370,180371,180372,180373,180374,180375,180376,180377,180378,180379,180380,180381,180382,180383,180384,180385,180386,180387,180388,180389,180390,180391,180392,180393,180394,180395,180396,180397,180398,180399,180400,180401,180402,180403,180404,180405,180406,180407,180408,180409,180410,180411,180412,180413,180414,180415,180416,180417,180418,180419,180420,180421,180422,180423,180424,180425,180426,180427,180428,180429,180430,180431,180432,180433,180434,180435,180436,180437,180438,180439,180440,180441,180442,180443,180444,180445,180446,180447,180448,180449,180450,180451,180452,180453,180454,180455,180456,180457,180458,180459,180460,180461,180462,180463,180464,180465,180466,180467,180468,180469,180470,180471,180472,180473,180474,180475,180476,180477,180478,180479,180480,180481,180482,180483,180484,180485,180486,180487,180488,180489,180490,180491,180492,180493,180494,180495,180496,180497,180498,180499,180500,180501,180502,180503,180504,180505,180506,180507,180508,180509,180510,180511,180512,180513,180514,180515,180516,180517,180518,180519,180520,180521,180522,180523,180524,180525,180526,180527,180528,180529,180530,180531,180532,180533,180534,180535,180536,180537,180538,180539,180540,180541,180542,180543,180544,180545,180546,180547,180548,180549,180550,180551,180552,180553,180554,180555,180556,180557,180558,180559,180560,180561,180562,180563,180564,180565,180566,180567,180568,180569,180570,180571,180572,180573,180574,180575,180576,180577,180578,180579,180580,180581,180582,180583,180584,180585,180586,180587,180588,180589,180590,180591,180592,180593,180594,180595,180596,180597,180598,180599,180600,180601,180602,180603,180604,180605,180606,180607,180608,180609,180610,180611,180612,180613,180614,180615,180616,180617,180618,180619,180620,180621,180622,180623,180624,180625,180626,180627,180628,180629,180630,180631,180632,180633,180634,180635,180636,180637,180638,180639,180640,180641,180642,180643,180644,180645,180646,180647,180648,180649,180650,180651,180652,180653,180654,180655,180656,180657,180658,180659,180660,180661,180662,180663,180664,180665,180666,180667,180668,180669,180670,180671,180672,180673,180674,180675,180676,180677,180678,180679,180680,180681,180682,180683,180684,180685,180686,180687,180688,180689,180690,180691,180692,180693,180694,180695,180696,180697,180698,180699,180700,180701,180702,180703,180704,180705,180706,180707,180708,180709,180710,180711,180712,180713,180714,180715,180716,180717,180718,180719,180720,180721,180722,180723,180724,180725,180726,180727,180728,180729,180730,180731,180732,180733,180734,180735,180736,180737,180738,180739,180740,180741,180742,180743,180744,180745,180746,180747,180748,180749,180750,180751,180752,180753,180754,180755,180756,180757,180758,180759,180760,180761,180762,180763,180764,180765,180766,180767,180768,180769,180770,180771,180772,180773,180774,180775,180776,180777,180778,180779,180780,180781,180782,180783,180784,180785,180786,180787,180788,180789,180790,180791,180792,180793,180794,180795,180796,180797,180798,180799,180800,180801,180802,180803,180804,180805,180806,180807,180808,180809,180810,180811,180812,180813,180814,180815,180816,180817,180818,180819,180820,180821,180822,180823,180824,180825,180826,180827,180828,180829,180830,180831,180832,180833,180834,180835,180836,180837,180838,180839,180840,180841,180842,180843,180844,180845,180846,180847,180848,180849,180850,180851,180852,180853,180854,180855,180856,180857,180858,180859,180860,180861,180862,180863,180864,180865,180866,180867,180868,180869,180870,180871,180872,180873,180874,180875,180876,180877,180878,180879,180880,180881,180882,180883,180884,180885,180886,180887,180888,180889,180890,180891,180892,180893,180894,180895,180896,180897,180898,180899,180900,180901,180902,180903,180904,180905,180906,180907,180908,180909,180910,180911,180912,180913,180914,180915,180916,180917,180918,180919,180920,180921,180922,180923,180924,180925,180926,180927,180928,180929,180930,180931,180932,180933,180934,180935,180936,180937,180938,180939,180940,180941,180942,180943,180944,180945,180946,180947,180948,180949,180950,180951,180952,180953,180954,180955,180956,180957,180958,180959,180960,180961,180962,180963,180964,180965,180966,180967,180968,180969,180970,180971,180972,180973,180974,180975,180976,180977,180978,180979,180980,180981,180982,180983,180984,180985,180986,180987,180988,180989,180990,180991,180992,180993,180994,180995,180996,180997,180998,180999,181000,181001,181002,181003,181004,181005,181006,181007,181008,181009,181010,181011,181012,181013,181014,181015,181016,181017,181018,181019,181020,181021,181022,181023,181024,181025,181026,181027,181028,181029,181030,181031,181032,181033,181034,181035,181036,181037,181038,181039,181040,181041,181042,181043,181044,181045,181046,181047,181048,181049,181050,181051,181052,181053,181054,181055,181056,181057,181058,181059,181060,181061,181062,181063,181064,181065,181066,181067,181068,181069,181070,181071,181072,181073,181074,181075,181076,181077,181078,181079,181080,181081,181082,181083,181084,181085,181086,181087,181088,181089,181090,181091,181092,181093,181094,181095,181096,181097,181098,181099,181100,181101,181102,181103,181104,181105,181106,181107,181108,181109,181110,181111,181112,181113,181114,181115,181116,181117,181118,181119,181120,181121,181122,181123,181124,181125,181126,181127,181128,181129,181130,181131,181132,181133,181134,181135,181136,181137,181138,181139,181140,181141,181142,181143,181144,181145,181146,181147,181148,181149,181150,181151,181152,181153,181154,181155,181156,181157,181158,181159,181160,181161,181162,181163,181164,181165,181166,181167,181168,181169,181170,181171,181172,181173,181174,181175,181176,181177,181178,181179,181180,181181,181182,181183,181184,181185,181186,181187,181188,181189,181190,181191,181192,181193,181194,181195,181196,181197,181198,181199,181200,181201,181202,181203,181204,181205,181206,181207,181208,181209,181210,181211,181212,181213,181214,181215,181216,181217,181218,181219,181220,181221,181222,181223,181224,181225,181226,181227,181228,181229,181230,181231,181232,181233,181234,181235,181236,181237,181238,181239,181240,181241,181242,181243,181244,181245,181246,181247,181248,181249,181250,181251,181252,181253,181254,181255,181256,181257,181258,181259,181260,181261,181262,181263,181264,181265,181266,181267,181268,181269,181270,181271,181272,181273,181274,181275,181276,181277,181278,181279,181280,181281,181282,181283,181284,181285,181286,181287,181288,181289,181290,181291,181292,181293,181294,181295,181296,181297,181298,181299,181300,181301,181302,181303,181304,181305,181306,181307,181308,181309,181310,181311,181312,181313,181314,181315,181316,181317,181318,181319,181320,181321,181322,181323,181324,181325,181326,181327,181328,181329,181330,181331,181332,181333,181334,181335,181336,181337,181338,181339,181340,181341,181342,181343,181344,181345,181346,181347,181348,181349,181350,181351,181352,181353,181354,181355,181356,181357,181358,181359,181360,181361,181362,181363,181364,181365,181366,181367,181368,181369,181370,181371,181372,181373,181374,181375,181376,181377,181378,181379,181380,181381,181382,181383,181384,181385,181386,181387,181388,181389,181390,181391,181392,181393,181394,181395,181396,181397,181398,181399,181400,181401,181402,181403,181404,181405,181406,181407,181408,181409,181410,181411,181412,181413,181414,181415,181416,181417,181418,181419,181420,181421,181422,181423,181424,181425,181426,181427,181428,181429,181430,181431,181432,181433,181434,181435,181436,181437,181438,181439,181440,181441,181442,181443,181444,181445,181446,181447,181448,181449,181450,181451,181452,181453,181454,181455,181456,181457,181458,181459,181460,181461,181462,181463,181464,181465,181466,181467,181468,181469,181470,181471,181472,181473,181474,181475,181476,181477,181478,181479,181480,181481,181482,181483,181484,181485,181486,181487,181488,181489,181490,181491,181492,181493,181494,181495,181496,181497,181498,181499,181500,181501,181502,181503,181504,181505,181506,181507,181508,181509,181510,181511,181512,181513,181514,181515,181516,181517,181518,181519,181520,181521,181522,181523,181524,181525,181526,181527,181528,181529,181530,181531,181532,181533,181534,181535,181536,181537,181538,181539,181540,181541,181542,181543,181544,181545,181546,181547,181548,181549,181550,181551,181552,181553,181554,181555,181556,181557,181558,181559,181560,181561,181562,181563,181564,181565,181566,181567,181568,181569,181570,181571,181572,181573,181574,181575,181576,181577,181578,181579,181580,181581,181582,181583,181584,181585,181586,181587,181588,181589,181590,181591,181592,181593,181594,181595,181596,181597,181598,181599,181600,181601,181602,181603,181604,181605,181606,181607,181608,181609,181610,181611,181612,181613,181614,181615,181616,181617,181618,181619,181620,181621,181622,181623,181624,181625,181626,181627,181628,181629,181630,181631,181632,181633,181634,181635,181636,181637,181638,181639,181640,181641,181642,181643,181644,181645,181646,181647,181648,181649,181650,181651,181652,181653,181654,181655,181656,181657,181658,181659,181660,181661,181662,181663,181664,181665,181666,181667,181668,181669,181670,181671,181672,181673,181674,181675,181676,181677,181678,181679,181680,181681,181682,181683,181684,181685,181686,181687,181688,181689,181690,181691,181692,181693,181694,181695,181696,181697,181698,181699,181700,181701,181702,181703,181704,181705,181706,181707,181708,181709,181710,181711,181712,181713,181714,181715,181716,181717,181718,181719,181720,181721,181722,181723,181724,181725,181726,181727,181728,181729,181730,181731,181732,181733,181734,181735,181736,181737,181738,181739,181740,181741,181742,181743,181744,181745,181746,181747,181748,181749,181750,181751,181752,181753,181754,181755,181756,181757,181758,181759,181760,181761,181762,181763,181764,181765,181766,181767,181768,181769,181770,181771,181772,181773,181774,181775,181776,181777,181778,181779,181780,181781,181782,181783,181784,181785,181786,181787,181788,181789,181790,181791,181792,181793,181794,181795,181796,181797,181798,181799,181800,181801,181802,181803,181804,181805,181806,181807,181808,181809,181810,181811,181812,181813,181814,181815,181816,181817,181818,181819,181820,181821,181822,181823,181824,181825,181826,181827,181828,181829,181830,181831,181832,181833,181834,181835,181836,181837,181838,181839,181840,181841,181842,181843,181844,181845,181846,181847,181848,181849,181850,181851,181852,181853,181854,181855,181856,181857,181858,181859,181860,181861,181862,181863,181864,181865,181866,181867,181868,181869,181870,181871,181872,181873,181874,181875,181876,181877,181878,181879,181880,181881,181882,181883,181884,181885,181886,181887,181888,181889,181890,181891,181892,181893,181894,181895,181896,181897,181898,181899,181900,181901,181902,181903,181904,181905,181906,181907,181908,181909,181910,181911,181912,181913,181914,181915,181916,181917,181918,181919,181920,181921,181922,181923,181924,181925,181926,181927,181928,181929,181930,181931,181932,181933,181934,181935,181936,181937,181938,181939,181940,181941,181942,181943,181944,181945,181946,181947,181948,181949,181950,181951,181952,181953,181954,181955,181956,181957,181958,181959,181960,181961,181962,181963,181964,181965,181966,181967,181968,181969,181970,181971,181972,181973,181974,181975,181976,181977,181978,181979,181980,181981,181982,181983,181984,181985,181986,181987,181988,181989,181990,181991,181992,181993,181994,181995,181996,181997,181998,181999,182000,182001,182002,182003,182004,182005,182006,182007,182008,182009,182010,182011,182012,182013,182014,182015,182016,182017,182018,182019,182020,182021,182022,182023,182024,182025,182026,182027,182028,182029,182030,182031,182032,182033,182034,182035,182036,182037,182038,182039,182040,182041,182042,182043,182044,182045,182046,182047,182048,182049,182050,182051,182052,182053,182054,182055,182056,182057,182058,182059,182060,182061,182062,182063,182064,182065,182066,182067,182068,182069,182070,182071,182072,182073,182074,182075,182076,182077,182078,182079,182080,182081,182082,182083,182084,182085,182086,182087,182088,182089,182090,182091,182092,182093,182094,182095,182096,182097,182098,182099,182100,182101,182102,182103,182104,182105,182106,182107,182108,182109,182110,182111,182112,182113,182114,182115,182116,182117,182118,182119,182120,182121,182122,182123,182124,182125,182126,182127,182128,182129,182130,182131,182132,182133,182134,182135,182136,182137,182138,182139,182140,182141,182142,182143,182144,182145,182146,182147,182148,182149,182150,182151,182152,182153,182154,182155,182156,182157,182158,182159,182160,182161,182162,182163,182164,182165,182166,182167,182168,182169,182170,182171,182172,182173,182174,182175,182176,182177,182178,182179,182180,182181,182182,182183,182184,182185,182186,182187,182188,182189,182190,182191,182192,182193,182194,182195,182196,182197,182198,182199,182200,182201,182202,182203,182204,182205,182206,182207,182208,182209,182210,182211,182212,182213,182214,182215,182216,182217,182218,182219,182220,182221,182222,182223,182224,182225,182226,182227,182228,182229,182230,182231,182232,182233,182234,182235,182236,182237,182238,182239,182240,182241,182242,182243,182244,182245,182246,182247,182248,182249,182250,182251,182252,182253,182254,182255,182256,182257,182258,182259,182260,182261,182262,182263,182264,182265,182266,182267,182268,182269,182270,182271,182272,182273,182274,182275,182276,182277,182278,182279,182280,182281,182282,182283,182284,182285,182286,182287,182288,182289,182290,182291,182292,182293,182294,182295,182296,182297,182298,182299,182300,182301,182302,182303,182304,182305,182306,182307,182308,182309,182310,182311,182312,182313,182314,182315,182316,182317,182318,182319,182320,182321,182322,182323,182324,182325,182326,182327,182328,182329,182330,182331,182332,182333,182334,182335,182336,182337,182338,182339,182340,182341,182342,182343,182344,182345,182346,182347,182348,182349,182350,182351,182352,182353,182354,182355,182356,182357,182358,182359,182360,182361,182362,182363,182364,182365,182366,182367,182368,182369,182370,182371,182372,182373,182374,182375,182376,182377,182378,182379,182380,182381,182382,182383,182384,182385,182386,182387,182388,182389,182390,182391,182392,182393,182394,182395,182396,182397,182398,182399,182400,182401,182402,182403,182404,182405,182406,182407,182408,182409,182410,182411,182412,182413,182414,182415,182416,182417,182418,182419,182420,182421,182422,182423,182424,182425,182426,182427,182428,182429,182430,182431,182432,182433,182434,182435,182436,182437,182438,182439,182440,182441,182442,182443,182444,182445,182446,182447,182448,182449,182450,182451,182452,182453,182454,182455,182456,182457,182458,182459,182460,182461,182462,182463,182464,182465,182466,182467,182468,182469,182470,182471,182472,182473,182474,182475,182476,182477,182478,182479,182480,182481,182482,182483,182484,182485,182486,182487,182488,182489,182490,182491,182492,182493,182494,182495,182496,182497,182498,182499,182500,182501,182502,182503,182504,182505,182506,182507,182508,182509,182510,182511,182512,182513,182514,182515,182516,182517,182518,182519,182520,182521,182522,182523,182524,182525,182526,182527,182528,182529,182530,182531,182532,182533,182534,182535,182536,182537,182538,182539,182540,182541,182542,182543,182544,182545,182546,182547,182548,182549,182550,182551,182552,182553,182554,182555,182556,182557,182558,182559,182560,182561,182562,182563,182564,182565,182566,182567,182568,182569,182570,182571,182572,182573,182574,182575,182576,182577,182578,182579,182580,182581,182582,182583,182584,182585,182586,182587,182588,182589,182590,182591,182592,182593,182594,182595,182596,182597,182598,182599,182600,182601,182602,182603,182604,182605,182606,182607,182608,182609,182610,182611,182612,182613,182614,182615,182616,182617,182618,182619,182620,182621,182622,182623,182624,182625,182626,182627,182628,182629,182630,182631,182632,182633,182634,182635,182636,182637,182638,182639,182640,182641,182642,182643,182644,182645,182646,182647,182648,182649,182650,182651,182652,182653,182654,182655,182656,182657,182658,182659,182660,182661,182662,182663,182664,182665,182666,182667,182668,182669,182670,182671,182672,182673,182674,182675,182676,182677,182678,182679,182680,182681,182682,182683,182684,182685,182686,182687,182688,182689,182690,182691,182692,182693,182694,182695,182696,182697,182698,182699,182700,182701,182702,182703,182704,182705,182706,182707,182708,182709,182710,182711,182712,182713,182714,182715,182716,182717,182718,182719,182720,182721,182722,182723,182724,182725,182726,182727,182728,182729,182730,182731,182732,182733,182734,182735,182736,182737,182738,182739,182740,182741,182742,182743,182744,182745,182746,182747,182748,182749,182750,182751,182752,182753,182754,182755,182756,182757,182758,182759,182760,182761,182762,182763,182764,182765,182766,182767,182768,182769,182770,182771,182772,182773,182774,182775,182776,182777,182778,182779,182780,182781,182782,182783,182784,182785,182786,182787,182788,182789,182790,182791,182792,182793,182794,182795,182796,182797,182798,182799,182800,182801,182802,182803,182804,182805,182806,182807,182808,182809,182810,182811,182812,182813,182814,182815,182816,182817,182818,182819,182820,182821,182822,182823,182824,182825,182826,182827,182828,182829,182830,182831,182832,182833,182834,182835,182836,182837,182838,182839,182840,182841,182842,182843,182844,182845,182846,182847,182848,182849,182850,182851,182852,182853,182854,182855,182856,182857,182858,182859,182860,182861,182862,182863,182864,182865,182866,182867,182868,182869,182870,182871,182872,182873,182874,182875,182876,182877,182878,182879,182880,182881,182882,182883,182884,182885,182886,182887,182888,182889,182890,182891,182892,182893,182894,182895,182896,182897,182898,182899,182900,182901,182902,182903,182904,182905,182906,182907,182908,182909,182910,182911,182912,182913,182914,182915,182916,182917,182918,182919,182920,182921,182922,182923,182924,182925,182926,182927,182928,182929,182930,182931,182932,182933,182934,182935,182936,182937,182938,182939,182940,182941,182942,182943,182944,182945,182946,182947,182948,182949,182950,182951,182952,182953,182954,182955,182956,182957,182958,182959,182960,182961,182962,182963,182964,182965,182966,182967,182968,182969,182970,182971,182972,182973,182974,182975,182976,182977,182978,182979,182980,182981,182982,182983,182984,182985,182986,182987,182988,182989,182990,182991,182992,182993,182994,182995,182996,182997,182998,182999,183000,183001,183002,183003,183004,183005,183006,183007,183008,183009,183010,183011,183012,183013,183014,183015,183016,183017,183018,183019,183020,183021,183022,183023,183024,183025,183026,183027,183028,183029,183030,183031,183032,183033,183034,183035,183036,183037,183038,183039,183040,183041,183042,183043,183044,183045,183046,183047,183048,183049,183050,183051,183052,183053,183054,183055,183056,183057,183058,183059,183060,183061,183062,183063,183064,183065,183066,183067,183068,183069,183070,183071,183072,183073,183074,183075,183076,183077,183078,183079,183080,183081,183082,183083,183084,183085,183086,183087,183088,183089,183090,183091,183092,183093,183094,183095,183096,183097,183098,183099,183100,183101,183102,183103,183104,183105,183106,183107,183108,183109,183110,183111,183112,183113,183114,183115,183116,183117,183118,183119,183120,183121,183122,183123,183124,183125,183126,183127,183128,183129,183130,183131,183132,183133,183134,183135,183136,183137,183138,183139,183140,183141,183142,183143,183144,183145,183146,183147,183148,183149,183150,183151,183152,183153,183154,183155,183156,183157,183158,183159,183160,183161,183162,183163,183164,183165,183166,183167,183168,183169,183170,183171,183172,183173,183174,183175,183176,183177,183178,183179,183180,183181,183182,183183,183184,183185,183186,183187,183188,183189,183190,183191,183192,183193,183194,183195,183196,183197,183198,183199,183200,183201,183202,183203,183204,183205,183206,183207,183208,183209,183210,183211,183212,183213,183214,183215,183216,183217,183218,183219,183220,183221,183222,183223,183224,183225,183226,183227,183228,183229,183230,183231,183232,183233,183234,183235,183236,183237,183238,183239,183240,183241,183242,183243,183244,183245,183246,183247,183248,183249,183250,183251,183252,183253,183254,183255,183256,183257,183258,183259,183260,183261,183262,183263,183264,183265,183266,183267,183268,183269,183270,183271,183272,183273,183274,183275,183276,183277,183278,183279,183280,183281,183282,183283,183284,183285,183286,183287,183288,183289,183290,183291,183292,183293,183294,183295,183296,183297,183298,183299,183300,183301,183302,183303,183304,183305,183306,183307,183308,183309,183310,183311,183312,183313,183314,183315,183316,183317,183318,183319,183320,183321,183322,183323,183324,183325,183326,183327,183328,183329,183330,183331,183332,183333,183334,183335,183336,183337,183338,183339,183340,183341,183342,183343,183344,183345,183346,183347,183348,183349,183350,183351,183352,183353,183354,183355,183356,183357,183358,183359,183360,183361,183362,183363,183364,183365,183366,183367,183368,183369,183370,183371,183372,183373,183374,183375,183376,183377,183378,183379,183380,183381,183382,183383,183384,183385,183386,183387,183388,183389,183390,183391,183392,183393,183394,183395,183396,183397,183398,183399,183400,183401,183402,183403,183404,183405,183406,183407,183408,183409,183410,183411,183412,183413,183414,183415,183416,183417,183418,183419,183420,183421,183422,183423,183424,183425,183426,183427,183428,183429,183430,183431,183432,183433,183434,183435,183436,183437,183438,183439,183440,183441,183442,183443,183444,183445,183446,183447,183448,183449,183450,183451,183452,183453,183454,183455,183456,183457,183458,183459,183460,183461,183462,183463,183464,183465,183466,183467,183468,183469,183470,183471,183472,183473,183474,183475,183476,183477,183478,183479,183480,183481,183482,183483,183484,183485,183486,183487,183488,183489,183490,183491,183492,183493,183494,183495,183496,183497,183498,183499,183500,183501,183502,183503,183504,183505,183506,183507,183508,183509,183510,183511,183512,183513,183514,183515,183516,183517,183518,183519,183520,183521,183522,183523,183524,183525,183526,183527,183528,183529,183530,183531,183532,183533,183534,183535,183536,183537,183538,183539,183540,183541,183542,183543,183544,183545,183546,183547,183548,183549,183550,183551,183552,183553,183554,183555,183556,183557,183558,183559,183560,183561,183562,183563,183564,183565,183566,183567,183568,183569,183570,183571,183572,183573,183574,183575,183576,183577,183578,183579,183580,183581,183582,183583,183584,183585,183586,183587,183588,183589,183590,183591,183592,183593,183594,183595,183596,183597,183598,183599,183600,183601,183602,183603,183604,183605,183606,183607,183608,183609,183610,183611,183612,183613,183614,183615,183616,183617,183618,183619,183620,183621,183622,183623,183624,183625,183626,183627,183628,183629,183630,183631,183632,183633,183634,183635,183636,183637,183638,183639,183640,183641,183642,183643,183644,183645,183646,183647,183648,183649,183650,183651,183652,183653,183654,183655,183656,183657,183658,183659,183660,183661,183662,183663,183664,183665,183666,183667,183668,183669,183670,183671,183672,183673,183674,183675,183676,183677,183678,183679,183680,183681,183682,183683,183684,183685,183686,183687,183688,183689,183690,183691,183692,183693,183694,183695,183696,183697,183698,183699,183700,183701,183702,183703,183704,183705,183706,183707,183708,183709,183710,183711,183712,183713,183714,183715,183716,183717,183718,183719,183720,183721,183722,183723,183724,183725,183726,183727,183728,183729,183730,183731,183732,183733,183734,183735,183736,183737,183738,183739,183740,183741,183742,183743,183744,183745,183746,183747,183748,183749,183750,183751,183752,183753,183754,183755,183756,183757,183758,183759,183760,183761,183762,183763,183764,183765,183766,183767,183768,183769,183770,183771,183772,183773,183774,183775,183776,183777,183778,183779,183780,183781,183782,183783,183784,183785,183786,183787,183788,183789,183790,183791,183792,183793,183794,183795,183796,183797,183798,183799,183800,183801,183802,183803,183804,183805,183806,183807,183808,183809,183810,183811,183812,183813,183814,183815,183816,183817,183818,183819,183820,183821,183822,183823,183824,183825,183826,183827,183828,183829,183830,183831,183832,183833,183834,183835,183836,183837,183838,183839,183840,183841,183842,183843,183844,183845,183846,183847,183848,183849,183850,183851,183852,183853,183854,183855,183856,183857,183858,183859,183860,183861,183862,183863,183864,183865,183866,183867,183868,183869,183870,183871,183872,183873,183874,183875,183876,183877,183878,183879,183880,183881,183882,183883,183884,183885,183886,183887,183888,183889,183890,183891,183892,183893,183894,183895,183896,183897,183898,183899,183900,183901,183902,183903,183904,183905,183906,183907,183908,183909,183910,183911,183912,183913,183914,183915,183916,183917,183918,183919,183920,183921,183922,183923,183924,183925,183926,183927,183928,183929,183930,183931,183932,183933,183934,183935,183936,183937,183938,183939,183940,183941,183942,183943,183944,183945,183946,183947,183948,183949,183950,183951,183952,183953,183954,183955,183956,183957,183958,183959,183960,183961,183962,183963,183964,183965,183966,183967,183968,183969,183984,183985,183986,183987,183988,183989,183990,183991,183992,183993,183994,183995,183996,183997,183998,183999,184000,184001,184002,184003,184004,184005,184006,184007,184008,184009,184010,184011,184012,184013,184014,184015,184016,184017,184018,184019,184020,184021,184022,184023,184024,184025,184026,184027,184028,184029,184030,184031,184032,184033,184034,184035,184036,184037,184038,184039,184040,184041,184042,184043,184044,184045,184046,184047,184048,184049,184050,184051,184052,184053,184054,184055,184056,184057,184058,184059,184060,184061,184062,184063,184064,184065,184066,184067,184068,184069,184070,184071,184072,184073,184074,184075,184076,184077,184078,184079,184080,184081,184082,184083,184084,184085,184086,184087,184088,184089,184090,184091,184092,184093,184094,184095,184096,184097,184098,184099,184100,184101,184102,184103,184104,184105,184106,184107,184108,184109,184110,184111,184112,184113,184114,184115,184116,184117,184118,184119,184120,184121,184122,184123,184124,184125,184126,184127,184128,184129,184130,184131,184132,184133,184134,184135,184136,184137,184138,184139,184140,184141,184142,184143,184144,184145,184146,184147,184148,184149,184150,184151,184152,184153,184154,184155,184156,184157,184158,184159,184160,184161,184162,184163,184164,184165,184166,184167,184168,184169,184170,184171,184172,184173,184174,184175,184176,184177,184178,184179,184180,184181,184182,184183,184184,184185,184186,184187,184188,184189,184190,184191,184192,184193,184194,184195,184196,184197,184198,184199,184200,184201,184202,184203,184204,184205,184206,184207,184208,184209,184210,184211,184212,184213,184214,184215,184216,184217,184218,184219,184220,184221,184222,184223,184224,184225,184226,184227,184228,184229,184230,184231,184232,184233,184234,184235,184236,184237,184238,184239,184240,184241,184242,184243,184244,184245,184246,184247,184248,184249,184250,184251,184252,184253,184254,184255,184256,184257,184258,184259,184260,184261,184262,184263,184264,184265,184266,184267,184268,184269,184270,184271,184272,184273,184274,184275,184276,184277,184278,184279,184280,184281,184282,184283,184284,184285,184286,184287,184288,184289,184290,184291,184292,184293,184294,184295,184296,184297,184298,184299,184300,184301,184302,184303,184304,184305,184306,184307,184308,184309,184310,184311,184312,184313,184314,184315,184316,184317,184318,184319,184320,184321,184322,184323,184324,184325,184326,184327,184328,184329,184330,184331,184332,184333,184334,184335,184336,184337,184338,184339,184340,184341,184342,184343,184344,184345,184346,184347,184348,184349,184350,184351,184352,184353,184354,184355,184356,184357,184358,184359,184360,184361,184362,184363,184364,184365,184366,184367,184368,184369,184370,184371,184372,184373,184374,184375,184376,184377,184378,184379,184380,184381,184382,184383,184384,184385,184386,184387,184388,184389,184390,184391,184392,184393,184394,184395,184396,184397,184398,184399,184400,184401,184402,184403,184404,184405,184406,184407,184408,184409,184410,184411,184412,184413,184414,184415,184416,184417,184418,184419,184420,184421,184422,184423,184424,184425,184426,184427,184428,184429,184430,184431,184432,184433,184434,184435,184436,184437,184438,184439,184440,184441,184442,184443,184444,184445,184446,184447,184448,184449,184450,184451,184452,184453,184454,184455,184456,184457,184458,184459,184460,184461,184462,184463,184464,184465,184466,184467,184468,184469,184470,184471,184472,184473,184474,184475,184476,184477,184478,184479,184480,184481,184482,184483,184484,184485,184486,184487,184488,184489,184490,184491,184492,184493,184494,184495,184496,184497,184498,184499,184500,184501,184502,184503,184504,184505,184506,184507,184508,184509,184510,184511,184512,184513,184514,184515,184516,184517,184518,184519,184520,184521,184522,184523,184524,184525,184526,184527,184528,184529,184530,184531,184532,184533,184534,184535,184536,184537,184538,184539,184540,184541,184542,184543,184544,184545,184546,184547,184548,184549,184550,184551,184552,184553,184554,184555,184556,184557,184558,184559,184560,184561,184562,184563,184564,184565,184566,184567,184568,184569,184570,184571,184572,184573,184574,184575,184576,184577,184578,184579,184580,184581,184582,184583,184584,184585,184586,184587,184588,184589,184590,184591,184592,184593,184594,184595,184596,184597,184598,184599,184600,184601,184602,184603,184604,184605,184606,184607,184608,184609,184610,184611,184612,184613,184614,184615,184616,184617,184618,184619,184620,184621,184622,184623,184624,184625,184626,184627,184628,184629,184630,184631,184632,184633,184634,184635,184636,184637,184638,184639,184640,184641,184642,184643,184644,184645,184646,184647,184648,184649,184650,184651,184652,184653,184654,184655,184656,184657,184658,184659,184660,184661,184662,184663,184664,184665,184666,184667,184668,184669,184670,184671,184672,184673,184674,184675,184676,184677,184678,184679,184680,184681,184682,184683,184684,184685,184686,184687,184688,184689,184690,184691,184692,184693,184694,184695,184696,184697,184698,184699,184700,184701,184702,184703,184704,184705,184706,184707,184708,184709,184710,184711,184712,184713,184714,184715,184716,184717,184718,184719,184720,184721,184722,184723,184724,184725,184726,184727,184728,184729,184730,184731,184732,184733,184734,184735,184736,184737,184738,184739,184740,184741,184742,184743,184744,184745,184746,184747,184748,184749,184750,184751,184752,184753,184754,184755,184756,184757,184758,184759,184760,184761,184762,184763,184764,184765,184766,184767,184768,184769,184770,184771,184772,184773,184774,184775,184776,184777,184778,184779,184780,184781,184782,184783,184784,184785,184786,184787,184788,184789,184790,184791,184792,184793,184794,184795,184796,184797,184798,184799,184800,184801,184802,184803,184804,184805,184806,184807,184808,184809,184810,184811,184812,184813,184814,184815,184816,184817,184818,184819,184820,184821,184822,184823,184824,184825,184826,184827,184828,184829,184830,184831,184832,184833,184834,184835,184836,184837,184838,184839,184840,184841,184842,184843,184844,184845,184846,184847,184848,184849,184850,184851,184852,184853,184854,184855,184856,184857,184858,184859,184860,184861,184862,184863,184864,184865,184866,184867,184868,184869,184870,184871,184872,184873,184874,184875,184876,184877,184878,184879,184880,184881,184882,184883,184884,184885,184886,184887,184888,184889,184890,184891,184892,184893,184894,184895,184896,184897,184898,184899,184900,184901,184902,184903,184904,184905,184906,184907,184908,184909,184910,184911,184912,184913,184914,184915,184916,184917,184918,184919,184920,184921,184922,184923,184924,184925,184926,184927,184928,184929,184930,184931,184932,184933,184934,184935,184936,184937,184938,184939,184940,184941,184942,184943,184944,184945,184946,184947,184948,184949,184950,184951,184952,184953,184954,184955,184956,184957,184958,184959,184960,184961,184962,184963,184964,184965,184966,184967,184968,184969,184970,184971,184972,184973,184974,184975,184976,184977,184978,184979,184980,184981,184982,184983,184984,184985,184986,184987,184988,184989,184990,184991,184992,184993,184994,184995,184996,184997,184998,184999,185000,185001,185002,185003,185004,185005,185006,185007,185008,185009,185010,185011,185012,185013,185014,185015,185016,185017,185018,185019,185020,185021,185022,185023,185024,185025,185026,185027,185028,185029,185030,185031,185032,185033,185034,185035,185036,185037,185038,185039,185040,185041,185042,185043,185044,185045,185046,185047,185048,185049,185050,185051,185052,185053,185054,185055,185056,185057,185058,185059,185060,185061,185062,185063,185064,185065,185066,185067,185068,185069,185070,185071,185072,185073,185074,185075,185076,185077,185078,185079,185080,185081,185082,185083,185084,185085,185086,185087,185088,185089,185090,185091,185092,185093,185094,185095,185096,185097,185098,185099,185100,185101,185102,185103,185104,185105,185106,185107,185108,185109,185110,185111,185112,185113,185114,185115,185116,185117,185118,185119,185120,185121,185122,185123,185124,185125,185126,185127,185128,185129,185130,185131,185132,185133,185134,185135,185136,185137,185138,185139,185140,185141,185142,185143,185144,185145,185146,185147,185148,185149,185150,185151,185152,185153,185154,185155,185156,185157,185158,185159,185160,185161,185162,185163,185164,185165,185166,185167,185168,185169,185170,185171,185172,185173,185174,185175,185176,185177,185178,185179,185180,185181,185182,185183,185184,185185,185186,185187,185188,185189,185190,185191,185192,185193,185194,185195,185196,185197,185198,185199,185200,185201,185202,185203,185204,185205,185206,185207,185208,185209,185210,185211,185212,185213,185214,185215,185216,185217,185218,185219,185220,185221,185222,185223,185224,185225,185226,185227,185228,185229,185230,185231,185232,185233,185234,185235,185236,185237,185238,185239,185240,185241,185242,185243,185244,185245,185246,185247,185248,185249,185250,185251,185252,185253,185254,185255,185256,185257,185258,185259,185260,185261,185262,185263,185264,185265,185266,185267,185268,185269,185270,185271,185272,185273,185274,185275,185276,185277,185278,185279,185280,185281,185282,185283,185284,185285,185286,185287,185288,185289,185290,185291,185292,185293,185294,185295,185296,185297,185298,185299,185300,185301,185302,185303,185304,185305,185306,185307,185308,185309,185310,185311,185312,185313,185314,185315,185316,185317,185318,185319,185320,185321,185322,185323,185324,185325,185326,185327,185328,185329,185330,185331,185332,185333,185334,185335,185336,185337,185338,185339,185340,185341,185342,185343,185344,185345,185346,185347,185348,185349,185350,185351,185352,185353,185354,185355,185356,185357,185358,185359,185360,185361,185362,185363,185364,185365,185366,185367,185368,185369,185370,185371,185372,185373,185374,185375,185376,185377,185378,185379,185380,185381,185382,185383,185384,185385,185386,185387,185388,185389,185390,185391,185392,185393,185394,185395,185396,185397,185398,185399,185400,185401,185402,185403,185404,185405,185406,185407,185408,185409,185410,185411,185412,185413,185414,185415,185416,185417,185418,185419,185420,185421,185422,185423,185424,185425,185426,185427,185428,185429,185430,185431,185432,185433,185434,185435,185436,185437,185438,185439,185440,185441,185442,185443,185444,185445,185446,185447,185448,185449,185450,185451,185452,185453,185454,185455,185456,185457,185458,185459,185460,185461,185462,185463,185464,185465,185466,185467,185468,185469,185470,185471,185472,185473,185474,185475,185476,185477,185478,185479,185480,185481,185482,185483,185484,185485,185486,185487,185488,185489,185490,185491,185492,185493,185494,185495,185496,185497,185498,185499,185500,185501,185502,185503,185504,185505,185506,185507,185508,185509,185510,185511,185512,185513,185514,185515,185516,185517,185518,185519,185520,185521,185522,185523,185524,185525,185526,185527,185528,185529,185530,185531,185532,185533,185534,185535,185536,185537,185538,185539,185540,185541,185542,185543,185544,185545,185546,185547,185548,185549,185550,185551,185552,185553,185554,185555,185556,185557,185558,185559,185560,185561,185562,185563,185564,185565,185566,185567,185568,185569,185570,185571,185572,185573,185574,185575,185576,185577,185578,185579,185580,185581,185582,185583,185584,185585,185586,185587,185588,185589,185590,185591,185592,185593,185594,185595,185596,185597,185598,185599,185600,185601,185602,185603,185604,185605,185606,185607,185608,185609,185610,185611,185612,185613,185614,185615,185616,185617,185618,185619,185620,185621,185622,185623,185624,185625,185626,185627,185628,185629,185630,185631,185632,185633,185634,185635,185636,185637,185638,185639,185640,185641,185642,185643,185644,185645,185646,185647,185648,185649,185650,185651,185652,185653,185654,185655,185656,185657,185658,185659,185660,185661,185662,185663,185664,185665,185666,185667,185668,185669,185670,185671,185672,185673,185674,185675,185676,185677,185678,185679,185680,185681,185682,185683,185684,185685,185686,185687,185688,185689,185690,185691,185692,185693,185694,185695,185696,185697,185698,185699,185700,185701,185702,185703,185704,185705,185706,185707,185708,185709,185710,185711,185712,185713,185714,185715,185716,185717,185718,185719,185720,185721,185722,185723,185724,185725,185726,185727,185728,185729,185730,185731,185732,185733,185734,185735,185736,185737,185738,185739,185740,185741,185742,185743,185744,185745,185746,185747,185748,185749,185750,185751,185752,185753,185754,185755,185756,185757,185758,185759,185760,185761,185762,185763,185764,185765,185766,185767,185768,185769,185770,185771,185772,185773,185774,185775,185776,185777,185778,185779,185780,185781,185782,185783,185784,185785,185786,185787,185788,185789,185790,185791,185792,185793,185794,185795,185796,185797,185798,185799,185800,185801,185802,185803,185804,185805,185806,185807,185808,185809,185810,185811,185812,185813,185814,185815,185816,185817,185818,185819,185820,185821,185822,185823,185824,185825,185826,185827,185828,185829,185830,185831,185832,185833,185834,185835,185836,185837,185838,185839,185840,185841,185842,185843,185844,185845,185846,185847,185848,185849,185850,185851,185852,185853,185854,185855,185856,185857,185858,185859,185860,185861,185862,185863,185864,185865,185866,185867,185868,185869,185870,185871,185872,185873,185874,185875,185876,185877,185878,185879,185880,185881,185882,185883,185884,185885,185886,185887,185888,185889,185890,185891,185892,185893,185894,185895,185896,185897,185898,185899,185900,185901,185902,185903,185904,185905,185906,185907,185908,185909,185910,185911,185912,185913,185914,185915,185916,185917,185918,185919,185920,185921,185922,185923,185924,185925,185926,185927,185928,185929,185930,185931,185932,185933,185934,185935,185936,185937,185938,185939,185940,185941,185942,185943,185944,185945,185946,185947,185948,185949,185950,185951,185952,185953,185954,185955,185956,185957,185958,185959,185960,185961,185962,185963,185964,185965,185966,185967,185968,185969,185970,185971,185972,185973,185974,185975,185976,185977,185978,185979,185980,185981,185982,185983,185984,185985,185986,185987,185988,185989,185990,185991,185992,185993,185994,185995,185996,185997,185998,185999,186000,186001,186002,186003,186004,186005,186006,186007,186008,186009,186010,186011,186012,186013,186014,186015,186016,186017,186018,186019,186020,186021,186022,186023,186024,186025,186026,186027,186028,186029,186030,186031,186032,186033,186034,186035,186036,186037,186038,186039,186040,186041,186042,186043,186044,186045,186046,186047,186048,186049,186050,186051,186052,186053,186054,186055,186056,186057,186058,186059,186060,186061,186062,186063,186064,186065,186066,186067,186068,186069,186070,186071,186072,186073,186074,186075,186076,186077,186078,186079,186080,186081,186082,186083,186084,186085,186086,186087,186088,186089,186090,186091,186092,186093,186094,186095,186096,186097,186098,186099,186100,186101,186102,186103,186104,186105,186106,186107,186108,186109,186110,186111,186112,186113,186114,186115,186116,186117,186118,186119,186120,186121,186122,186123,186124,186125,186126,186127,186128,186129,186130,186131,186132,186133,186134,186135,186136,186137,186138,186139,186140,186141,186142,186143,186144,186145,186146,186147,186148,186149,186150,186151,186152,186153,186154,186155,186156,186157,186158,186159,186160,186161,186162,186163,186164,186165,186166,186167,186168,186169,186170,186171,186172,186173,186174,186175,186176,186177,186178,186179,186180,186181,186182,186183,186184,186185,186186,186187,186188,186189,186190,186191,186192,186193,186194,186195,186196,186197,186198,186199,186200,186201,186202,186203,186204,186205,186206,186207,186208,186209,186210,186211,186212,186213,186214,186215,186216,186217,186218,186219,186220,186221,186222,186223,186224,186225,186226,186227,186228,186229,186230,186231,186232,186233,186234,186235,186236,186237,186238,186239,186240,186241,186242,186243,186244,186245,186246,186247,186248,186249,186250,186251,186252,186253,186254,186255,186256,186257,186258,186259,186260,186261,186262,186263,186264,186265,186266,186267,186268,186269,186270,186271,186272,186273,186274,186275,186276,186277,186278,186279,186280,186281,186282,186283,186284,186285,186286,186287,186288,186289,186290,186291,186292,186293,186294,186295,186296,186297,186298,186299,186300,186301,186302,186303,186304,186305,186306,186307,186308,186309,186310,186311,186312,186313,186314,186315,186316,186317,186318,186319,186320,186321,186322,186323,186324,186325,186326,186327,186328,186329,186330,186331,186332,186333,186334,186335,186336,186337,186338,186339,186340,186341,186342,186343,186344,186345,186346,186347,186348,186349,186350,186351,186352,186353,186354,186355,186356,186357,186358,186359,186360,186361,186362,186363,186364,186365,186366,186367,186368,186369,186370,186371,186372,186373,186374,186375,186376,186377,186378,186379,186380,186381,186382,186383,186384,186385,186386,186387,186388,186389,186390,186391,186392,186393,186394,186395,186396,186397,186398,186399,186400,186401,186402,186403,186404,186405,186406,186407,186408,186409,186410,186411,186412,186413,186414,186415,186416,186417,186418,186419,186420,186421,186422,186423,186424,186425,186426,186427,186428,186429,186430,186431,186432,186433,186434,186435,186436,186437,186438,186439,186440,186441,186442,186443,186444,186445,186446,186447,186448,186449,186450,186451,186452,186453,186454,186455,186456,186457,186458,186459,186460,186461,186462,186463,186464,186465,186466,186467,186468,186469,186470,186471,186472,186473,186474,186475,186476,186477,186478,186479,186480,186481,186482,186483,186484,186485,186486,186487,186488,186489,186490,186491,186492,186493,186494,186495,186496,186497,186498,186499,186500,186501,186502,186503,186504,186505,186506,186507,186508,186509,186510,186511,186512,186513,186514,186515,186516,186517,186518,186519,186520,186521,186522,186523,186524,186525,186526,186527,186528,186529,186530,186531,186532,186533,186534,186535,186536,186537,186538,186539,186540,186541,186542,186543,186544,186545,186546,186547,186548,186549,186550,186551,186552,186553,186554,186555,186556,186557,186558,186559,186560,186561,186562,186563,186564,186565,186566,186567,186568,186569,186570,186571,186572,186573,186574,186575,186576,186577,186578,186579,186580,186581,186582,186583,186584,186585,186586,186587,186588,186589,186590,186591,186592,186593,186594,186595,186596,186597,186598,186599,186600,186601,186602,186603,186604,186605,186606,186607,186608,186609,186610,186611,186612,186613,186614,186615,186616,186617,186618,186619,186620,186621,186622,186623,186624,186625,186626,186627,186628,186629,186630,186631,186632,186633,186634,186635,186636,186637,186638,186639,186640,186641,186642,186643,186644,186645,186646,186647,186648,186649,186650,186651,186652,186653,186654,186655,186656,186657,186658,186659,186660,186661,186662,186663,186664,186665,186666,186667,186668,186669,186670,186671,186672,186673,186674,186675,186676,186677,186678,186679,186680,186681,186682,186683,186684,186685,186686,186687,186688,186689,186690,186691,186692,186693,186694,186695,186696,186697,186698,186699,186700,186701,186702,186703,186704,186705,186706,186707,186708,186709,186710,186711,186712,186713,186714,186715,186716,186717,186718,186719,186720,186721,186722,186723,186724,186725,186726,186727,186728,186729,186730,186731,186732,186733,186734,186735,186736,186737,186738,186739,186740,186741,186742,186743,186744,186745,186746,186747,186748,186749,186750,186751,186752,186753,186754,186755,186756,186757,186758,186759,186760,186761,186762,186763,186764,186765,186766,186767,186768,186769,186770,186771,186772,186773,186774,186775,186776,186777,186778,186779,186780,186781,186782,186783,186784,186785,186786,186787,186788,186789,186790,186791,186792,186793,186794,186795,186796,186797,186798,186799,186800,186801,186802,186803,186804,186805,186806,186807,186808,186809,186810,186811,186812,186813,186814,186815,186816,186817,186818,186819,186820,186821,186822,186823,186824,186825,186826,186827,186828,186829,186830,186831,186832,186833,186834,186835,186836,186837,186838,186839,186840,186841,186842,186843,186844,186845,186846,186847,186848,186849,186850,186851,186852,186853,186854,186855,186856,186857,186858,186859,186860,186861,186862,186863,186864,186865,186866,186867,186868,186869,186870,186871,186872,186873,186874,186875,186876,186877,186878,186879,186880,186881,186882,186883,186884,186885,186886,186887,186888,186889,186890,186891,186892,186893,186894,186895,186896,186897,186898,186899,186900,186901,186902,186903,186904,186905,186906,186907,186908,186909,186910,186911,186912,186913,186914,186915,186916,186917,186918,186919,186920,186921,186922,186923,186924,186925,186926,186927,186928,186929,186930,186931,186932,186933,186934,186935,186936,186937,186938,186939,186940,186941,186942,186943,186944,186945,186946,186947,186948,186949,186950,186951,186952,186953,186954,186955,186956,186957,186958,186959,186960,186961,186962,186963,186964,186965,186966,186967,186968,186969,186970,186971,186972,186973,186974,186975,186976,186977,186978,186979,186980,186981,186982,186983,186984,186985,186986,186987,186988,186989,186990,186991,186992,186993,186994,186995,186996,186997,186998,186999,187000,187001,187002,187003,187004,187005,187006,187007,187008,187009,187010,187011,187012,187013,187014,187015,187016,187017,187018,187019,187020,187021,187022,187023,187024,187025,187026,187027,187028,187029,187030,187031,187032,187033,187034,187035,187036,187037,187038,187039,187040,187041,187042,187043,187044,187045,187046,187047,187048,187049,187050,187051,187052,187053,187054,187055,187056,187057,187058,187059,187060,187061,187062,187063,187064,187065,187066,187067,187068,187069,187070,187071,187072,187073,187074,187075,187076,187077,187078,187079,187080,187081,187082,187083,187084,187085,187086,187087,187088,187089,187090,187091,187092,187093,187094,187095,187096,187097,187098,187099,187100,187101,187102,187103,187104,187105,187106,187107,187108,187109,187110,187111,187112,187113,187114,187115,187116,187117,187118,187119,187120,187121,187122,187123,187124,187125,187126,187127,187128,187129,187130,187131,187132,187133,187134,187135,187136,187137,187138,187139,187140,187141,187142,187143,187144,187145,187146,187147,187148,187149,187150,187151,187152,187153,187154,187155,187156,187157,187158,187159,187160,187161,187162,187163,187164,187165,187166,187167,187168,187169,187170,187171,187172,187173,187174,187175,187176,187177,187178,187179,187180,187181,187182,187183,187184,187185,187186,187187,187188,187189,187190,187191,187192,187193,187194,187195,187196,187197,187198,187199,187200,187201,187202,187203,187204,187205,187206,187207,187208,187209,187210,187211,187212,187213,187214,187215,187216,187217,187218,187219,187220,187221,187222,187223,187224,187225,187226,187227,187228,187229,187230,187231,187232,187233,187234,187235,187236,187237,187238,187239,187240,187241,187242,187243,187244,187245,187246,187247,187248,187249,187250,187251,187252,187253,187254,187255,187256,187257,187258,187259,187260,187261,187262,187263,187264,187265,187266,187267,187268,187269,187270,187271,187272,187273,187274,187275,187276,187277,187278,187279,187280,187281,187282,187283,187284,187285,187286,187287,187288,187289,187290,187291,187292,187293,187294,187295,187296,187297,187298,187299,187300,187301,187302,187303,187304,187305,187306,187307,187308,187309,187310,187311,187312,187313,187314,187315,187316,187317,187318,187319,187320,187321,187322,187323,187324,187325,187326,187327,187328,187329,187330,187331,187332,187333,187334,187335,187336,187337,187338,187339,187340,187341,187342,187343,187344,187345,187346,187347,187348,187349,187350,187351,187352,187353,187354,187355,187356,187357,187358,187359,187360,187361,187362,187363,187364,187365,187366,187367,187368,187369,187370,187371,187372,187373,187374,187375,187376,187377,187378,187379,187380,187381,187382,187383,187384,187385,187386,187387,187388,187389,187390,187391,187392,187393,187394,187395,187396,187397,187398,187399,187400,187401,187402,187403,187404,187405,187406,187407,187408,187409,187410,187411,187412,187413,187414,187415,187416,187417,187418,187419,187420,187421,187422,187423,187424,187425,187426,187427,187428,187429,187430,187431,187432,187433,187434,187435,187436,187437,187438,187439,187440,187441,187442,187443,187444,187445,187446,187447,187448,187449,187450,187451,187452,187453,187454,187455,187456,187457,187458,187459,187460,187461,187462,187463,187464,187465,187466,187467,187468,187469,187470,187471,187472,187473,187474,187475,187476,187477,187478,187479,187480,187481,187482,187483,187484,187485,187486,187487,187488,187489,187490,187491,187492,187493,187494,187495,187496,187497,187498,187499,187500,187501,187502,187503,187504,187505,187506,187507,187508,187509,187510,187511,187512,187513,187514,187515,187516,187517,187518,187519,187520,187521,187522,187523,187524,187525,187526,187527,187528,187529,187530,187531,187532,187533,187534,187535,187536,187537,187538,187539,187540,187541,187542,187543,187544,187545,187546,187547,187548,187549,187550,187551,187552,187553,187554,187555,187556,187557,187558,187559,187560,187561,187562,187563,187564,187565,187566,187567,187568,187569,187570,187571,187572,187573,187574,187575,187576,187577,187578,187579,187580,187581,187582,187583,187584,187585,187586,187587,187588,187589,187590,187591,187592,187593,187594,187595,187596,187597,187598,187599,187600,187601,187602,187603,187604,187605,187606,187607,187608,187609,187610,187611,187612,187613,187614,187615,187616,187617,187618,187619,187620,187621,187622,187623,187624,187625,187626,187627,187628,187629,187630,187631,187632,187633,187634,187635,187636,187637,187638,187639,187640,187641,187642,187643,187644,187645,187646,187647,187648,187649,187650,187651,187652,187653,187654,187655,187656,187657,187658,187659,187660,187661,187662,187663,187664,187665,187666,187667,187668,187669,187670,187671,187672,187673,187674,187675,187676,187677,187678,187679,187680,187681,187682,187683,187684,187685,187686,187687,187688,187689,187690,187691,187692,187693,187694,187695,187696,187697,187698,187699,187700,187701,187702,187703,187704,187705,187706,187707,187708,187709,187710,187711,187712,187713,187714,187715,187716,187717,187718,187719,187720,187721,187722,187723,187724,187725,187726,187727,187728,187729,187730,187731,187732,187733,187734,187735,187736,187737,187738,187739,187740,187741,187742,187743,187744,187745,187746,187747,187748,187749,187750,187751,187752,187753,187754,187755,187756,187757,187758,187759,187760,187761,187762,187763,187764,187765,187766,187767,187768,187769,187770,187771,187772,187773,187774,187775,187776,187777,187778,187779,187780,187781,187782,187783,187784,187785,187786,187787,187788,187789,187790,187791,187792,187793,187794,187795,187796,187797,187798,187799,187800,187801,187802,187803,187804,187805,187806,187807,187808,187809,187810,187811,187812,187813,187814,187815,187816,187817,187818,187819,187820,187821,187822,187823,187824,187825,187826,187827,187828,187829,187830,187831,187832,187833,187834,187835,187836,187837,187838,187839,187840,187841,187842,187843,187844,187845,187846,187847,187848,187849,187850,187851,187852,187853,187854,187855,187856,187857,187858,187859,187860,187861,187862,187863,187864,187865,187866,187867,187868,187869,187870,187871,187872,187873,187874,187875,187876,187877,187878,187879,187880,187881,187882,187883,187884,187885,187886,187887,187888,187889,187890,187891,187892,187893,187894,187895,187896,187897,187898,187899,187900,187901,187902,187903,187904,187905,187906,187907,187908,187909,187910,187911,187912,187913,187914,187915,187916,187917,187918,187919,187920,187921,187922,187923,187924,187925,187926,187927,187928,187929,187930,187931,187932,187933,187934,187935,187936,187937,187938,187939,187940,187941,187942,187943,187944,187945,187946,187947,187948,187949,187950,187951,187952,187953,187954,187955,187956,187957,187958,187959,187960,187961,187962,187963,187964,187965,187966,187967,187968,187969,187970,187971,187972,187973,187974,187975,187976,187977,187978,187979,187980,187981,187982,187983,187984,187985,187986,187987,187988,187989,187990,187991,187992,187993,187994,187995,187996,187997,187998,187999,188000,188001,188002,188003,188004,188005,188006,188007,188008,188009,188010,188011,188012,188013,188014,188015,188016,188017,188018,188019,188020,188021,188022,188023,188024,188025,188026,188027,188028,188029,188030,188031,188032,188033,188034,188035,188036,188037,188038,188039,188040,188041,188042,188043,188044,188045,188046,188047,188048,188049,188050,188051,188052,188053,188054,188055,188056,188057,188058,188059,188060,188061,188062,188063,188064,188065,188066,188067,188068,188069,188070,188071,188072,188073,188074,188075,188076,188077,188078,188079,188080,188081,188082,188083,188084,188085,188086,188087,188088,188089,188090,188091,188092,188093,188094,188095,188096,188097,188098,188099,188100,188101,188102,188103,188104,188105,188106,188107,188108,188109,188110,188111,188112,188113,188114,188115,188116,188117,188118,188119,188120,188121,188122,188123,188124,188125,188126,188127,188128,188129,188130,188131,188132,188133,188134,188135,188136,188137,188138,188139,188140,188141,188142,188143,188144,188145,188146,188147,188148,188149,188150,188151,188152,188153,188154,188155,188156,188157,188158,188159,188160,188161,188162,188163,188164,188165,188166,188167,188168,188169,188170,188171,188172,188173,188174,188175,188176,188177,188178,188179,188180,188181,188182,188183,188184,188185,188186,188187,188188,188189,188190,188191,188192,188193,188194,188195,188196,188197,188198,188199,188200,188201,188202,188203,188204,188205,188206,188207,188208,188209,188210,188211,188212,188213,188214,188215,188216,188217,188218,188219,188220,188221,188222,188223,188224,188225,188226,188227,188228,188229,188230,188231,188232,188233,188234,188235,188236,188237,188238,188239,188240,188241,188242,188243,188244,188245,188246,188247,188248,188249,188250,188251,188252,188253,188254,188255,188256,188257,188258,188259,188260,188261,188262,188263,188264,188265,188266,188267,188268,188269,188270,188271,188272,188273,188274,188275,188276,188277,188278,188279,188280,188281,188282,188283,188284,188285,188286,188287,188288,188289,188290,188291,188292,188293,188294,188295,188296,188297,188298,188299,188300,188301,188302,188303,188304,188305,188306,188307,188308,188309,188310,188311,188312,188313,188314,188315,188316,188317,188318,188319,188320,188321,188322,188323,188324,188325,188326,188327,188328,188329,188330,188331,188332,188333,188334,188335,188336,188337,188338,188339,188340,188341,188342,188343,188344,188345,188346,188347,188348,188349,188350,188351,188352,188353,188354,188355,188356,188357,188358,188359,188360,188361,188362,188363,188364,188365,188366,188367,188368,188369,188370,188371,188372,188373,188374,188375,188376,188377,188378,188379,188380,188381,188382,188383,188384,188385,188386,188387,188388,188389,188390,188391,188392,188393,188394,188395,188396,188397,188398,188399,188400,188401,188402,188403,188404,188405,188406,188407,188408,188409,188410,188411,188412,188413,188414,188415,188416,188417,188418,188419,188420,188421,188422,188423,188424,188425,188426,188427,188428,188429,188430,188431,188432,188433,188434,188435,188436,188437,188438,188439,188440,188441,188442,188443,188444,188445,188446,188447,188448,188449,188450,188451,188452,188453,188454,188455,188456,188457,188458,188459,188460,188461,188462,188463,188464,188465,188466,188467,188468,188469,188470,188471,188472,188473,188474,188475,188476,188477,188478,188479,188480,188481,188482,188483,188484,188485,188486,188487,188488,188489,188490,188491,188492,188493,188494,188495,188496,188497,188498,188499,188500,188501,188502,188503,188504,188505,188506,188507,188508,188509,188510,188511,188512,188513,188514,188515,188516,188517,188518,188519,188520,188521,188522,188523,188524,188525,188526,188527,188528,188529,188530,188531,188532,188533,188534,188535,188536,188537,188538,188539,188540,188541,188542,188543,188544,188545,188546,188547,188548,188549,188550,188551,188552,188553,188554,188555,188556,188557,188558,188559,188560,188561,188562,188563,188564,188565,188566,188567,188568,188569,188570,188571,188572,188573,188574,188575,188576,188577,188578,188579,188580,188581,188582,188583,188584,188585,188586,188587,188588,188589,188590,188591,188592,188593,188594,188595,188596,188597,188598,188599,188600,188601,188602,188603,188604,188605,188606,188607,188608,188609,188610,188611,188612,188613,188614,188615,188616,188617,188618,188619,188620,188621,188622,188623,188624,188625,188626,188627,188628,188629,188630,188631,188632,188633,188634,188635,188636,188637,188638,188639,188640,188641,188642,188643,188644,188645,188646,188647,188648,188649,188650,188651,188652,188653,188654,188655,188656,188657,188658,188659,188660,188661,188662,188663,188664,188665,188666,188667,188668,188669,188670,188671,188672,188673,188674,188675,188676,188677,188678,188679,188680,188681,188682,188683,188684,188685,188686,188687,188688,188689,188690,188691,188692,188693,188694,188695,188696,188697,188698,188699,188700,188701,188702,188703,188704,188705,188706,188707,188708,188709,188710,188711,188712,188713,188714,188715,188716,188717,188718,188719,188720,188721,188722,188723,188724,188725,188726,188727,188728,188729,188730,188731,188732,188733,188734,188735,188736,188737,188738,188739,188740,188741,188742,188743,188744,188745,188746,188747,188748,188749,188750,188751,188752,188753,188754,188755,188756,188757,188758,188759,188760,188761,188762,188763,188764,188765,188766,188767,188768,188769,188770,188771,188772,188773,188774,188775,188776,188777,188778,188779,188780,188781,188782,188783,188784,188785,188786,188787,188788,188789,188790,188791,188792,188793,188794,188795,188796,188797,188798,188799,188800,188801,188802,188803,188804,188805,188806,188807,188808,188809,188810,188811,188812,188813,188814,188815,188816,188817,188818,188819,188820,188821,188822,188823,188824,188825,188826,188827,188828,188829,188830,188831,188832,188833,188834,188835,188836,188837,188838,188839,188840,188841,188842,188843,188844,188845,188846,188847,188848,188849,188850,188851,188852,188853,188854,188855,188856,188857,188858,188859,188860,188861,188862,188863,188864,188865,188866,188867,188868,188869,188870,188871,188872,188873,188874,188875,188876,188877,188878,188879,188880,188881,188882,188883,188884,188885,188886,188887,188888,188889,188890,188891,188892,188893,188894,188895,188896,188897,188898,188899,188900,188901,188902,188903,188904,188905,188906,188907,188908,188909,188910,188911,188912,188913,188914,188915,188916,188917,188918,188919,188920,188921,188922,188923,188924,188925,188926,188927,188928,188929,188930,188931,188932,188933,188934,188935,188936,188937,188938,188939,188940,188941,188942,188943,188944,188945,188946,188947,188948,188949,188950,188951,188952,188953,188954,188955,188956,188957,188958,188959,188960,188961,188962,188963,188964,188965,188966,188967,188968,188969,188970,188971,188972,188973,188974,188975,188976,188977,188978,188979,188980,188981,188982,188983,188984,188985,188986,188987,188988,188989,188990,188991,188992,188993,188994,188995,188996,188997,188998,188999,189000,189001,189002,189003,189004,189005,189006,189007,189008,189009,189010,189011,189012,189013,189014,189015,189016,189017,189018,189019,189020,189021,189022,189023,189024,189025,189026,189027,189028,189029,189030,189031,189032,189033,189034,189035,189036,189037,189038,189039,189040,189041,189042,189043,189044,189045,189046,189047,189048,189049,189050,189051,189052,189053,189054,189055,189056,189057,189058,189059,189060,189061,189062,189063,189064,189065,189066,189067,189068,189069,189070,189071,189072,189073,189074,189075,189076,189077,189078,189079,189080,189081,189082,189083,189084,189085,189086,189087,189088,189089,189090,189091,189092,189093,189094,189095,189096,189097,189098,189099,189100,189101,189102,189103,189104,189105,189106,189107,189108,189109,189110,189111,189112,189113,189114,189115,189116,189117,189118,189119,189120,189121,189122,189123,189124,189125,189126,189127,189128,189129,189130,189131,189132,189133,189134,189135,189136,189137,189138,189139,189140,189141,189142,189143,189144,189145,189146,189147,189148,189149,189150,189151,189152,189153,189154,189155,189156,189157,189158,189159,189160,189161,189162,189163,189164,189165,189166,189167,189168,189169,189170,189171,189172,189173,189174,189175,189176,189177,189178,189179,189180,189181,189182,189183,189184,189185,189186,189187,189188,189189,189190,189191,189192,189193,189194,189195,189196,189197,189198,189199,189200,189201,189202,189203,189204,189205,189206,189207,189208,189209,189210,189211,189212,189213,189214,189215,189216,189217,189218,189219,189220,189221,189222,189223,189224,189225,189226,189227,189228,189229,189230,189231,189232,189233,189234,189235,189236,189237,189238,189239,189240,189241,189242,189243,189244,189245,189246,189247,189248,189249,189250,189251,189252,189253,189254,189255,189256,189257,189258,189259,189260,189261,189262,189263,189264,189265,189266,189267,189268,189269,189270,189271,189272,189273,189274,189275,189276,189277,189278,189279,189280,189281,189282,189283,189284,189285,189286,189287,189288,189289,189290,189291,189292,189293,189294,189295,189296,189297,189298,189299,189300,189301,189302,189303,189304,189305,189306,189307,189308,189309,189310,189311,189312,189313,189314,189315,189316,189317,189318,189319,189320,189321,189322,189323,189324,189325,189326,189327,189328,189329,189330,189331,189332,189333,189334,189335,189336,189337,189338,189339,189340,189341,189342,189343,189344,189345,189346,189347,189348,189349,189350,189351,189352,189353,189354,189355,189356,189357,189358,189359,189360,189361,189362,189363,189364,189365,189366,189367,189368,189369,189370,189371,189372,189373,189374,189375,189376,189377,189378,189379,189380,189381,189382,189383,189384,189385,189386,189387,189388,189389,189390,189391,189392,189393,189394,189395,189396,189397,189398,189399,189400,189401,189402,189403,189404,189405,189406,189407,189408,189409,189410,189411,189412,189413,189414,189415,189416,189417,189418,189419,189420,189421,189422,189423,189424,189425,189426,189427,189428,189429,189430,189431,189432,189433,189434,189435,189436,189437,189438,189439,189440,189441,189442,189443,189444,189445,189446,189447,189448,189449,189450,189451,189452,189453,189454,189455,189456,189457,189458,189459,189460,189461,189462,189463,189464,189465,189466,189467,189468,189469,189470,189471,189472,189473,189474,189475,189476,189477,189478,189479,189480,189481,189482,189483,189484,189485,189486,189487,189488,189489,189490,189491,189492,189493,189494,189495,189496,189497,189498,189499,189500,189501,189502,189503,189504,189505,189506,189507,189508,189509,189510,189511,189512,189513,189514,189515,189516,189517,189518,189519,189520,189521,189522,189523,189524,189525,189526,189527,189528,189529,189530,189531,189532,189533,189534,189535,189536,189537,189538,189539,189540,189541,189542,189543,189544,189545,189546,189547,189548,189549,189550,189551,189552,189553,189554,189555,189556,189557,189558,189559,189560,189561,189562,189563,189564,189565,189566,189567,189568,189569,189570,189571,189572,189573,189574,189575,189576,189577,189578,189579,189580,189581,189582,189583,189584,189585,189586,189587,189588,189589,189590,189591,189592,189593,189594,189595,189596,189597,189598,189599,189600,189601,189602,189603,189604,189605,189606,189607,189608,189609,189610,189611,189612,189613,189614,189615,189616,189617,189618,189619,189620,189621,189622,189623,189624,189625,189626,189627,189628,189629,189630,189631,189632,189633,189634,189635,189636,189637,189638,189639,189640,189641,189642,189643,189644,189645,189646,189647,189648,189649,189650,189651,189652,189653,189654,189655,189656,189657,189658,189659,189660,189661,189662,189663,189664,189665,189666,189667,189668,189669,189670,189671,189672,189673,189674,189675,189676,189677,189678,189679,189680,189681,189682,189683,189684,189685,189686,189687,189688,189689,189690,189691,189692,189693,189694,189695,189696,189697,189698,189699,189700,189701,189702,189703,189704,189705,189706,189707,189708,189709,189710,189711,189712,189713,189714,189715,189716,189717,189718,189719,189720,189721,189722,189723,189724,189725,189726,189727,189728,189729,189730,189731,189732,189733,189734,189735,189736,189737,189738,189739,189740,189741,189742,189743,189744,189745,189746,189747,189748,189749,189750,189751,189752,189753,189754,189755,189756,189757,189758,189759,189760,189761,189762,189763,189764,189765,189766,189767,189768,189769,189770,189771,189772,189773,189774,189775,189776,189777,189778,189779,189780,189781,189782,189783,189784,189785,189786,189787,189788,189789,189790,189791,189792,189793,189794,189795,189796,189797,189798,189799,189800,189801,189802,189803,189804,189805,189806,189807,189808,189809,189810,189811,189812,189813,189814,189815,189816,189817,189818,189819,189820,189821,189822,189823,189824,189825,189826,189827,189828,189829,189830,189831,189832,189833,189834,189835,189836,189837,189838,189839,189840,189841,189842,189843,189844,189845,189846,189847,189848,189849,189850,189851,189852,189853,189854,189855,189856,189857,189858,189859,189860,189861,189862,189863,189864,189865,189866,189867,189868,189869,189870,189871,189872,189873,189874,189875,189876,189877,189878,189879,189880,189881,189882,189883,189884,189885,189886,189887,189888,189889,189890,189891,189892,189893,189894,189895,189896,189897,189898,189899,189900,189901,189902,189903,189904,189905,189906,189907,189908,189909,189910,189911,189912,189913,189914,189915,189916,189917,189918,189919,189920,189921,189922,189923,189924,189925,189926,189927,189928,189929,189930,189931,189932,189933,189934,189935,189936,189937,189938,189939,189940,189941,189942,189943,189944,189945,189946,189947,189948,189949,189950,189951,189952,189953,189954,189955,189956,189957,189958,189959,189960,189961,189962,189963,189964,189965,189966,189967,189968,189969,189970,189971,189972,189973,189974,189975,189976,189977,189978,189979,189980,189981,189982,189983,189984,189985,189986,189987,189988,189989,189990,189991,189992,189993,189994,189995,189996,189997,189998,189999,190000,190001,190002,190003,190004,190005,190006,190007,190008,190009,190010,190011,190012,190013,190014,190015,190016,190017,190018,190019,190020,190021,190022,190023,190024,190025,190026,190027,190028,190029,190030,190031,190032,190033,190034,190035,190036,190037,190038,190039,190040,190041,190042,190043,190044,190045,190046,190047,190048,190049,190050,190051,190052,190053,190054,190055,190056,190057,190058,190059,190060,190061,190062,190063,190064,190065,190066,190067,190068,190069,190070,190071,190072,190073,190074,190075,190076,190077,190078,190079,190080,190081,190082,190083,190084,190085,190086,190087,190088,190089,190090,190091,190092,190093,190094,190095,190096,190097,190098,190099,190100,190101,190102,190103,190104,190105,190106,190107,190108,190109,190110,190111,190112,190113,190114,190115,190116,190117,190118,190119,190120,190121,190122,190123,190124,190125,190126,190127,190128,190129,190130,190131,190132,190133,190134,190135,190136,190137,190138,190139,190140,190141,190142,190143,190144,190145,190146,190147,190148,190149,190150,190151,190152,190153,190154,190155,190156,190157,190158,190159,190160,190161,190162,190163,190164,190165,190166,190167,190168,190169,190170,190171,190172,190173,190174,190175,190176,190177,190178,190179,190180,190181,190182,190183,190184,190185,190186,190187,190188,190189,190190,190191,190192,190193,190194,190195,190196,190197,190198,190199,190200,190201,190202,190203,190204,190205,190206,190207,190208,190209,190210,190211,190212,190213,190214,190215,190216,190217,190218,190219,190220,190221,190222,190223,190224,190225,190226,190227,190228,190229,190230,190231,190232,190233,190234,190235,190236,190237,190238,190239,190240,190241,190242,190243,190244,190245,190246,190247,190248,190249,190250,190251,190252,190253,190254,190255,190256,190257,190258,190259,190260,190261,190262,190263,190264,190265,190266,190267,190268,190269,190270,190271,190272,190273,190274,190275,190276,190277,190278,190279,190280,190281,190282,190283,190284,190285,190286,190287,190288,190289,190290,190291,190292,190293,190294,190295,190296,190297,190298,190299,190300,190301,190302,190303,190304,190305,190306,190307,190308,190309,190310,190311,190312,190313,190314,190315,190316,190317,190318,190319,190320,190321,190322,190323,190324,190325,190326,190327,190328,190329,190330,190331,190332,190333,190334,190335,190336,190337,190338,190339,190340,190341,190342,190343,190344,190345,190346,190347,190348,190349,190350,190351,190352,190353,190354,190355,190356,190357,190358,190359,190360,190361,190362,190363,190364,190365,190366,190367,190368,190369,190370,190371,190372,190373,190374,190375,190376,190377,190378,190379,190380,190381,190382,190383,190384,190385,190386,190387,190388,190389,190390,190391,190392,190393,190394,190395,190396,190397,190398,190399,190400,190401,190402,190403,190404,190405,190406,190407,190408,190409,190410,190411,190412,190413,190414,190415,190416,190417,190418,190419,190420,190421,190422,190423,190424,190425,190426,190427,190428,190429,190430,190431,190432,190433,190434,190435,190436,190437,190438,190439,190440,190441,190442,190443,190444,190445,190446,190447,190448,190449,190450,190451,190452,190453,190454,190455,190456,190457,190458,190459,190460,190461,190462,190463,190464,190465,190466,190467,190468,190469,190470,190471,190472,190473,190474,190475,190476,190477,190478,190479,190480,190481,190482,190483,190484,190485,190486,190487,190488,190489,190490,190491,190492,190493,190494,190495,190496,190497,190498,190499,190500,190501,190502,190503,190504,190505,190506,190507,190508,190509,190510,190511,190512,190513,190514,190515,190516,190517,190518,190519,190520,190521,190522,190523,190524,190525,190526,190527,190528,190529,190530,190531,190532,190533,190534,190535,190536,190537,190538,190539,190540,190541,190542,190543,190544,190545,190546,190547,190548,190549,190550,190551,190552,190553,190554,190555,190556,190557,190558,190559,190560,190561,190562,190563,190564,190565,190566,190567,190568,190569,190570,190571,190572,190573,190574,190575,190576,190577,190578,190579,190580,190581,190582,190583,190584,190585,190586,190587,190588,190589,190590,190591,190592,190593,190594,190595,190596,190597,190598,190599,190600,190601,190602,190603,190604,190605,190606,190607,190608,190609,190610,190611,190612,190613,190614,190615,190616,190617,190618,190619,190620,190621,190622,190623,190624,190625,190626,190627,190628,190629,190630,190631,190632,190633,190634,190635,190636,190637,190638,190639,190640,190641,190642,190643,190644,190645,190646,190647,190648,190649,190650,190651,190652,190653,190654,190655,190656,190657,190658,190659,190660,190661,190662,190663,190664,190665,190666,190667,190668,190669,190670,190671,190672,190673,190674,190675,190676,190677,190678,190679,190680,190681,190682,190683,190684,190685,190686,190687,190688,190689,190690,190691,190692,190693,190694,190695,190696,190697,190698,190699,190700,190701,190702,190703,190704,190705,190706,190707,190708,190709,190710,190711,190712,190713,190714,190715,190716,190717,190718,190719,190720,190721,190722,190723,190724,190725,190726,190727,190728,190729,190730,190731,190732,190733,190734,190735,190736,190737,190738,190739,190740,190741,190742,190743,190744,190745,190746,190747,190748,190749,190750,190751,190752,190753,190754,190755,190756,190757,190758,190759,190760,190761,190762,190763,190764,190765,190766,190767,190768,190769,190770,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190783,190784,190785,190786,190787,190788,190789,190790,190791,190792,190793,190794,190795,190796,190797,190798,190799,190800,190801,190802,190803,190804,190805,190806,190807,190808,190809,190810,190811,190812,190813,190814,190815,190816,190817,190818,190819,190820,190821,190822,190823,190824,190825,190826,190827,190828,190829,190830,190831,190832,190833,190834,190835,190836,190837,190838,190839,190840,190841,190842,190843,190844,190845,190846,190847,190848,190849,190850,190851,190852,190853,190854,190855,190856,190857,190858,190859,190860,190861,190862,190863,190864,190865,190866,190867,190868,190869,190870,190871,190872,190873,190874,190875,190876,190877,190878,190879,190880,190881,190882,190883,190884,190885,190886,190887,190888,190889,190890,190891,190892,190893,190894,190895,190896,190897,190898,190899,190900,190901,190902,190903,190904,190905,190906,190907,190908,190909,190910,190911,190912,190913,190914,190915,190916,190917,190918,190919,190920,190921,190922,190923,190924,190925,190926,190927,190928,190929,190930,190931,190932,190933,190934,190935,190936,190937,190938,190939,190940,190941,190942,190943,190944,190945,190946,190947,190948,190949,190950,190951,190952,190953,190954,190955,190956,190957,190958,190959,190960,190961,190962,190963,190964,190965,190966,190967,190968,190969,190970,190971,190972,190973,190974,190975,190976,190977,190978,190979,190980,190981,190982,190983,190984,190985,190986,190987,190988,190989,190990,190991,190992,190993,190994,190995,190996,190997,190998,190999,191000,191001,191002,191003,191004,191005,191006,191007,191008,191009,191010,191011,191012,191013,191014,191015,191016,191017,191018,191019,191020,191021,191022,191023,191024,191025,191026,191027,191028,191029,191030,191031,191032,191033,191034,191035,191036,191037,191038,191039,191040,191041,191042,191043,191044,191045,191046,191047,191048,191049,191050,191051,191052,191053,191054,191055,191056,191057,191058,191059,191060,191061,191062,191063,191064,191065,191066,191067,191068,191069,191070,191071,191072,191073,191074,191075,191076,191077,191078,191079,191080,191081,191082,191083,191084,191085,191086,191087,191088,191089,191090,191091,191092,191093,191094,191095,191096,191097,191098,191099,191100,191101,191102,191103,191104,191105,191106,191107,191108,191109,191110,191111,191112,191113,191114,191115,191116,191117,191118,191119,191120,191121,191122,191123,191124,191125,191126,191127,191128,191129,191130,191131,191132,191133,191134,191135,191136,191137,191138,191139,191140,191141,191142,191143,191144,191145,191146,191147,191148,191149,191150,191151,191152,191153,191154,191155,191156,191157,191158,191159,191160,191161,191162,191163,191164,191165,191166,191167,191168,191169,191170,191171,191172,191173,191174,191175,191176,191177,191178,191179,191180,191181,191182,191183,191184,191185,191186,191187,191188,191189,191190,191191,191192,191193,191194,191195,191196,191197,191198,191199,191200,191201,191202,191203,191204,191205,191206,191207,191208,191209,191210,191211,191212,191213,191214,191215,191216,191217,191218,191219,191220,191221,191222,191223,191224,191225,191226,191227,191228,191229,191230,191231,191232,191233,191234,191235,191236,191237,191238,191239,191240,191241,191242,191243,191244,191245,191246,191247,191248,191249,191250,191251,191252,191253,191254,191255,191256,191257,191258,191259,191260,191261,191262,191263,191264,191265,191266,191267,191268,191269,191270,191271,191272,191273,191274,191275,191276,191277,191278,191279,191280,191281,191282,191283,191284,191285,191286,191287,191288,191289,191290,191291,191292,191293,191294,191295,191296,191297,191298,191299,191300,191301,191302,191303,191304,191305,191306,191307,191308,191309,191310,191311,191312,191313,191314,191315,191316,191317,191318,191319,191320,191321,191322,191323,191324,191325,191326,191327,191328,191329,191330,191331,191332,191333,191334,191335,191336,191337,191338,191339,191340,191341,191342,191343,191344,191345,191346,191347,191348,191349,191350,191351,191352,191353,191354,191355,191356,191357,191358,191359,191360,191361,191362,191363,191364,191365,191366,191367,191368,191369,191370,191371,191372,191373,191374,191375,191376,191377,191378,191379,191380,191381,191382,191383,191384,191385,191386,191387,191388,191389,191390,191391,191392,191393,191394,191395,191396,191397,191398,191399,191400,191401,191402,191403,191404,191405,191406,191407,191408,191409,191410,191411,191412,191413,191414,191415,191416,191417,191418,191419,191420,191421,191422,191423,191424,191425,191426,191427,191428,191429,191430,191431,191432,191433,191434,191435,191436,191437,191438,191439,191440,191441,191442,191443,191444,191445,191446,191447,191448,191449,191450,191451,191452,191453,191454,191455,191456,191472,191473,191474,191475,191476,191477,191478,191479,191480,191481,191482,191483,191484,191485,191486,191487,191488,191489,191490,191491,191492,191493,191494,191495,191496,191497,191498,191499,191500,191501,191502,191503,191504,191505,191506,191507,191508,191509,191510,191511,191512,191513,191514,191515,191516,191517,191518,191519,191520,191521,191522,191523,191524,191525,191526,191527,191528,191529,191530,191531,191532,191533,191534,191535,191536,191537,191538,191539,191540,191541,191542,191543,191544,191545,191546,191547,191548,191549,191550,191551,191552,191553,191554,191555,191556,191557,191558,191559,191560,191561,191562,191563,191564,191565,191566,191567,191568,191569,191570,191571,191572,191573,191574,191575,191576,191577,191578,191579,191580,191581,191582,191583,191584,191585,191586,191587,191588,191589,191590,191591,191592,191593,191594,191595,191596,191597,191598,191599,191600,191601,191602,191603,191604,191605,191606,191607,191608,191609,191610,191611,191612,191613,191614,191615,191616,191617,191618,191619,191620,191621,191622,191623,191624,191625,191626,191627,191628,191629,191630,191631,191632,191633,191634,191635,191636,191637,191638,191639,191640,191641,191642,191643,191644,191645,191646,191647,191648,191649,191650,191651,191652,191653,191654,191655,191656,191657,191658,191659,191660,191661,191662,191663,191664,191665,191666,191667,191668,191669,191670,191671,191672,191673,191674,191675,191676,191677,191678,191679,191680,191681,191682,191683,191684,191685,191686,191687,191688,191689,191690,191691,191692,191693,191694,191695,191696,191697,191698,191699,191700,191701,191702,191703,191704,191705,191706,191707,191708,191709,191710,191711,191712,191713,191714,191715,191716,191717,191718,191719,191720,191721,191722,191723,191724,191725,191726,191727,191728,191729,191730,191731,191732,191733,191734,191735,191736,191737,191738,191739,191740,191741,191742,191743,191744,191745,191746,191747,191748,191749,191750,191751,191752,191753,191754,191755,191756,191757,191758,191759,191760,191761,191762,191763,191764,191765,191766,191767,191768,191769,191770,191771,191772,191773,191774,191775,191776,191777,191778,191779,191780,191781,191782,191783,191784,191785,191786,191787,191788,191789,191790,191791,191792,191793,191794,191795,191796,191797,191798,191799,191800,191801,191802,191803,191804,191805,191806,191807,191808,191809,191810,191811,191812,191813,191814,191815,191816,191817,191818,191819,191820,191821,191822,191823,191824,191825,191826,191827,191828,191829,191830,191831,191832,191833,191834,191835,191836,191837,191838,191839,191840,191841,191842,191843,191844,191845,191846,191847,191848,191849,191850,191851,191852,191853,191854,191855,191856,191857,191858,191859,191860,191861,191862,191863,191864,191865,191866,191867,191868,191869,191870,191871,191872,191873,191874,191875,191876,191877,191878,191879,191880,191881,191882,191883,191884,191885,191886,191887,191888,191889,191890,191891,191892,191893,191894,191895,191896,191897,191898,191899,191900,191901,191902,191903,191904,191905,191906,191907,191908,191909,191910,191911,191912,191913,191914,191915,191916,191917,191918,191919,191920,191921,191922,191923,191924,191925,191926,191927,191928,191929,191930,191931,191932,191933,191934,191935,191936,191937,191938,191939,191940,191941,191942,191943,191944,191945,191946,191947,191948,191949,191950,191951,191952,191953,191954,191955,191956,191957,191958,191959,191960,191961,191962,191963,191964,191965,191966,191967,191968,191969,191970,191971,191972,191973,191974,191975,191976,191977,191978,191979,191980,191981,191982,191983,191984,191985,191986,191987,191988,191989,191990,191991,191992,191993,191994,191995,191996,191997,191998,191999,192000,192001,192002,192003,192004,192005,192006,192007,192008,192009,192010,192011,192012,192013,192014,192015,192016,192017,192018,192019,192020,192021,192022,192023,192024,192025,192026,192027,192028,192029,192030,192031,192032,192033,192034,192035,192036,192037,192038,192039,192040,192041,192042,192043,192044,192045,192046,192047,192048,192049,192050,192051,192052,192053,192054,192055,192056,192057,192058,192059,192060,192061,192062,192063,192064,192065,192066,192067,192068,192069,192070,192071,192072,192073,192074,192075,192076,192077,192078,192079,192080,192081,192082,192083,192084,192085,192086,192087,192088,192089,192090,192091,192092,192093,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101,196608,196609,196610,196611,196612,196613,196614,196615,196616,196617,196618,196619,196620,196621,196622,196623,196624,196625,196626,196627,196628,196629,196630,196631,196632,196633,196634,196635,196636,196637,196638,196639,196640,196641,196642,196643,196644,196645,196646,196647,196648,196649,196650,196651,196652,196653,196654,196655,196656,196657,196658,196659,196660,196661,196662,196663,196664,196665,196666,196667,196668,196669,196670,196671,196672,196673,196674,196675,196676,196677,196678,196679,196680,196681,196682,196683,196684,196685,196686,196687,196688,196689,196690,196691,196692,196693,196694,196695,196696,196697,196698,196699,196700,196701,196702,196703,196704,196705,196706,196707,196708,196709,196710,196711,196712,196713,196714,196715,196716,196717,196718,196719,196720,196721,196722,196723,196724,196725,196726,196727,196728,196729,196730,196731,196732,196733,196734,196735,196736,196737,196738,196739,196740,196741,196742,196743,196744,196745,196746,196747,196748,196749,196750,196751,196752,196753,196754,196755,196756,196757,196758,196759,196760,196761,196762,196763,196764,196765,196766,196767,196768,196769,196770,196771,196772,196773,196774,196775,196776,196777,196778,196779,196780,196781,196782,196783,196784,196785,196786,196787,196788,196789,196790,196791,196792,196793,196794,196795,196796,196797,196798,196799,196800,196801,196802,196803,196804,196805,196806,196807,196808,196809,196810,196811,196812,196813,196814,196815,196816,196817,196818,196819,196820,196821,196822,196823,196824,196825,196826,196827,196828,196829,196830,196831,196832,196833,196834,196835,196836,196837,196838,196839,196840,196841,196842,196843,196844,196845,196846,196847,196848,196849,196850,196851,196852,196853,196854,196855,196856,196857,196858,196859,196860,196861,196862,196863,196864,196865,196866,196867,196868,196869,196870,196871,196872,196873,196874,196875,196876,196877,196878,196879,196880,196881,196882,196883,196884,196885,196886,196887,196888,196889,196890,196891,196892,196893,196894,196895,196896,196897,196898,196899,196900,196901,196902,196903,196904,196905,196906,196907,196908,196909,196910,196911,196912,196913,196914,196915,196916,196917,196918,196919,196920,196921,196922,196923,196924,196925,196926,196927,196928,196929,196930,196931,196932,196933,196934,196935,196936,196937,196938,196939,196940,196941,196942,196943,196944,196945,196946,196947,196948,196949,196950,196951,196952,196953,196954,196955,196956,196957,196958,196959,196960,196961,196962,196963,196964,196965,196966,196967,196968,196969,196970,196971,196972,196973,196974,196975,196976,196977,196978,196979,196980,196981,196982,196983,196984,196985,196986,196987,196988,196989,196990,196991,196992,196993,196994,196995,196996,196997,196998,196999,197000,197001,197002,197003,197004,197005,197006,197007,197008,197009,197010,197011,197012,197013,197014,197015,197016,197017,197018,197019,197020,197021,197022,197023,197024,197025,197026,197027,197028,197029,197030,197031,197032,197033,197034,197035,197036,197037,197038,197039,197040,197041,197042,197043,197044,197045,197046,197047,197048,197049,197050,197051,197052,197053,197054,197055,197056,197057,197058,197059,197060,197061,197062,197063,197064,197065,197066,197067,197068,197069,197070,197071,197072,197073,197074,197075,197076,197077,197078,197079,197080,197081,197082,197083,197084,197085,197086,197087,197088,197089,197090,197091,197092,197093,197094,197095,197096,197097,197098,197099,197100,197101,197102,197103,197104,197105,197106,197107,197108,197109,197110,197111,197112,197113,197114,197115,197116,197117,197118,197119,197120,197121,197122,197123,197124,197125,197126,197127,197128,197129,197130,197131,197132,197133,197134,197135,197136,197137,197138,197139,197140,197141,197142,197143,197144,197145,197146,197147,197148,197149,197150,197151,197152,197153,197154,197155,197156,197157,197158,197159,197160,197161,197162,197163,197164,197165,197166,197167,197168,197169,197170,197171,197172,197173,197174,197175,197176,197177,197178,197179,197180,197181,197182,197183,197184,197185,197186,197187,197188,197189,197190,197191,197192,197193,197194,197195,197196,197197,197198,197199,197200,197201,197202,197203,197204,197205,197206,197207,197208,197209,197210,197211,197212,197213,197214,197215,197216,197217,197218,197219,197220,197221,197222,197223,197224,197225,197226,197227,197228,197229,197230,197231,197232,197233,197234,197235,197236,197237,197238,197239,197240,197241,197242,197243,197244,197245,197246,197247,197248,197249,197250,197251,197252,197253,197254,197255,197256,197257,197258,197259,197260,197261,197262,197263,197264,197265,197266,197267,197268,197269,197270,197271,197272,197273,197274,197275,197276,197277,197278,197279,197280,197281,197282,197283,197284,197285,197286,197287,197288,197289,197290,197291,197292,197293,197294,197295,197296,197297,197298,197299,197300,197301,197302,197303,197304,197305,197306,197307,197308,197309,197310,197311,197312,197313,197314,197315,197316,197317,197318,197319,197320,197321,197322,197323,197324,197325,197326,197327,197328,197329,197330,197331,197332,197333,197334,197335,197336,197337,197338,197339,197340,197341,197342,197343,197344,197345,197346,197347,197348,197349,197350,197351,197352,197353,197354,197355,197356,197357,197358,197359,197360,197361,197362,197363,197364,197365,197366,197367,197368,197369,197370,197371,197372,197373,197374,197375,197376,197377,197378,197379,197380,197381,197382,197383,197384,197385,197386,197387,197388,197389,197390,197391,197392,197393,197394,197395,197396,197397,197398,197399,197400,197401,197402,197403,197404,197405,197406,197407,197408,197409,197410,197411,197412,197413,197414,197415,197416,197417,197418,197419,197420,197421,197422,197423,197424,197425,197426,197427,197428,197429,197430,197431,197432,197433,197434,197435,197436,197437,197438,197439,197440,197441,197442,197443,197444,197445,197446,197447,197448,197449,197450,197451,197452,197453,197454,197455,197456,197457,197458,197459,197460,197461,197462,197463,197464,197465,197466,197467,197468,197469,197470,197471,197472,197473,197474,197475,197476,197477,197478,197479,197480,197481,197482,197483,197484,197485,197486,197487,197488,197489,197490,197491,197492,197493,197494,197495,197496,197497,197498,197499,197500,197501,197502,197503,197504,197505,197506,197507,197508,197509,197510,197511,197512,197513,197514,197515,197516,197517,197518,197519,197520,197521,197522,197523,197524,197525,197526,197527,197528,197529,197530,197531,197532,197533,197534,197535,197536,197537,197538,197539,197540,197541,197542,197543,197544,197545,197546,197547,197548,197549,197550,197551,197552,197553,197554,197555,197556,197557,197558,197559,197560,197561,197562,197563,197564,197565,197566,197567,197568,197569,197570,197571,197572,197573,197574,197575,197576,197577,197578,197579,197580,197581,197582,197583,197584,197585,197586,197587,197588,197589,197590,197591,197592,197593,197594,197595,197596,197597,197598,197599,197600,197601,197602,197603,197604,197605,197606,197607,197608,197609,197610,197611,197612,197613,197614,197615,197616,197617,197618,197619,197620,197621,197622,197623,197624,197625,197626,197627,197628,197629,197630,197631,197632,197633,197634,197635,197636,197637,197638,197639,197640,197641,197642,197643,197644,197645,197646,197647,197648,197649,197650,197651,197652,197653,197654,197655,197656,197657,197658,197659,197660,197661,197662,197663,197664,197665,197666,197667,197668,197669,197670,197671,197672,197673,197674,197675,197676,197677,197678,197679,197680,197681,197682,197683,197684,197685,197686,197687,197688,197689,197690,197691,197692,197693,197694,197695,197696,197697,197698,197699,197700,197701,197702,197703,197704,197705,197706,197707,197708,197709,197710,197711,197712,197713,197714,197715,197716,197717,197718,197719,197720,197721,197722,197723,197724,197725,197726,197727,197728,197729,197730,197731,197732,197733,197734,197735,197736,197737,197738,197739,197740,197741,197742,197743,197744,197745,197746,197747,197748,197749,197750,197751,197752,197753,197754,197755,197756,197757,197758,197759,197760,197761,197762,197763,197764,197765,197766,197767,197768,197769,197770,197771,197772,197773,197774,197775,197776,197777,197778,197779,197780,197781,197782,197783,197784,197785,197786,197787,197788,197789,197790,197791,197792,197793,197794,197795,197796,197797,197798,197799,197800,197801,197802,197803,197804,197805,197806,197807,197808,197809,197810,197811,197812,197813,197814,197815,197816,197817,197818,197819,197820,197821,197822,197823,197824,197825,197826,197827,197828,197829,197830,197831,197832,197833,197834,197835,197836,197837,197838,197839,197840,197841,197842,197843,197844,197845,197846,197847,197848,197849,197850,197851,197852,197853,197854,197855,197856,197857,197858,197859,197860,197861,197862,197863,197864,197865,197866,197867,197868,197869,197870,197871,197872,197873,197874,197875,197876,197877,197878,197879,197880,197881,197882,197883,197884,197885,197886,197887,197888,197889,197890,197891,197892,197893,197894,197895,197896,197897,197898,197899,197900,197901,197902,197903,197904,197905,197906,197907,197908,197909,197910,197911,197912,197913,197914,197915,197916,197917,197918,197919,197920,197921,197922,197923,197924,197925,197926,197927,197928,197929,197930,197931,197932,197933,197934,197935,197936,197937,197938,197939,197940,197941,197942,197943,197944,197945,197946,197947,197948,197949,197950,197951,197952,197953,197954,197955,197956,197957,197958,197959,197960,197961,197962,197963,197964,197965,197966,197967,197968,197969,197970,197971,197972,197973,197974,197975,197976,197977,197978,197979,197980,197981,197982,197983,197984,197985,197986,197987,197988,197989,197990,197991,197992,197993,197994,197995,197996,197997,197998,197999,198000,198001,198002,198003,198004,198005,198006,198007,198008,198009,198010,198011,198012,198013,198014,198015,198016,198017,198018,198019,198020,198021,198022,198023,198024,198025,198026,198027,198028,198029,198030,198031,198032,198033,198034,198035,198036,198037,198038,198039,198040,198041,198042,198043,198044,198045,198046,198047,198048,198049,198050,198051,198052,198053,198054,198055,198056,198057,198058,198059,198060,198061,198062,198063,198064,198065,198066,198067,198068,198069,198070,198071,198072,198073,198074,198075,198076,198077,198078,198079,198080,198081,198082,198083,198084,198085,198086,198087,198088,198089,198090,198091,198092,198093,198094,198095,198096,198097,198098,198099,198100,198101,198102,198103,198104,198105,198106,198107,198108,198109,198110,198111,198112,198113,198114,198115,198116,198117,198118,198119,198120,198121,198122,198123,198124,198125,198126,198127,198128,198129,198130,198131,198132,198133,198134,198135,198136,198137,198138,198139,198140,198141,198142,198143,198144,198145,198146,198147,198148,198149,198150,198151,198152,198153,198154,198155,198156,198157,198158,198159,198160,198161,198162,198163,198164,198165,198166,198167,198168,198169,198170,198171,198172,198173,198174,198175,198176,198177,198178,198179,198180,198181,198182,198183,198184,198185,198186,198187,198188,198189,198190,198191,198192,198193,198194,198195,198196,198197,198198,198199,198200,198201,198202,198203,198204,198205,198206,198207,198208,198209,198210,198211,198212,198213,198214,198215,198216,198217,198218,198219,198220,198221,198222,198223,198224,198225,198226,198227,198228,198229,198230,198231,198232,198233,198234,198235,198236,198237,198238,198239,198240,198241,198242,198243,198244,198245,198246,198247,198248,198249,198250,198251,198252,198253,198254,198255,198256,198257,198258,198259,198260,198261,198262,198263,198264,198265,198266,198267,198268,198269,198270,198271,198272,198273,198274,198275,198276,198277,198278,198279,198280,198281,198282,198283,198284,198285,198286,198287,198288,198289,198290,198291,198292,198293,198294,198295,198296,198297,198298,198299,198300,198301,198302,198303,198304,198305,198306,198307,198308,198309,198310,198311,198312,198313,198314,198315,198316,198317,198318,198319,198320,198321,198322,198323,198324,198325,198326,198327,198328,198329,198330,198331,198332,198333,198334,198335,198336,198337,198338,198339,198340,198341,198342,198343,198344,198345,198346,198347,198348,198349,198350,198351,198352,198353,198354,198355,198356,198357,198358,198359,198360,198361,198362,198363,198364,198365,198366,198367,198368,198369,198370,198371,198372,198373,198374,198375,198376,198377,198378,198379,198380,198381,198382,198383,198384,198385,198386,198387,198388,198389,198390,198391,198392,198393,198394,198395,198396,198397,198398,198399,198400,198401,198402,198403,198404,198405,198406,198407,198408,198409,198410,198411,198412,198413,198414,198415,198416,198417,198418,198419,198420,198421,198422,198423,198424,198425,198426,198427,198428,198429,198430,198431,198432,198433,198434,198435,198436,198437,198438,198439,198440,198441,198442,198443,198444,198445,198446,198447,198448,198449,198450,198451,198452,198453,198454,198455,198456,198457,198458,198459,198460,198461,198462,198463,198464,198465,198466,198467,198468,198469,198470,198471,198472,198473,198474,198475,198476,198477,198478,198479,198480,198481,198482,198483,198484,198485,198486,198487,198488,198489,198490,198491,198492,198493,198494,198495,198496,198497,198498,198499,198500,198501,198502,198503,198504,198505,198506,198507,198508,198509,198510,198511,198512,198513,198514,198515,198516,198517,198518,198519,198520,198521,198522,198523,198524,198525,198526,198527,198528,198529,198530,198531,198532,198533,198534,198535,198536,198537,198538,198539,198540,198541,198542,198543,198544,198545,198546,198547,198548,198549,198550,198551,198552,198553,198554,198555,198556,198557,198558,198559,198560,198561,198562,198563,198564,198565,198566,198567,198568,198569,198570,198571,198572,198573,198574,198575,198576,198577,198578,198579,198580,198581,198582,198583,198584,198585,198586,198587,198588,198589,198590,198591,198592,198593,198594,198595,198596,198597,198598,198599,198600,198601,198602,198603,198604,198605,198606,198607,198608,198609,198610,198611,198612,198613,198614,198615,198616,198617,198618,198619,198620,198621,198622,198623,198624,198625,198626,198627,198628,198629,198630,198631,198632,198633,198634,198635,198636,198637,198638,198639,198640,198641,198642,198643,198644,198645,198646,198647,198648,198649,198650,198651,198652,198653,198654,198655,198656,198657,198658,198659,198660,198661,198662,198663,198664,198665,198666,198667,198668,198669,198670,198671,198672,198673,198674,198675,198676,198677,198678,198679,198680,198681,198682,198683,198684,198685,198686,198687,198688,198689,198690,198691,198692,198693,198694,198695,198696,198697,198698,198699,198700,198701,198702,198703,198704,198705,198706,198707,198708,198709,198710,198711,198712,198713,198714,198715,198716,198717,198718,198719,198720,198721,198722,198723,198724,198725,198726,198727,198728,198729,198730,198731,198732,198733,198734,198735,198736,198737,198738,198739,198740,198741,198742,198743,198744,198745,198746,198747,198748,198749,198750,198751,198752,198753,198754,198755,198756,198757,198758,198759,198760,198761,198762,198763,198764,198765,198766,198767,198768,198769,198770,198771,198772,198773,198774,198775,198776,198777,198778,198779,198780,198781,198782,198783,198784,198785,198786,198787,198788,198789,198790,198791,198792,198793,198794,198795,198796,198797,198798,198799,198800,198801,198802,198803,198804,198805,198806,198807,198808,198809,198810,198811,198812,198813,198814,198815,198816,198817,198818,198819,198820,198821,198822,198823,198824,198825,198826,198827,198828,198829,198830,198831,198832,198833,198834,198835,198836,198837,198838,198839,198840,198841,198842,198843,198844,198845,198846,198847,198848,198849,198850,198851,198852,198853,198854,198855,198856,198857,198858,198859,198860,198861,198862,198863,198864,198865,198866,198867,198868,198869,198870,198871,198872,198873,198874,198875,198876,198877,198878,198879,198880,198881,198882,198883,198884,198885,198886,198887,198888,198889,198890,198891,198892,198893,198894,198895,198896,198897,198898,198899,198900,198901,198902,198903,198904,198905,198906,198907,198908,198909,198910,198911,198912,198913,198914,198915,198916,198917,198918,198919,198920,198921,198922,198923,198924,198925,198926,198927,198928,198929,198930,198931,198932,198933,198934,198935,198936,198937,198938,198939,198940,198941,198942,198943,198944,198945,198946,198947,198948,198949,198950,198951,198952,198953,198954,198955,198956,198957,198958,198959,198960,198961,198962,198963,198964,198965,198966,198967,198968,198969,198970,198971,198972,198973,198974,198975,198976,198977,198978,198979,198980,198981,198982,198983,198984,198985,198986,198987,198988,198989,198990,198991,198992,198993,198994,198995,198996,198997,198998,198999,199000,199001,199002,199003,199004,199005,199006,199007,199008,199009,199010,199011,199012,199013,199014,199015,199016,199017,199018,199019,199020,199021,199022,199023,199024,199025,199026,199027,199028,199029,199030,199031,199032,199033,199034,199035,199036,199037,199038,199039,199040,199041,199042,199043,199044,199045,199046,199047,199048,199049,199050,199051,199052,199053,199054,199055,199056,199057,199058,199059,199060,199061,199062,199063,199064,199065,199066,199067,199068,199069,199070,199071,199072,199073,199074,199075,199076,199077,199078,199079,199080,199081,199082,199083,199084,199085,199086,199087,199088,199089,199090,199091,199092,199093,199094,199095,199096,199097,199098,199099,199100,199101,199102,199103,199104,199105,199106,199107,199108,199109,199110,199111,199112,199113,199114,199115,199116,199117,199118,199119,199120,199121,199122,199123,199124,199125,199126,199127,199128,199129,199130,199131,199132,199133,199134,199135,199136,199137,199138,199139,199140,199141,199142,199143,199144,199145,199146,199147,199148,199149,199150,199151,199152,199153,199154,199155,199156,199157,199158,199159,199160,199161,199162,199163,199164,199165,199166,199167,199168,199169,199170,199171,199172,199173,199174,199175,199176,199177,199178,199179,199180,199181,199182,199183,199184,199185,199186,199187,199188,199189,199190,199191,199192,199193,199194,199195,199196,199197,199198,199199,199200,199201,199202,199203,199204,199205,199206,199207,199208,199209,199210,199211,199212,199213,199214,199215,199216,199217,199218,199219,199220,199221,199222,199223,199224,199225,199226,199227,199228,199229,199230,199231,199232,199233,199234,199235,199236,199237,199238,199239,199240,199241,199242,199243,199244,199245,199246,199247,199248,199249,199250,199251,199252,199253,199254,199255,199256,199257,199258,199259,199260,199261,199262,199263,199264,199265,199266,199267,199268,199269,199270,199271,199272,199273,199274,199275,199276,199277,199278,199279,199280,199281,199282,199283,199284,199285,199286,199287,199288,199289,199290,199291,199292,199293,199294,199295,199296,199297,199298,199299,199300,199301,199302,199303,199304,199305,199306,199307,199308,199309,199310,199311,199312,199313,199314,199315,199316,199317,199318,199319,199320,199321,199322,199323,199324,199325,199326,199327,199328,199329,199330,199331,199332,199333,199334,199335,199336,199337,199338,199339,199340,199341,199342,199343,199344,199345,199346,199347,199348,199349,199350,199351,199352,199353,199354,199355,199356,199357,199358,199359,199360,199361,199362,199363,199364,199365,199366,199367,199368,199369,199370,199371,199372,199373,199374,199375,199376,199377,199378,199379,199380,199381,199382,199383,199384,199385,199386,199387,199388,199389,199390,199391,199392,199393,199394,199395,199396,199397,199398,199399,199400,199401,199402,199403,199404,199405,199406,199407,199408,199409,199410,199411,199412,199413,199414,199415,199416,199417,199418,199419,199420,199421,199422,199423,199424,199425,199426,199427,199428,199429,199430,199431,199432,199433,199434,199435,199436,199437,199438,199439,199440,199441,199442,199443,199444,199445,199446,199447,199448,199449,199450,199451,199452,199453,199454,199455,199456,199457,199458,199459,199460,199461,199462,199463,199464,199465,199466,199467,199468,199469,199470,199471,199472,199473,199474,199475,199476,199477,199478,199479,199480,199481,199482,199483,199484,199485,199486,199487,199488,199489,199490,199491,199492,199493,199494,199495,199496,199497,199498,199499,199500,199501,199502,199503,199504,199505,199506,199507,199508,199509,199510,199511,199512,199513,199514,199515,199516,199517,199518,199519,199520,199521,199522,199523,199524,199525,199526,199527,199528,199529,199530,199531,199532,199533,199534,199535,199536,199537,199538,199539,199540,199541,199542,199543,199544,199545,199546,199547,199548,199549,199550,199551,199552,199553,199554,199555,199556,199557,199558,199559,199560,199561,199562,199563,199564,199565,199566,199567,199568,199569,199570,199571,199572,199573,199574,199575,199576,199577,199578,199579,199580,199581,199582,199583,199584,199585,199586,199587,199588,199589,199590,199591,199592,199593,199594,199595,199596,199597,199598,199599,199600,199601,199602,199603,199604,199605,199606,199607,199608,199609,199610,199611,199612,199613,199614,199615,199616,199617,199618,199619,199620,199621,199622,199623,199624,199625,199626,199627,199628,199629,199630,199631,199632,199633,199634,199635,199636,199637,199638,199639,199640,199641,199642,199643,199644,199645,199646,199647,199648,199649,199650,199651,199652,199653,199654,199655,199656,199657,199658,199659,199660,199661,199662,199663,199664,199665,199666,199667,199668,199669,199670,199671,199672,199673,199674,199675,199676,199677,199678,199679,199680,199681,199682,199683,199684,199685,199686,199687,199688,199689,199690,199691,199692,199693,199694,199695,199696,199697,199698,199699,199700,199701,199702,199703,199704,199705,199706,199707,199708,199709,199710,199711,199712,199713,199714,199715,199716,199717,199718,199719,199720,199721,199722,199723,199724,199725,199726,199727,199728,199729,199730,199731,199732,199733,199734,199735,199736,199737,199738,199739,199740,199741,199742,199743,199744,199745,199746,199747,199748,199749,199750,199751,199752,199753,199754,199755,199756,199757,199758,199759,199760,199761,199762,199763,199764,199765,199766,199767,199768,199769,199770,199771,199772,199773,199774,199775,199776,199777,199778,199779,199780,199781,199782,199783,199784,199785,199786,199787,199788,199789,199790,199791,199792,199793,199794,199795,199796,199797,199798,199799,199800,199801,199802,199803,199804,199805,199806,199807,199808,199809,199810,199811,199812,199813,199814,199815,199816,199817,199818,199819,199820,199821,199822,199823,199824,199825,199826,199827,199828,199829,199830,199831,199832,199833,199834,199835,199836,199837,199838,199839,199840,199841,199842,199843,199844,199845,199846,199847,199848,199849,199850,199851,199852,199853,199854,199855,199856,199857,199858,199859,199860,199861,199862,199863,199864,199865,199866,199867,199868,199869,199870,199871,199872,199873,199874,199875,199876,199877,199878,199879,199880,199881,199882,199883,199884,199885,199886,199887,199888,199889,199890,199891,199892,199893,199894,199895,199896,199897,199898,199899,199900,199901,199902,199903,199904,199905,199906,199907,199908,199909,199910,199911,199912,199913,199914,199915,199916,199917,199918,199919,199920,199921,199922,199923,199924,199925,199926,199927,199928,199929,199930,199931,199932,199933,199934,199935,199936,199937,199938,199939,199940,199941,199942,199943,199944,199945,199946,199947,199948,199949,199950,199951,199952,199953,199954,199955,199956,199957,199958,199959,199960,199961,199962,199963,199964,199965,199966,199967,199968,199969,199970,199971,199972,199973,199974,199975,199976,199977,199978,199979,199980,199981,199982,199983,199984,199985,199986,199987,199988,199989,199990,199991,199992,199993,199994,199995,199996,199997,199998,199999,200000,200001,200002,200003,200004,200005,200006,200007,200008,200009,200010,200011,200012,200013,200014,200015,200016,200017,200018,200019,200020,200021,200022,200023,200024,200025,200026,200027,200028,200029,200030,200031,200032,200033,200034,200035,200036,200037,200038,200039,200040,200041,200042,200043,200044,200045,200046,200047,200048,200049,200050,200051,200052,200053,200054,200055,200056,200057,200058,200059,200060,200061,200062,200063,200064,200065,200066,200067,200068,200069,200070,200071,200072,200073,200074,200075,200076,200077,200078,200079,200080,200081,200082,200083,200084,200085,200086,200087,200088,200089,200090,200091,200092,200093,200094,200095,200096,200097,200098,200099,200100,200101,200102,200103,200104,200105,200106,200107,200108,200109,200110,200111,200112,200113,200114,200115,200116,200117,200118,200119,200120,200121,200122,200123,200124,200125,200126,200127,200128,200129,200130,200131,200132,200133,200134,200135,200136,200137,200138,200139,200140,200141,200142,200143,200144,200145,200146,200147,200148,200149,200150,200151,200152,200153,200154,200155,200156,200157,200158,200159,200160,200161,200162,200163,200164,200165,200166,200167,200168,200169,200170,200171,200172,200173,200174,200175,200176,200177,200178,200179,200180,200181,200182,200183,200184,200185,200186,200187,200188,200189,200190,200191,200192,200193,200194,200195,200196,200197,200198,200199,200200,200201,200202,200203,200204,200205,200206,200207,200208,200209,200210,200211,200212,200213,200214,200215,200216,200217,200218,200219,200220,200221,200222,200223,200224,200225,200226,200227,200228,200229,200230,200231,200232,200233,200234,200235,200236,200237,200238,200239,200240,200241,200242,200243,200244,200245,200246,200247,200248,200249,200250,200251,200252,200253,200254,200255,200256,200257,200258,200259,200260,200261,200262,200263,200264,200265,200266,200267,200268,200269,200270,200271,200272,200273,200274,200275,200276,200277,200278,200279,200280,200281,200282,200283,200284,200285,200286,200287,200288,200289,200290,200291,200292,200293,200294,200295,200296,200297,200298,200299,200300,200301,200302,200303,200304,200305,200306,200307,200308,200309,200310,200311,200312,200313,200314,200315,200316,200317,200318,200319,200320,200321,200322,200323,200324,200325,200326,200327,200328,200329,200330,200331,200332,200333,200334,200335,200336,200337,200338,200339,200340,200341,200342,200343,200344,200345,200346,200347,200348,200349,200350,200351,200352,200353,200354,200355,200356,200357,200358,200359,200360,200361,200362,200363,200364,200365,200366,200367,200368,200369,200370,200371,200372,200373,200374,200375,200376,200377,200378,200379,200380,200381,200382,200383,200384,200385,200386,200387,200388,200389,200390,200391,200392,200393,200394,200395,200396,200397,200398,200399,200400,200401,200402,200403,200404,200405,200406,200407,200408,200409,200410,200411,200412,200413,200414,200415,200416,200417,200418,200419,200420,200421,200422,200423,200424,200425,200426,200427,200428,200429,200430,200431,200432,200433,200434,200435,200436,200437,200438,200439,200440,200441,200442,200443,200444,200445,200446,200447,200448,200449,200450,200451,200452,200453,200454,200455,200456,200457,200458,200459,200460,200461,200462,200463,200464,200465,200466,200467,200468,200469,200470,200471,200472,200473,200474,200475,200476,200477,200478,200479,200480,200481,200482,200483,200484,200485,200486,200487,200488,200489,200490,200491,200492,200493,200494,200495,200496,200497,200498,200499,200500,200501,200502,200503,200504,200505,200506,200507,200508,200509,200510,200511,200512,200513,200514,200515,200516,200517,200518,200519,200520,200521,200522,200523,200524,200525,200526,200527,200528,200529,200530,200531,200532,200533,200534,200535,200536,200537,200538,200539,200540,200541,200542,200543,200544,200545,200546,200547,200548,200549,200550,200551,200552,200553,200554,200555,200556,200557,200558,200559,200560,200561,200562,200563,200564,200565,200566,200567,200568,200569,200570,200571,200572,200573,200574,200575,200576,200577,200578,200579,200580,200581,200582,200583,200584,200585,200586,200587,200588,200589,200590,200591,200592,200593,200594,200595,200596,200597,200598,200599,200600,200601,200602,200603,200604,200605,200606,200607,200608,200609,200610,200611,200612,200613,200614,200615,200616,200617,200618,200619,200620,200621,200622,200623,200624,200625,200626,200627,200628,200629,200630,200631,200632,200633,200634,200635,200636,200637,200638,200639,200640,200641,200642,200643,200644,200645,200646,200647,200648,200649,200650,200651,200652,200653,200654,200655,200656,200657,200658,200659,200660,200661,200662,200663,200664,200665,200666,200667,200668,200669,200670,200671,200672,200673,200674,200675,200676,200677,200678,200679,200680,200681,200682,200683,200684,200685,200686,200687,200688,200689,200690,200691,200692,200693,200694,200695,200696,200697,200698,200699,200700,200701,200702,200703,200704,200705,200706,200707,200708,200709,200710,200711,200712,200713,200714,200715,200716,200717,200718,200719,200720,200721,200722,200723,200724,200725,200726,200727,200728,200729,200730,200731,200732,200733,200734,200735,200736,200737,200738,200739,200740,200741,200742,200743,200744,200745,200746,200747,200748,200749,200750,200751,200752,200753,200754,200755,200756,200757,200758,200759,200760,200761,200762,200763,200764,200765,200766,200767,200768,200769,200770,200771,200772,200773,200774,200775,200776,200777,200778,200779,200780,200781,200782,200783,200784,200785,200786,200787,200788,200789,200790,200791,200792,200793,200794,200795,200796,200797,200798,200799,200800,200801,200802,200803,200804,200805,200806,200807,200808,200809,200810,200811,200812,200813,200814,200815,200816,200817,200818,200819,200820,200821,200822,200823,200824,200825,200826,200827,200828,200829,200830,200831,200832,200833,200834,200835,200836,200837,200838,200839,200840,200841,200842,200843,200844,200845,200846,200847,200848,200849,200850,200851,200852,200853,200854,200855,200856,200857,200858,200859,200860,200861,200862,200863,200864,200865,200866,200867,200868,200869,200870,200871,200872,200873,200874,200875,200876,200877,200878,200879,200880,200881,200882,200883,200884,200885,200886,200887,200888,200889,200890,200891,200892,200893,200894,200895,200896,200897,200898,200899,200900,200901,200902,200903,200904,200905,200906,200907,200908,200909,200910,200911,200912,200913,200914,200915,200916,200917,200918,200919,200920,200921,200922,200923,200924,200925,200926,200927,200928,200929,200930,200931,200932,200933,200934,200935,200936,200937,200938,200939,200940,200941,200942,200943,200944,200945,200946,200947,200948,200949,200950,200951,200952,200953,200954,200955,200956,200957,200958,200959,200960,200961,200962,200963,200964,200965,200966,200967,200968,200969,200970,200971,200972,200973,200974,200975,200976,200977,200978,200979,200980,200981,200982,200983,200984,200985,200986,200987,200988,200989,200990,200991,200992,200993,200994,200995,200996,200997,200998,200999,201000,201001,201002,201003,201004,201005,201006,201007,201008,201009,201010,201011,201012,201013,201014,201015,201016,201017,201018,201019,201020,201021,201022,201023,201024,201025,201026,201027,201028,201029,201030,201031,201032,201033,201034,201035,201036,201037,201038,201039,201040,201041,201042,201043,201044,201045,201046,201047,201048,201049,201050,201051,201052,201053,201054,201055,201056,201057,201058,201059,201060,201061,201062,201063,201064,201065,201066,201067,201068,201069,201070,201071,201072,201073,201074,201075,201076,201077,201078,201079,201080,201081,201082,201083,201084,201085,201086,201087,201088,201089,201090,201091,201092,201093,201094,201095,201096,201097,201098,201099,201100,201101,201102,201103,201104,201105,201106,201107,201108,201109,201110,201111,201112,201113,201114,201115,201116,201117,201118,201119,201120,201121,201122,201123,201124,201125,201126,201127,201128,201129,201130,201131,201132,201133,201134,201135,201136,201137,201138,201139,201140,201141,201142,201143,201144,201145,201146,201147,201148,201149,201150,201151,201152,201153,201154,201155,201156,201157,201158,201159,201160,201161,201162,201163,201164,201165,201166,201167,201168,201169,201170,201171,201172,201173,201174,201175,201176,201177,201178,201179,201180,201181,201182,201183,201184,201185,201186,201187,201188,201189,201190,201191,201192,201193,201194,201195,201196,201197,201198,201199,201200,201201,201202,201203,201204,201205,201206,201207,201208,201209,201210,201211,201212,201213,201214,201215,201216,201217,201218,201219,201220,201221,201222,201223,201224,201225,201226,201227,201228,201229,201230,201231,201232,201233,201234,201235,201236,201237,201238,201239,201240,201241,201242,201243,201244,201245,201246,201247,201248,201249,201250,201251,201252,201253,201254,201255,201256,201257,201258,201259,201260,201261,201262,201263,201264,201265,201266,201267,201268,201269,201270,201271,201272,201273,201274,201275,201276,201277,201278,201279,201280,201281,201282,201283,201284,201285,201286,201287,201288,201289,201290,201291,201292,201293,201294,201295,201296,201297,201298,201299,201300,201301,201302,201303,201304,201305,201306,201307,201308,201309,201310,201311,201312,201313,201314,201315,201316,201317,201318,201319,201320,201321,201322,201323,201324,201325,201326,201327,201328,201329,201330,201331,201332,201333,201334,201335,201336,201337,201338,201339,201340,201341,201342,201343,201344,201345,201346,201347,201348,201349,201350,201351,201352,201353,201354,201355,201356,201357,201358,201359,201360,201361,201362,201363,201364,201365,201366,201367,201368,201369,201370,201371,201372,201373,201374,201375,201376,201377,201378,201379,201380,201381,201382,201383,201384,201385,201386,201387,201388,201389,201390,201391,201392,201393,201394,201395,201396,201397,201398,201399,201400,201401,201402,201403,201404,201405,201406,201407,201408,201409,201410,201411,201412,201413,201414,201415,201416,201417,201418,201419,201420,201421,201422,201423,201424,201425,201426,201427,201428,201429,201430,201431,201432,201433,201434,201435,201436,201437,201438,201439,201440,201441,201442,201443,201444,201445,201446,201447,201448,201449,201450,201451,201452,201453,201454,201455,201456,201457,201458,201459,201460,201461,201462,201463,201464,201465,201466,201467,201468,201469,201470,201471,201472,201473,201474,201475,201476,201477,201478,201479,201480,201481,201482,201483,201484,201485,201486,201487,201488,201489,201490,201491,201492,201493,201494,201495,201496,201497,201498,201499,201500,201501,201502,201503,201504,201505,201506,201507,201508,201509,201510,201511,201512,201513,201514,201515,201516,201517,201518,201519,201520,201521,201522,201523,201524,201525,201526,201527,201528,201529,201530,201531,201532,201533,201534,201535,201536,201537,201538,201539,201540,201541,201542,201543,201544,201545,201546,201552,201553,201554,201555,201556,201557,201558,201559,201560,201561,201562,201563,201564,201565,201566,201567,201568,201569,201570,201571,201572,201573,201574,201575,201576,201577,201578,201579,201580,201581,201582,201583,201584,201585,201586,201587,201588,201589,201590,201591,201592,201593,201594,201595,201596,201597,201598,201599,201600,201601,201602,201603,201604,201605,201606,201607,201608,201609,201610,201611,201612,201613,201614,201615,201616,201617,201618,201619,201620,201621,201622,201623,201624,201625,201626,201627,201628,201629,201630,201631,201632,201633,201634,201635,201636,201637,201638,201639,201640,201641,201642,201643,201644,201645,201646,201647,201648,201649,201650,201651,201652,201653,201654,201655,201656,201657,201658,201659,201660,201661,201662,201663,201664,201665,201666,201667,201668,201669,201670,201671,201672,201673,201674,201675,201676,201677,201678,201679,201680,201681,201682,201683,201684,201685,201686,201687,201688,201689,201690,201691,201692,201693,201694,201695,201696,201697,201698,201699,201700,201701,201702,201703,201704,201705,201706,201707,201708,201709,201710,201711,201712,201713,201714,201715,201716,201717,201718,201719,201720,201721,201722,201723,201724,201725,201726,201727,201728,201729,201730,201731,201732,201733,201734,201735,201736,201737,201738,201739,201740,201741,201742,201743,201744,201745,201746,201747,201748,201749,201750,201751,201752,201753,201754,201755,201756,201757,201758,201759,201760,201761,201762,201763,201764,201765,201766,201767,201768,201769,201770,201771,201772,201773,201774,201775,201776,201777,201778,201779,201780,201781,201782,201783,201784,201785,201786,201787,201788,201789,201790,201791,201792,201793,201794,201795,201796,201797,201798,201799,201800,201801,201802,201803,201804,201805,201806,201807,201808,201809,201810,201811,201812,201813,201814,201815,201816,201817,201818,201819,201820,201821,201822,201823,201824,201825,201826,201827,201828,201829,201830,201831,201832,201833,201834,201835,201836,201837,201838,201839,201840,201841,201842,201843,201844,201845,201846,201847,201848,201849,201850,201851,201852,201853,201854,201855,201856,201857,201858,201859,201860,201861,201862,201863,201864,201865,201866,201867,201868,201869,201870,201871,201872,201873,201874,201875,201876,201877,201878,201879,201880,201881,201882,201883,201884,201885,201886,201887,201888,201889,201890,201891,201892,201893,201894,201895,201896,201897,201898,201899,201900,201901,201902,201903,201904,201905,201906,201907,201908,201909,201910,201911,201912,201913,201914,201915,201916,201917,201918,201919,201920,201921,201922,201923,201924,201925,201926,201927,201928,201929,201930,201931,201932,201933,201934,201935,201936,201937,201938,201939,201940,201941,201942,201943,201944,201945,201946,201947,201948,201949,201950,201951,201952,201953,201954,201955,201956,201957,201958,201959,201960,201961,201962,201963,201964,201965,201966,201967,201968,201969,201970,201971,201972,201973,201974,201975,201976,201977,201978,201979,201980,201981,201982,201983,201984,201985,201986,201987,201988,201989,201990,201991,201992,201993,201994,201995,201996,201997,201998,201999,202000,202001,202002,202003,202004,202005,202006,202007,202008,202009,202010,202011,202012,202013,202014,202015,202016,202017,202018,202019,202020,202021,202022,202023,202024,202025,202026,202027,202028,202029,202030,202031,202032,202033,202034,202035,202036,202037,202038,202039,202040,202041,202042,202043,202044,202045,202046,202047,202048,202049,202050,202051,202052,202053,202054,202055,202056,202057,202058,202059,202060,202061,202062,202063,202064,202065,202066,202067,202068,202069,202070,202071,202072,202073,202074,202075,202076,202077,202078,202079,202080,202081,202082,202083,202084,202085,202086,202087,202088,202089,202090,202091,202092,202093,202094,202095,202096,202097,202098,202099,202100,202101,202102,202103,202104,202105,202106,202107,202108,202109,202110,202111,202112,202113,202114,202115,202116,202117,202118,202119,202120,202121,202122,202123,202124,202125,202126,202127,202128,202129,202130,202131,202132,202133,202134,202135,202136,202137,202138,202139,202140,202141,202142,202143,202144,202145,202146,202147,202148,202149,202150,202151,202152,202153,202154,202155,202156,202157,202158,202159,202160,202161,202162,202163,202164,202165,202166,202167,202168,202169,202170,202171,202172,202173,202174,202175,202176,202177,202178,202179,202180,202181,202182,202183,202184,202185,202186,202187,202188,202189,202190,202191,202192,202193,202194,202195,202196,202197,202198,202199,202200,202201,202202,202203,202204,202205,202206,202207,202208,202209,202210,202211,202212,202213,202214,202215,202216,202217,202218,202219,202220,202221,202222,202223,202224,202225,202226,202227,202228,202229,202230,202231,202232,202233,202234,202235,202236,202237,202238,202239,202240,202241,202242,202243,202244,202245,202246,202247,202248,202249,202250,202251,202252,202253,202254,202255,202256,202257,202258,202259,202260,202261,202262,202263,202264,202265,202266,202267,202268,202269,202270,202271,202272,202273,202274,202275,202276,202277,202278,202279,202280,202281,202282,202283,202284,202285,202286,202287,202288,202289,202290,202291,202292,202293,202294,202295,202296,202297,202298,202299,202300,202301,202302,202303,202304,202305,202306,202307,202308,202309,202310,202311,202312,202313,202314,202315,202316,202317,202318,202319,202320,202321,202322,202323,202324,202325,202326,202327,202328,202329,202330,202331,202332,202333,202334,202335,202336,202337,202338,202339,202340,202341,202342,202343,202344,202345,202346,202347,202348,202349,202350,202351,202352,202353,202354,202355,202356,202357,202358,202359,202360,202361,202362,202363,202364,202365,202366,202367,202368,202369,202370,202371,202372,202373,202374,202375,202376,202377,202378,202379,202380,202381,202382,202383,202384,202385,202386,202387,202388,202389,202390,202391,202392,202393,202394,202395,202396,202397,202398,202399,202400,202401,202402,202403,202404,202405,202406,202407,202408,202409,202410,202411,202412,202413,202414,202415,202416,202417,202418,202419,202420,202421,202422,202423,202424,202425,202426,202427,202428,202429,202430,202431,202432,202433,202434,202435,202436,202437,202438,202439,202440,202441,202442,202443,202444,202445,202446,202447,202448,202449,202450,202451,202452,202453,202454,202455,202456,202457,202458,202459,202460,202461,202462,202463,202464,202465,202466,202467,202468,202469,202470,202471,202472,202473,202474,202475,202476,202477,202478,202479,202480,202481,202482,202483,202484,202485,202486,202487,202488,202489,202490,202491,202492,202493,202494,202495,202496,202497,202498,202499,202500,202501,202502,202503,202504,202505,202506,202507,202508,202509,202510,202511,202512,202513,202514,202515,202516,202517,202518,202519,202520,202521,202522,202523,202524,202525,202526,202527,202528,202529,202530,202531,202532,202533,202534,202535,202536,202537,202538,202539,202540,202541,202542,202543,202544,202545,202546,202547,202548,202549,202550,202551,202552,202553,202554,202555,202556,202557,202558,202559,202560,202561,202562,202563,202564,202565,202566,202567,202568,202569,202570,202571,202572,202573,202574,202575,202576,202577,202578,202579,202580,202581,202582,202583,202584,202585,202586,202587,202588,202589,202590,202591,202592,202593,202594,202595,202596,202597,202598,202599,202600,202601,202602,202603,202604,202605,202606,202607,202608,202609,202610,202611,202612,202613,202614,202615,202616,202617,202618,202619,202620,202621,202622,202623,202624,202625,202626,202627,202628,202629,202630,202631,202632,202633,202634,202635,202636,202637,202638,202639,202640,202641,202642,202643,202644,202645,202646,202647,202648,202649,202650,202651,202652,202653,202654,202655,202656,202657,202658,202659,202660,202661,202662,202663,202664,202665,202666,202667,202668,202669,202670,202671,202672,202673,202674,202675,202676,202677,202678,202679,202680,202681,202682,202683,202684,202685,202686,202687,202688,202689,202690,202691,202692,202693,202694,202695,202696,202697,202698,202699,202700,202701,202702,202703,202704,202705,202706,202707,202708,202709,202710,202711,202712,202713,202714,202715,202716,202717,202718,202719,202720,202721,202722,202723,202724,202725,202726,202727,202728,202729,202730,202731,202732,202733,202734,202735,202736,202737,202738,202739,202740,202741,202742,202743,202744,202745,202746,202747,202748,202749,202750,202751,202752,202753,202754,202755,202756,202757,202758,202759,202760,202761,202762,202763,202764,202765,202766,202767,202768,202769,202770,202771,202772,202773,202774,202775,202776,202777,202778,202779,202780,202781,202782,202783,202784,202785,202786,202787,202788,202789,202790,202791,202792,202793,202794,202795,202796,202797,202798,202799,202800,202801,202802,202803,202804,202805,202806,202807,202808,202809,202810,202811,202812,202813,202814,202815,202816,202817,202818,202819,202820,202821,202822,202823,202824,202825,202826,202827,202828,202829,202830,202831,202832,202833,202834,202835,202836,202837,202838,202839,202840,202841,202842,202843,202844,202845,202846,202847,202848,202849,202850,202851,202852,202853,202854,202855,202856,202857,202858,202859,202860,202861,202862,202863,202864,202865,202866,202867,202868,202869,202870,202871,202872,202873,202874,202875,202876,202877,202878,202879,202880,202881,202882,202883,202884,202885,202886,202887,202888,202889,202890,202891,202892,202893,202894,202895,202896,202897,202898,202899,202900,202901,202902,202903,202904,202905,202906,202907,202908,202909,202910,202911,202912,202913,202914,202915,202916,202917,202918,202919,202920,202921,202922,202923,202924,202925,202926,202927,202928,202929,202930,202931,202932,202933,202934,202935,202936,202937,202938,202939,202940,202941,202942,202943,202944,202945,202946,202947,202948,202949,202950,202951,202952,202953,202954,202955,202956,202957,202958,202959,202960,202961,202962,202963,202964,202965,202966,202967,202968,202969,202970,202971,202972,202973,202974,202975,202976,202977,202978,202979,202980,202981,202982,202983,202984,202985,202986,202987,202988,202989,202990,202991,202992,202993,202994,202995,202996,202997,202998,202999,203000,203001,203002,203003,203004,203005,203006,203007,203008,203009,203010,203011,203012,203013,203014,203015,203016,203017,203018,203019,203020,203021,203022,203023,203024,203025,203026,203027,203028,203029,203030,203031,203032,203033,203034,203035,203036,203037,203038,203039,203040,203041,203042,203043,203044,203045,203046,203047,203048,203049,203050,203051,203052,203053,203054,203055,203056,203057,203058,203059,203060,203061,203062,203063,203064,203065,203066,203067,203068,203069,203070,203071,203072,203073,203074,203075,203076,203077,203078,203079,203080,203081,203082,203083,203084,203085,203086,203087,203088,203089,203090,203091,203092,203093,203094,203095,203096,203097,203098,203099,203100,203101,203102,203103,203104,203105,203106,203107,203108,203109,203110,203111,203112,203113,203114,203115,203116,203117,203118,203119,203120,203121,203122,203123,203124,203125,203126,203127,203128,203129,203130,203131,203132,203133,203134,203135,203136,203137,203138,203139,203140,203141,203142,203143,203144,203145,203146,203147,203148,203149,203150,203151,203152,203153,203154,203155,203156,203157,203158,203159,203160,203161,203162,203163,203164,203165,203166,203167,203168,203169,203170,203171,203172,203173,203174,203175,203176,203177,203178,203179,203180,203181,203182,203183,203184,203185,203186,203187,203188,203189,203190,203191,203192,203193,203194,203195,203196,203197,203198,203199,203200,203201,203202,203203,203204,203205,203206,203207,203208,203209,203210,203211,203212,203213,203214,203215,203216,203217,203218,203219,203220,203221,203222,203223,203224,203225,203226,203227,203228,203229,203230,203231,203232,203233,203234,203235,203236,203237,203238,203239,203240,203241,203242,203243,203244,203245,203246,203247,203248,203249,203250,203251,203252,203253,203254,203255,203256,203257,203258,203259,203260,203261,203262,203263,203264,203265,203266,203267,203268,203269,203270,203271,203272,203273,203274,203275,203276,203277,203278,203279,203280,203281,203282,203283,203284,203285,203286,203287,203288,203289,203290,203291,203292,203293,203294,203295,203296,203297,203298,203299,203300,203301,203302,203303,203304,203305,203306,203307,203308,203309,203310,203311,203312,203313,203314,203315,203316,203317,203318,203319,203320,203321,203322,203323,203324,203325,203326,203327,203328,203329,203330,203331,203332,203333,203334,203335,203336,203337,203338,203339,203340,203341,203342,203343,203344,203345,203346,203347,203348,203349,203350,203351,203352,203353,203354,203355,203356,203357,203358,203359,203360,203361,203362,203363,203364,203365,203366,203367,203368,203369,203370,203371,203372,203373,203374,203375,203376,203377,203378,203379,203380,203381,203382,203383,203384,203385,203386,203387,203388,203389,203390,203391,203392,203393,203394,203395,203396,203397,203398,203399,203400,203401,203402,203403,203404,203405,203406,203407,203408,203409,203410,203411,203412,203413,203414,203415,203416,203417,203418,203419,203420,203421,203422,203423,203424,203425,203426,203427,203428,203429,203430,203431,203432,203433,203434,203435,203436,203437,203438,203439,203440,203441,203442,203443,203444,203445,203446,203447,203448,203449,203450,203451,203452,203453,203454,203455,203456,203457,203458,203459,203460,203461,203462,203463,203464,203465,203466,203467,203468,203469,203470,203471,203472,203473,203474,203475,203476,203477,203478,203479,203480,203481,203482,203483,203484,203485,203486,203487,203488,203489,203490,203491,203492,203493,203494,203495,203496,203497,203498,203499,203500,203501,203502,203503,203504,203505,203506,203507,203508,203509,203510,203511,203512,203513,203514,203515,203516,203517,203518,203519,203520,203521,203522,203523,203524,203525,203526,203527,203528,203529,203530,203531,203532,203533,203534,203535,203536,203537,203538,203539,203540,203541,203542,203543,203544,203545,203546,203547,203548,203549,203550,203551,203552,203553,203554,203555,203556,203557,203558,203559,203560,203561,203562,203563,203564,203565,203566,203567,203568,203569,203570,203571,203572,203573,203574,203575,203576,203577,203578,203579,203580,203581,203582,203583,203584,203585,203586,203587,203588,203589,203590,203591,203592,203593,203594,203595,203596,203597,203598,203599,203600,203601,203602,203603,203604,203605,203606,203607,203608,203609,203610,203611,203612,203613,203614,203615,203616,203617,203618,203619,203620,203621,203622,203623,203624,203625,203626,203627,203628,203629,203630,203631,203632,203633,203634,203635,203636,203637,203638,203639,203640,203641,203642,203643,203644,203645,203646,203647,203648,203649,203650,203651,203652,203653,203654,203655,203656,203657,203658,203659,203660,203661,203662,203663,203664,203665,203666,203667,203668,203669,203670,203671,203672,203673,203674,203675,203676,203677,203678,203679,203680,203681,203682,203683,203684,203685,203686,203687,203688,203689,203690,203691,203692,203693,203694,203695,203696,203697,203698,203699,203700,203701,203702,203703,203704,203705,203706,203707,203708,203709,203710,203711,203712,203713,203714,203715,203716,203717,203718,203719,203720,203721,203722,203723,203724,203725,203726,203727,203728,203729,203730,203731,203732,203733,203734,203735,203736,203737,203738,203739,203740,203741,203742,203743,203744,203745,203746,203747,203748,203749,203750,203751,203752,203753,203754,203755,203756,203757,203758,203759,203760,203761,203762,203763,203764,203765,203766,203767,203768,203769,203770,203771,203772,203773,203774,203775,203776,203777,203778,203779,203780,203781,203782,203783,203784,203785,203786,203787,203788,203789,203790,203791,203792,203793,203794,203795,203796,203797,203798,203799,203800,203801,203802,203803,203804,203805,203806,203807,203808,203809,203810,203811,203812,203813,203814,203815,203816,203817,203818,203819,203820,203821,203822,203823,203824,203825,203826,203827,203828,203829,203830,203831,203832,203833,203834,203835,203836,203837,203838,203839,203840,203841,203842,203843,203844,203845,203846,203847,203848,203849,203850,203851,203852,203853,203854,203855,203856,203857,203858,203859,203860,203861,203862,203863,203864,203865,203866,203867,203868,203869,203870,203871,203872,203873,203874,203875,203876,203877,203878,203879,203880,203881,203882,203883,203884,203885,203886,203887,203888,203889,203890,203891,203892,203893,203894,203895,203896,203897,203898,203899,203900,203901,203902,203903,203904,203905,203906,203907,203908,203909,203910,203911,203912,203913,203914,203915,203916,203917,203918,203919,203920,203921,203922,203923,203924,203925,203926,203927,203928,203929,203930,203931,203932,203933,203934,203935,203936,203937,203938,203939,203940,203941,203942,203943,203944,203945,203946,203947,203948,203949,203950,203951,203952,203953,203954,203955,203956,203957,203958,203959,203960,203961,203962,203963,203964,203965,203966,203967,203968,203969,203970,203971,203972,203973,203974,203975,203976,203977,203978,203979,203980,203981,203982,203983,203984,203985,203986,203987,203988,203989,203990,203991,203992,203993,203994,203995,203996,203997,203998,203999,204000,204001,204002,204003,204004,204005,204006,204007,204008,204009,204010,204011,204012,204013,204014,204015,204016,204017,204018,204019,204020,204021,204022,204023,204024,204025,204026,204027,204028,204029,204030,204031,204032,204033,204034,204035,204036,204037,204038,204039,204040,204041,204042,204043,204044,204045,204046,204047,204048,204049,204050,204051,204052,204053,204054,204055,204056,204057,204058,204059,204060,204061,204062,204063,204064,204065,204066,204067,204068,204069,204070,204071,204072,204073,204074,204075,204076,204077,204078,204079,204080,204081,204082,204083,204084,204085,204086,204087,204088,204089,204090,204091,204092,204093,204094,204095,204096,204097,204098,204099,204100,204101,204102,204103,204104,204105,204106,204107,204108,204109,204110,204111,204112,204113,204114,204115,204116,204117,204118,204119,204120,204121,204122,204123,204124,204125,204126,204127,204128,204129,204130,204131,204132,204133,204134,204135,204136,204137,204138,204139,204140,204141,204142,204143,204144,204145,204146,204147,204148,204149,204150,204151,204152,204153,204154,204155,204156,204157,204158,204159,204160,204161,204162,204163,204164,204165,204166,204167,204168,204169,204170,204171,204172,204173,204174,204175,204176,204177,204178,204179,204180,204181,204182,204183,204184,204185,204186,204187,204188,204189,204190,204191,204192,204193,204194,204195,204196,204197,204198,204199,204200,204201,204202,204203,204204,204205,204206,204207,204208,204209,204210,204211,204212,204213,204214,204215,204216,204217,204218,204219,204220,204221,204222,204223,204224,204225,204226,204227,204228,204229,204230,204231,204232,204233,204234,204235,204236,204237,204238,204239,204240,204241,204242,204243,204244,204245,204246,204247,204248,204249,204250,204251,204252,204253,204254,204255,204256,204257,204258,204259,204260,204261,204262,204263,204264,204265,204266,204267,204268,204269,204270,204271,204272,204273,204274,204275,204276,204277,204278,204279,204280,204281,204282,204283,204284,204285,204286,204287,204288,204289,204290,204291,204292,204293,204294,204295,204296,204297,204298,204299,204300,204301,204302,204303,204304,204305,204306,204307,204308,204309,204310,204311,204312,204313,204314,204315,204316,204317,204318,204319,204320,204321,204322,204323,204324,204325,204326,204327,204328,204329,204330,204331,204332,204333,204334,204335,204336,204337,204338,204339,204340,204341,204342,204343,204344,204345,204346,204347,204348,204349,204350,204351,204352,204353,204354,204355,204356,204357,204358,204359,204360,204361,204362,204363,204364,204365,204366,204367,204368,204369,204370,204371,204372,204373,204374,204375,204376,204377,204378,204379,204380,204381,204382,204383,204384,204385,204386,204387,204388,204389,204390,204391,204392,204393,204394,204395,204396,204397,204398,204399,204400,204401,204402,204403,204404,204405,204406,204407,204408,204409,204410,204411,204412,204413,204414,204415,204416,204417,204418,204419,204420,204421,204422,204423,204424,204425,204426,204427,204428,204429,204430,204431,204432,204433,204434,204435,204436,204437,204438,204439,204440,204441,204442,204443,204444,204445,204446,204447,204448,204449,204450,204451,204452,204453,204454,204455,204456,204457,204458,204459,204460,204461,204462,204463,204464,204465,204466,204467,204468,204469,204470,204471,204472,204473,204474,204475,204476,204477,204478,204479,204480,204481,204482,204483,204484,204485,204486,204487,204488,204489,204490,204491,204492,204493,204494,204495,204496,204497,204498,204499,204500,204501,204502,204503,204504,204505,204506,204507,204508,204509,204510,204511,204512,204513,204514,204515,204516,204517,204518,204519,204520,204521,204522,204523,204524,204525,204526,204527,204528,204529,204530,204531,204532,204533,204534,204535,204536,204537,204538,204539,204540,204541,204542,204543,204544,204545,204546,204547,204548,204549,204550,204551,204552,204553,204554,204555,204556,204557,204558,204559,204560,204561,204562,204563,204564,204565,204566,204567,204568,204569,204570,204571,204572,204573,204574,204575,204576,204577,204578,204579,204580,204581,204582,204583,204584,204585,204586,204587,204588,204589,204590,204591,204592,204593,204594,204595,204596,204597,204598,204599,204600,204601,204602,204603,204604,204605,204606,204607,204608,204609,204610,204611,204612,204613,204614,204615,204616,204617,204618,204619,204620,204621,204622,204623,204624,204625,204626,204627,204628,204629,204630,204631,204632,204633,204634,204635,204636,204637,204638,204639,204640,204641,204642,204643,204644,204645,204646,204647,204648,204649,204650,204651,204652,204653,204654,204655,204656,204657,204658,204659,204660,204661,204662,204663,204664,204665,204666,204667,204668,204669,204670,204671,204672,204673,204674,204675,204676,204677,204678,204679,204680,204681,204682,204683,204684,204685,204686,204687,204688,204689,204690,204691,204692,204693,204694,204695,204696,204697,204698,204699,204700,204701,204702,204703,204704,204705,204706,204707,204708,204709,204710,204711,204712,204713,204714,204715,204716,204717,204718,204719,204720,204721,204722,204723,204724,204725,204726,204727,204728,204729,204730,204731,204732,204733,204734,204735,204736,204737,204738,204739,204740,204741,204742,204743,204744,204745,204746,204747,204748,204749,204750,204751,204752,204753,204754,204755,204756,204757,204758,204759,204760,204761,204762,204763,204764,204765,204766,204767,204768,204769,204770,204771,204772,204773,204774,204775,204776,204777,204778,204779,204780,204781,204782,204783,204784,204785,204786,204787,204788,204789,204790,204791,204792,204793,204794,204795,204796,204797,204798,204799,204800,204801,204802,204803,204804,204805,204806,204807,204808,204809,204810,204811,204812,204813,204814,204815,204816,204817,204818,204819,204820,204821,204822,204823,204824,204825,204826,204827,204828,204829,204830,204831,204832,204833,204834,204835,204836,204837,204838,204839,204840,204841,204842,204843,204844,204845,204846,204847,204848,204849,204850,204851,204852,204853,204854,204855,204856,204857,204858,204859,204860,204861,204862,204863,204864,204865,204866,204867,204868,204869,204870,204871,204872,204873,204874,204875,204876,204877,204878,204879,204880,204881,204882,204883,204884,204885,204886,204887,204888,204889,204890,204891,204892,204893,204894,204895,204896,204897,204898,204899,204900,204901,204902,204903,204904,204905,204906,204907,204908,204909,204910,204911,204912,204913,204914,204915,204916,204917,204918,204919,204920,204921,204922,204923,204924,204925,204926,204927,204928,204929,204930,204931,204932,204933,204934,204935,204936,204937,204938,204939,204940,204941,204942,204943,204944,204945,204946,204947,204948,204949,204950,204951,204952,204953,204954,204955,204956,204957,204958,204959,204960,204961,204962,204963,204964,204965,204966,204967,204968,204969,204970,204971,204972,204973,204974,204975,204976,204977,204978,204979,204980,204981,204982,204983,204984,204985,204986,204987,204988,204989,204990,204991,204992,204993,204994,204995,204996,204997,204998,204999,205000,205001,205002,205003,205004,205005,205006,205007,205008,205009,205010,205011,205012,205013,205014,205015,205016,205017,205018,205019,205020,205021,205022,205023,205024,205025,205026,205027,205028,205029,205030,205031,205032,205033,205034,205035,205036,205037,205038,205039,205040,205041,205042,205043,205044,205045,205046,205047,205048,205049,205050,205051,205052,205053,205054,205055,205056,205057,205058,205059,205060,205061,205062,205063,205064,205065,205066,205067,205068,205069,205070,205071,205072,205073,205074,205075,205076,205077,205078,205079,205080,205081,205082,205083,205084,205085,205086,205087,205088,205089,205090,205091,205092,205093,205094,205095,205096,205097,205098,205099,205100,205101,205102,205103,205104,205105,205106,205107,205108,205109,205110,205111,205112,205113,205114,205115,205116,205117,205118,205119,205120,205121,205122,205123,205124,205125,205126,205127,205128,205129,205130,205131,205132,205133,205134,205135,205136,205137,205138,205139,205140,205141,205142,205143,205144,205145,205146,205147,205148,205149,205150,205151,205152,205153,205154,205155,205156,205157,205158,205159,205160,205161,205162,205163,205164,205165,205166,205167,205168,205169,205170,205171,205172,205173,205174,205175,205176,205177,205178,205179,205180,205181,205182,205183,205184,205185,205186,205187,205188,205189,205190,205191,205192,205193,205194,205195,205196,205197,205198,205199,205200,205201,205202,205203,205204,205205,205206,205207,205208,205209,205210,205211,205212,205213,205214,205215,205216,205217,205218,205219,205220,205221,205222,205223,205224,205225,205226,205227,205228,205229,205230,205231,205232,205233,205234,205235,205236,205237,205238,205239,205240,205241,205242,205243,205244,205245,205246,205247,205248,205249,205250,205251,205252,205253,205254,205255,205256,205257,205258,205259,205260,205261,205262,205263,205264,205265,205266,205267,205268,205269,205270,205271,205272,205273,205274,205275,205276,205277,205278,205279,205280,205281,205282,205283,205284,205285,205286,205287,205288,205289,205290,205291,205292,205293,205294,205295,205296,205297,205298,205299,205300,205301,205302,205303,205304,205305,205306,205307,205308,205309,205310,205311,205312,205313,205314,205315,205316,205317,205318,205319,205320,205321,205322,205323,205324,205325,205326,205327,205328,205329,205330,205331,205332,205333,205334,205335,205336,205337,205338,205339,205340,205341,205342,205343,205344,205345,205346,205347,205348,205349,205350,205351,205352,205353,205354,205355,205356,205357,205358,205359,205360,205361,205362,205363,205364,205365,205366,205367,205368,205369,205370,205371,205372,205373,205374,205375,205376,205377,205378,205379,205380,205381,205382,205383,205384,205385,205386,205387,205388,205389,205390,205391,205392,205393,205394,205395,205396,205397,205398,205399,205400,205401,205402,205403,205404,205405,205406,205407,205408,205409,205410,205411,205412,205413,205414,205415,205416,205417,205418,205419,205420,205421,205422,205423,205424,205425,205426,205427,205428,205429,205430,205431,205432,205433,205434,205435,205436,205437,205438,205439,205440,205441,205442,205443,205444,205445,205446,205447,205448,205449,205450,205451,205452,205453,205454,205455,205456,205457,205458,205459,205460,205461,205462,205463,205464,205465,205466,205467,205468,205469,205470,205471,205472,205473,205474,205475,205476,205477,205478,205479,205480,205481,205482,205483,205484,205485,205486,205487,205488,205489,205490,205491,205492,205493,205494,205495,205496,205497,205498,205499,205500,205501,205502,205503,205504,205505,205506,205507,205508,205509,205510,205511,205512,205513,205514,205515,205516,205517,205518,205519,205520,205521,205522,205523,205524,205525,205526,205527,205528,205529,205530,205531,205532,205533,205534,205535,205536,205537,205538,205539,205540,205541,205542,205543,205544,205545,205546,205547,205548,205549,205550,205551,205552,205553,205554,205555,205556,205557,205558,205559,205560,205561,205562,205563,205564,205565,205566,205567,205568,205569,205570,205571,205572,205573,205574,205575,205576,205577,205578,205579,205580,205581,205582,205583,205584,205585,205586,205587,205588,205589,205590,205591,205592,205593,205594,205595,205596,205597,205598,205599,205600,205601,205602,205603,205604,205605,205606,205607,205608,205609,205610,205611,205612,205613,205614,205615,205616,205617,205618,205619,205620,205621,205622,205623,205624,205625,205626,205627,205628,205629,205630,205631,205632,205633,205634,205635,205636,205637,205638,205639,205640,205641,205642,205643,205644,205645,205646,205647,205648,205649,205650,205651,205652,205653,205654,205655,205656,205657,205658,205659,205660,205661,205662,205663,205664,205665,205666,205667,205668,205669,205670,205671,205672,205673,205674,205675,205676,205677,205678,205679,205680,205681,205682,205683,205684,205685,205686,205687,205688,205689,205690,205691,205692,205693,205694,205695,205696,205697,205698,205699,205700,205701,205702,205703,205704,205705,205706,205707,205708,205709,205710,205711,205712,205713,205714,205715,205716,205717,205718,205719,205720,205721,205722,205723,205724,205725,205726,205727,205728,205729,205730,205731,205732,205733,205734,205735,205736,205737,205738,205739,205740,205741,205742,205743,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999],"Default_Ignorable_Code_Point":[173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,6159,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,113824,113825,113826,113827,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917632,917633,917634,917635,917636,917637,917638,917639,917640,917641,917642,917643,917644,917645,917646,917647,917648,917649,917650,917651,917652,917653,917654,917655,917656,917657,917658,917659,917660,917661,917662,917663,917664,917665,917666,917667,917668,917669,917670,917671,917672,917673,917674,917675,917676,917677,917678,917679,917680,917681,917682,917683,917684,917685,917686,917687,917688,917689,917690,917691,917692,917693,917694,917695,917696,917697,917698,917699,917700,917701,917702,917703,917704,917705,917706,917707,917708,917709,917710,917711,917712,917713,917714,917715,917716,917717,917718,917719,917720,917721,917722,917723,917724,917725,917726,917727,917728,917729,917730,917731,917732,917733,917734,917735,917736,917737,917738,917739,917740,917741,917742,917743,917744,917745,917746,917747,917748,917749,917750,917751,917752,917753,917754,917755,917756,917757,917758,917759,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999,918000,918001,918002,918003,918004,918005,918006,918007,918008,918009,918010,918011,918012,918013,918014,918015,918016,918017,918018,918019,918020,918021,918022,918023,918024,918025,918026,918027,918028,918029,918030,918031,918032,918033,918034,918035,918036,918037,918038,918039,918040,918041,918042,918043,918044,918045,918046,918047,918048,918049,918050,918051,918052,918053,918054,918055,918056,918057,918058,918059,918060,918061,918062,918063,918064,918065,918066,918067,918068,918069,918070,918071,918072,918073,918074,918075,918076,918077,918078,918079,918080,918081,918082,918083,918084,918085,918086,918087,918088,918089,918090,918091,918092,918093,918094,918095,918096,918097,918098,918099,918100,918101,918102,918103,918104,918105,918106,918107,918108,918109,918110,918111,918112,918113,918114,918115,918116,918117,918118,918119,918120,918121,918122,918123,918124,918125,918126,918127,918128,918129,918130,918131,918132,918133,918134,918135,918136,918137,918138,918139,918140,918141,918142,918143,918144,918145,918146,918147,918148,918149,918150,918151,918152,918153,918154,918155,918156,918157,918158,918159,918160,918161,918162,918163,918164,918165,918166,918167,918168,918169,918170,918171,918172,918173,918174,918175,918176,918177,918178,918179,918180,918181,918182,918183,918184,918185,918186,918187,918188,918189,918190,918191,918192,918193,918194,918195,918196,918197,918198,918199,918200,918201,918202,918203,918204,918205,918206,918207,918208,918209,918210,918211,918212,918213,918214,918215,918216,918217,918218,918219,918220,918221,918222,918223,918224,918225,918226,918227,918228,918229,918230,918231,918232,918233,918234,918235,918236,918237,918238,918239,918240,918241,918242,918243,918244,918245,918246,918247,918248,918249,918250,918251,918252,918253,918254,918255,918256,918257,918258,918259,918260,918261,918262,918263,918264,918265,918266,918267,918268,918269,918270,918271,918272,918273,918274,918275,918276,918277,918278,918279,918280,918281,918282,918283,918284,918285,918286,918287,918288,918289,918290,918291,918292,918293,918294,918295,918296,918297,918298,918299,918300,918301,918302,918303,918304,918305,918306,918307,918308,918309,918310,918311,918312,918313,918314,918315,918316,918317,918318,918319,918320,918321,918322,918323,918324,918325,918326,918327,918328,918329,918330,918331,918332,918333,918334,918335,918336,918337,918338,918339,918340,918341,918342,918343,918344,918345,918346,918347,918348,918349,918350,918351,918352,918353,918354,918355,918356,918357,918358,918359,918360,918361,918362,918363,918364,918365,918366,918367,918368,918369,918370,918371,918372,918373,918374,918375,918376,918377,918378,918379,918380,918381,918382,918383,918384,918385,918386,918387,918388,918389,918390,918391,918392,918393,918394,918395,918396,918397,918398,918399,918400,918401,918402,918403,918404,918405,918406,918407,918408,918409,918410,918411,918412,918413,918414,918415,918416,918417,918418,918419,918420,918421,918422,918423,918424,918425,918426,918427,918428,918429,918430,918431,918432,918433,918434,918435,918436,918437,918438,918439,918440,918441,918442,918443,918444,918445,918446,918447,918448,918449,918450,918451,918452,918453,918454,918455,918456,918457,918458,918459,918460,918461,918462,918463,918464,918465,918466,918467,918468,918469,918470,918471,918472,918473,918474,918475,918476,918477,918478,918479,918480,918481,918482,918483,918484,918485,918486,918487,918488,918489,918490,918491,918492,918493,918494,918495,918496,918497,918498,918499,918500,918501,918502,918503,918504,918505,918506,918507,918508,918509,918510,918511,918512,918513,918514,918515,918516,918517,918518,918519,918520,918521,918522,918523,918524,918525,918526,918527,918528,918529,918530,918531,918532,918533,918534,918535,918536,918537,918538,918539,918540,918541,918542,918543,918544,918545,918546,918547,918548,918549,918550,918551,918552,918553,918554,918555,918556,918557,918558,918559,918560,918561,918562,918563,918564,918565,918566,918567,918568,918569,918570,918571,918572,918573,918574,918575,918576,918577,918578,918579,918580,918581,918582,918583,918584,918585,918586,918587,918588,918589,918590,918591,918592,918593,918594,918595,918596,918597,918598,918599,918600,918601,918602,918603,918604,918605,918606,918607,918608,918609,918610,918611,918612,918613,918614,918615,918616,918617,918618,918619,918620,918621,918622,918623,918624,918625,918626,918627,918628,918629,918630,918631,918632,918633,918634,918635,918636,918637,918638,918639,918640,918641,918642,918643,918644,918645,918646,918647,918648,918649,918650,918651,918652,918653,918654,918655,918656,918657,918658,918659,918660,918661,918662,918663,918664,918665,918666,918667,918668,918669,918670,918671,918672,918673,918674,918675,918676,918677,918678,918679,918680,918681,918682,918683,918684,918685,918686,918687,918688,918689,918690,918691,918692,918693,918694,918695,918696,918697,918698,918699,918700,918701,918702,918703,918704,918705,918706,918707,918708,918709,918710,918711,918712,918713,918714,918715,918716,918717,918718,918719,918720,918721,918722,918723,918724,918725,918726,918727,918728,918729,918730,918731,918732,918733,918734,918735,918736,918737,918738,918739,918740,918741,918742,918743,918744,918745,918746,918747,918748,918749,918750,918751,918752,918753,918754,918755,918756,918757,918758,918759,918760,918761,918762,918763,918764,918765,918766,918767,918768,918769,918770,918771,918772,918773,918774,918775,918776,918777,918778,918779,918780,918781,918782,918783,918784,918785,918786,918787,918788,918789,918790,918791,918792,918793,918794,918795,918796,918797,918798,918799,918800,918801,918802,918803,918804,918805,918806,918807,918808,918809,918810,918811,918812,918813,918814,918815,918816,918817,918818,918819,918820,918821,918822,918823,918824,918825,918826,918827,918828,918829,918830,918831,918832,918833,918834,918835,918836,918837,918838,918839,918840,918841,918842,918843,918844,918845,918846,918847,918848,918849,918850,918851,918852,918853,918854,918855,918856,918857,918858,918859,918860,918861,918862,918863,918864,918865,918866,918867,918868,918869,918870,918871,918872,918873,918874,918875,918876,918877,918878,918879,918880,918881,918882,918883,918884,918885,918886,918887,918888,918889,918890,918891,918892,918893,918894,918895,918896,918897,918898,918899,918900,918901,918902,918903,918904,918905,918906,918907,918908,918909,918910,918911,918912,918913,918914,918915,918916,918917,918918,918919,918920,918921,918922,918923,918924,918925,918926,918927,918928,918929,918930,918931,918932,918933,918934,918935,918936,918937,918938,918939,918940,918941,918942,918943,918944,918945,918946,918947,918948,918949,918950,918951,918952,918953,918954,918955,918956,918957,918958,918959,918960,918961,918962,918963,918964,918965,918966,918967,918968,918969,918970,918971,918972,918973,918974,918975,918976,918977,918978,918979,918980,918981,918982,918983,918984,918985,918986,918987,918988,918989,918990,918991,918992,918993,918994,918995,918996,918997,918998,918999,919000,919001,919002,919003,919004,919005,919006,919007,919008,919009,919010,919011,919012,919013,919014,919015,919016,919017,919018,919019,919020,919021,919022,919023,919024,919025,919026,919027,919028,919029,919030,919031,919032,919033,919034,919035,919036,919037,919038,919039,919040,919041,919042,919043,919044,919045,919046,919047,919048,919049,919050,919051,919052,919053,919054,919055,919056,919057,919058,919059,919060,919061,919062,919063,919064,919065,919066,919067,919068,919069,919070,919071,919072,919073,919074,919075,919076,919077,919078,919079,919080,919081,919082,919083,919084,919085,919086,919087,919088,919089,919090,919091,919092,919093,919094,919095,919096,919097,919098,919099,919100,919101,919102,919103,919104,919105,919106,919107,919108,919109,919110,919111,919112,919113,919114,919115,919116,919117,919118,919119,919120,919121,919122,919123,919124,919125,919126,919127,919128,919129,919130,919131,919132,919133,919134,919135,919136,919137,919138,919139,919140,919141,919142,919143,919144,919145,919146,919147,919148,919149,919150,919151,919152,919153,919154,919155,919156,919157,919158,919159,919160,919161,919162,919163,919164,919165,919166,919167,919168,919169,919170,919171,919172,919173,919174,919175,919176,919177,919178,919179,919180,919181,919182,919183,919184,919185,919186,919187,919188,919189,919190,919191,919192,919193,919194,919195,919196,919197,919198,919199,919200,919201,919202,919203,919204,919205,919206,919207,919208,919209,919210,919211,919212,919213,919214,919215,919216,919217,919218,919219,919220,919221,919222,919223,919224,919225,919226,919227,919228,919229,919230,919231,919232,919233,919234,919235,919236,919237,919238,919239,919240,919241,919242,919243,919244,919245,919246,919247,919248,919249,919250,919251,919252,919253,919254,919255,919256,919257,919258,919259,919260,919261,919262,919263,919264,919265,919266,919267,919268,919269,919270,919271,919272,919273,919274,919275,919276,919277,919278,919279,919280,919281,919282,919283,919284,919285,919286,919287,919288,919289,919290,919291,919292,919293,919294,919295,919296,919297,919298,919299,919300,919301,919302,919303,919304,919305,919306,919307,919308,919309,919310,919311,919312,919313,919314,919315,919316,919317,919318,919319,919320,919321,919322,919323,919324,919325,919326,919327,919328,919329,919330,919331,919332,919333,919334,919335,919336,919337,919338,919339,919340,919341,919342,919343,919344,919345,919346,919347,919348,919349,919350,919351,919352,919353,919354,919355,919356,919357,919358,919359,919360,919361,919362,919363,919364,919365,919366,919367,919368,919369,919370,919371,919372,919373,919374,919375,919376,919377,919378,919379,919380,919381,919382,919383,919384,919385,919386,919387,919388,919389,919390,919391,919392,919393,919394,919395,919396,919397,919398,919399,919400,919401,919402,919403,919404,919405,919406,919407,919408,919409,919410,919411,919412,919413,919414,919415,919416,919417,919418,919419,919420,919421,919422,919423,919424,919425,919426,919427,919428,919429,919430,919431,919432,919433,919434,919435,919436,919437,919438,919439,919440,919441,919442,919443,919444,919445,919446,919447,919448,919449,919450,919451,919452,919453,919454,919455,919456,919457,919458,919459,919460,919461,919462,919463,919464,919465,919466,919467,919468,919469,919470,919471,919472,919473,919474,919475,919476,919477,919478,919479,919480,919481,919482,919483,919484,919485,919486,919487,919488,919489,919490,919491,919492,919493,919494,919495,919496,919497,919498,919499,919500,919501,919502,919503,919504,919505,919506,919507,919508,919509,919510,919511,919512,919513,919514,919515,919516,919517,919518,919519,919520,919521,919522,919523,919524,919525,919526,919527,919528,919529,919530,919531,919532,919533,919534,919535,919536,919537,919538,919539,919540,919541,919542,919543,919544,919545,919546,919547,919548,919549,919550,919551,919552,919553,919554,919555,919556,919557,919558,919559,919560,919561,919562,919563,919564,919565,919566,919567,919568,919569,919570,919571,919572,919573,919574,919575,919576,919577,919578,919579,919580,919581,919582,919583,919584,919585,919586,919587,919588,919589,919590,919591,919592,919593,919594,919595,919596,919597,919598,919599,919600,919601,919602,919603,919604,919605,919606,919607,919608,919609,919610,919611,919612,919613,919614,919615,919616,919617,919618,919619,919620,919621,919622,919623,919624,919625,919626,919627,919628,919629,919630,919631,919632,919633,919634,919635,919636,919637,919638,919639,919640,919641,919642,919643,919644,919645,919646,919647,919648,919649,919650,919651,919652,919653,919654,919655,919656,919657,919658,919659,919660,919661,919662,919663,919664,919665,919666,919667,919668,919669,919670,919671,919672,919673,919674,919675,919676,919677,919678,919679,919680,919681,919682,919683,919684,919685,919686,919687,919688,919689,919690,919691,919692,919693,919694,919695,919696,919697,919698,919699,919700,919701,919702,919703,919704,919705,919706,919707,919708,919709,919710,919711,919712,919713,919714,919715,919716,919717,919718,919719,919720,919721,919722,919723,919724,919725,919726,919727,919728,919729,919730,919731,919732,919733,919734,919735,919736,919737,919738,919739,919740,919741,919742,919743,919744,919745,919746,919747,919748,919749,919750,919751,919752,919753,919754,919755,919756,919757,919758,919759,919760,919761,919762,919763,919764,919765,919766,919767,919768,919769,919770,919771,919772,919773,919774,919775,919776,919777,919778,919779,919780,919781,919782,919783,919784,919785,919786,919787,919788,919789,919790,919791,919792,919793,919794,919795,919796,919797,919798,919799,919800,919801,919802,919803,919804,919805,919806,919807,919808,919809,919810,919811,919812,919813,919814,919815,919816,919817,919818,919819,919820,919821,919822,919823,919824,919825,919826,919827,919828,919829,919830,919831,919832,919833,919834,919835,919836,919837,919838,919839,919840,919841,919842,919843,919844,919845,919846,919847,919848,919849,919850,919851,919852,919853,919854,919855,919856,919857,919858,919859,919860,919861,919862,919863,919864,919865,919866,919867,919868,919869,919870,919871,919872,919873,919874,919875,919876,919877,919878,919879,919880,919881,919882,919883,919884,919885,919886,919887,919888,919889,919890,919891,919892,919893,919894,919895,919896,919897,919898,919899,919900,919901,919902,919903,919904,919905,919906,919907,919908,919909,919910,919911,919912,919913,919914,919915,919916,919917,919918,919919,919920,919921,919922,919923,919924,919925,919926,919927,919928,919929,919930,919931,919932,919933,919934,919935,919936,919937,919938,919939,919940,919941,919942,919943,919944,919945,919946,919947,919948,919949,919950,919951,919952,919953,919954,919955,919956,919957,919958,919959,919960,919961,919962,919963,919964,919965,919966,919967,919968,919969,919970,919971,919972,919973,919974,919975,919976,919977,919978,919979,919980,919981,919982,919983,919984,919985,919986,919987,919988,919989,919990,919991,919992,919993,919994,919995,919996,919997,919998,919999,920000,920001,920002,920003,920004,920005,920006,920007,920008,920009,920010,920011,920012,920013,920014,920015,920016,920017,920018,920019,920020,920021,920022,920023,920024,920025,920026,920027,920028,920029,920030,920031,920032,920033,920034,920035,920036,920037,920038,920039,920040,920041,920042,920043,920044,920045,920046,920047,920048,920049,920050,920051,920052,920053,920054,920055,920056,920057,920058,920059,920060,920061,920062,920063,920064,920065,920066,920067,920068,920069,920070,920071,920072,920073,920074,920075,920076,920077,920078,920079,920080,920081,920082,920083,920084,920085,920086,920087,920088,920089,920090,920091,920092,920093,920094,920095,920096,920097,920098,920099,920100,920101,920102,920103,920104,920105,920106,920107,920108,920109,920110,920111,920112,920113,920114,920115,920116,920117,920118,920119,920120,920121,920122,920123,920124,920125,920126,920127,920128,920129,920130,920131,920132,920133,920134,920135,920136,920137,920138,920139,920140,920141,920142,920143,920144,920145,920146,920147,920148,920149,920150,920151,920152,920153,920154,920155,920156,920157,920158,920159,920160,920161,920162,920163,920164,920165,920166,920167,920168,920169,920170,920171,920172,920173,920174,920175,920176,920177,920178,920179,920180,920181,920182,920183,920184,920185,920186,920187,920188,920189,920190,920191,920192,920193,920194,920195,920196,920197,920198,920199,920200,920201,920202,920203,920204,920205,920206,920207,920208,920209,920210,920211,920212,920213,920214,920215,920216,920217,920218,920219,920220,920221,920222,920223,920224,920225,920226,920227,920228,920229,920230,920231,920232,920233,920234,920235,920236,920237,920238,920239,920240,920241,920242,920243,920244,920245,920246,920247,920248,920249,920250,920251,920252,920253,920254,920255,920256,920257,920258,920259,920260,920261,920262,920263,920264,920265,920266,920267,920268,920269,920270,920271,920272,920273,920274,920275,920276,920277,920278,920279,920280,920281,920282,920283,920284,920285,920286,920287,920288,920289,920290,920291,920292,920293,920294,920295,920296,920297,920298,920299,920300,920301,920302,920303,920304,920305,920306,920307,920308,920309,920310,920311,920312,920313,920314,920315,920316,920317,920318,920319,920320,920321,920322,920323,920324,920325,920326,920327,920328,920329,920330,920331,920332,920333,920334,920335,920336,920337,920338,920339,920340,920341,920342,920343,920344,920345,920346,920347,920348,920349,920350,920351,920352,920353,920354,920355,920356,920357,920358,920359,920360,920361,920362,920363,920364,920365,920366,920367,920368,920369,920370,920371,920372,920373,920374,920375,920376,920377,920378,920379,920380,920381,920382,920383,920384,920385,920386,920387,920388,920389,920390,920391,920392,920393,920394,920395,920396,920397,920398,920399,920400,920401,920402,920403,920404,920405,920406,920407,920408,920409,920410,920411,920412,920413,920414,920415,920416,920417,920418,920419,920420,920421,920422,920423,920424,920425,920426,920427,920428,920429,920430,920431,920432,920433,920434,920435,920436,920437,920438,920439,920440,920441,920442,920443,920444,920445,920446,920447,920448,920449,920450,920451,920452,920453,920454,920455,920456,920457,920458,920459,920460,920461,920462,920463,920464,920465,920466,920467,920468,920469,920470,920471,920472,920473,920474,920475,920476,920477,920478,920479,920480,920481,920482,920483,920484,920485,920486,920487,920488,920489,920490,920491,920492,920493,920494,920495,920496,920497,920498,920499,920500,920501,920502,920503,920504,920505,920506,920507,920508,920509,920510,920511,920512,920513,920514,920515,920516,920517,920518,920519,920520,920521,920522,920523,920524,920525,920526,920527,920528,920529,920530,920531,920532,920533,920534,920535,920536,920537,920538,920539,920540,920541,920542,920543,920544,920545,920546,920547,920548,920549,920550,920551,920552,920553,920554,920555,920556,920557,920558,920559,920560,920561,920562,920563,920564,920565,920566,920567,920568,920569,920570,920571,920572,920573,920574,920575,920576,920577,920578,920579,920580,920581,920582,920583,920584,920585,920586,920587,920588,920589,920590,920591,920592,920593,920594,920595,920596,920597,920598,920599,920600,920601,920602,920603,920604,920605,920606,920607,920608,920609,920610,920611,920612,920613,920614,920615,920616,920617,920618,920619,920620,920621,920622,920623,920624,920625,920626,920627,920628,920629,920630,920631,920632,920633,920634,920635,920636,920637,920638,920639,920640,920641,920642,920643,920644,920645,920646,920647,920648,920649,920650,920651,920652,920653,920654,920655,920656,920657,920658,920659,920660,920661,920662,920663,920664,920665,920666,920667,920668,920669,920670,920671,920672,920673,920674,920675,920676,920677,920678,920679,920680,920681,920682,920683,920684,920685,920686,920687,920688,920689,920690,920691,920692,920693,920694,920695,920696,920697,920698,920699,920700,920701,920702,920703,920704,920705,920706,920707,920708,920709,920710,920711,920712,920713,920714,920715,920716,920717,920718,920719,920720,920721,920722,920723,920724,920725,920726,920727,920728,920729,920730,920731,920732,920733,920734,920735,920736,920737,920738,920739,920740,920741,920742,920743,920744,920745,920746,920747,920748,920749,920750,920751,920752,920753,920754,920755,920756,920757,920758,920759,920760,920761,920762,920763,920764,920765,920766,920767,920768,920769,920770,920771,920772,920773,920774,920775,920776,920777,920778,920779,920780,920781,920782,920783,920784,920785,920786,920787,920788,920789,920790,920791,920792,920793,920794,920795,920796,920797,920798,920799,920800,920801,920802,920803,920804,920805,920806,920807,920808,920809,920810,920811,920812,920813,920814,920815,920816,920817,920818,920819,920820,920821,920822,920823,920824,920825,920826,920827,920828,920829,920830,920831,920832,920833,920834,920835,920836,920837,920838,920839,920840,920841,920842,920843,920844,920845,920846,920847,920848,920849,920850,920851,920852,920853,920854,920855,920856,920857,920858,920859,920860,920861,920862,920863,920864,920865,920866,920867,920868,920869,920870,920871,920872,920873,920874,920875,920876,920877,920878,920879,920880,920881,920882,920883,920884,920885,920886,920887,920888,920889,920890,920891,920892,920893,920894,920895,920896,920897,920898,920899,920900,920901,920902,920903,920904,920905,920906,920907,920908,920909,920910,920911,920912,920913,920914,920915,920916,920917,920918,920919,920920,920921,920922,920923,920924,920925,920926,920927,920928,920929,920930,920931,920932,920933,920934,920935,920936,920937,920938,920939,920940,920941,920942,920943,920944,920945,920946,920947,920948,920949,920950,920951,920952,920953,920954,920955,920956,920957,920958,920959,920960,920961,920962,920963,920964,920965,920966,920967,920968,920969,920970,920971,920972,920973,920974,920975,920976,920977,920978,920979,920980,920981,920982,920983,920984,920985,920986,920987,920988,920989,920990,920991,920992,920993,920994,920995,920996,920997,920998,920999,921000,921001,921002,921003,921004,921005,921006,921007,921008,921009,921010,921011,921012,921013,921014,921015,921016,921017,921018,921019,921020,921021,921022,921023,921024,921025,921026,921027,921028,921029,921030,921031,921032,921033,921034,921035,921036,921037,921038,921039,921040,921041,921042,921043,921044,921045,921046,921047,921048,921049,921050,921051,921052,921053,921054,921055,921056,921057,921058,921059,921060,921061,921062,921063,921064,921065,921066,921067,921068,921069,921070,921071,921072,921073,921074,921075,921076,921077,921078,921079,921080,921081,921082,921083,921084,921085,921086,921087,921088,921089,921090,921091,921092,921093,921094,921095,921096,921097,921098,921099,921100,921101,921102,921103,921104,921105,921106,921107,921108,921109,921110,921111,921112,921113,921114,921115,921116,921117,921118,921119,921120,921121,921122,921123,921124,921125,921126,921127,921128,921129,921130,921131,921132,921133,921134,921135,921136,921137,921138,921139,921140,921141,921142,921143,921144,921145,921146,921147,921148,921149,921150,921151,921152,921153,921154,921155,921156,921157,921158,921159,921160,921161,921162,921163,921164,921165,921166,921167,921168,921169,921170,921171,921172,921173,921174,921175,921176,921177,921178,921179,921180,921181,921182,921183,921184,921185,921186,921187,921188,921189,921190,921191,921192,921193,921194,921195,921196,921197,921198,921199,921200,921201,921202,921203,921204,921205,921206,921207,921208,921209,921210,921211,921212,921213,921214,921215,921216,921217,921218,921219,921220,921221,921222,921223,921224,921225,921226,921227,921228,921229,921230,921231,921232,921233,921234,921235,921236,921237,921238,921239,921240,921241,921242,921243,921244,921245,921246,921247,921248,921249,921250,921251,921252,921253,921254,921255,921256,921257,921258,921259,921260,921261,921262,921263,921264,921265,921266,921267,921268,921269,921270,921271,921272,921273,921274,921275,921276,921277,921278,921279,921280,921281,921282,921283,921284,921285,921286,921287,921288,921289,921290,921291,921292,921293,921294,921295,921296,921297,921298,921299,921300,921301,921302,921303,921304,921305,921306,921307,921308,921309,921310,921311,921312,921313,921314,921315,921316,921317,921318,921319,921320,921321,921322,921323,921324,921325,921326,921327,921328,921329,921330,921331,921332,921333,921334,921335,921336,921337,921338,921339,921340,921341,921342,921343,921344,921345,921346,921347,921348,921349,921350,921351,921352,921353,921354,921355,921356,921357,921358,921359,921360,921361,921362,921363,921364,921365,921366,921367,921368,921369,921370,921371,921372,921373,921374,921375,921376,921377,921378,921379,921380,921381,921382,921383,921384,921385,921386,921387,921388,921389,921390,921391,921392,921393,921394,921395,921396,921397,921398,921399,921400,921401,921402,921403,921404,921405,921406,921407,921408,921409,921410,921411,921412,921413,921414,921415,921416,921417,921418,921419,921420,921421,921422,921423,921424,921425,921426,921427,921428,921429,921430,921431,921432,921433,921434,921435,921436,921437,921438,921439,921440,921441,921442,921443,921444,921445,921446,921447,921448,921449,921450,921451,921452,921453,921454,921455,921456,921457,921458,921459,921460,921461,921462,921463,921464,921465,921466,921467,921468,921469,921470,921471,921472,921473,921474,921475,921476,921477,921478,921479,921480,921481,921482,921483,921484,921485,921486,921487,921488,921489,921490,921491,921492,921493,921494,921495,921496,921497,921498,921499,921500,921501,921502,921503,921504,921505,921506,921507,921508,921509,921510,921511,921512,921513,921514,921515,921516,921517,921518,921519,921520,921521,921522,921523,921524,921525,921526,921527,921528,921529,921530,921531,921532,921533,921534,921535,921536,921537,921538,921539,921540,921541,921542,921543,921544,921545,921546,921547,921548,921549,921550,921551,921552,921553,921554,921555,921556,921557,921558,921559,921560,921561,921562,921563,921564,921565,921566,921567,921568,921569,921570,921571,921572,921573,921574,921575,921576,921577,921578,921579,921580,921581,921582,921583,921584,921585,921586,921587,921588,921589,921590,921591,921592,921593,921594,921595,921596,921597,921598,921599],"Grapheme_Extend":[768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,1155,1156,1157,1158,1159,1160,1161,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1471,1473,1474,1476,1477,1479,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1648,1750,1751,1752,1753,1754,1755,1756,1759,1760,1761,1762,1763,1764,1767,1768,1770,1771,1772,1773,1809,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,2027,2028,2029,2030,2031,2032,2033,2034,2035,2045,2070,2071,2072,2073,2075,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2089,2090,2091,2092,2093,2137,2138,2139,2200,2201,2202,2203,2204,2205,2206,2207,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2362,2364,2369,2370,2371,2372,2373,2374,2375,2376,2381,2385,2386,2387,2388,2389,2390,2391,2402,2403,2433,2492,2494,2497,2498,2499,2500,2509,2519,2530,2531,2558,2561,2562,2620,2625,2626,2631,2632,2635,2636,2637,2641,2672,2673,2677,2689,2690,2748,2753,2754,2755,2756,2757,2759,2760,2765,2786,2787,2810,2811,2812,2813,2814,2815,2817,2876,2878,2879,2881,2882,2883,2884,2893,2901,2902,2903,2914,2915,2946,3006,3008,3021,3031,3072,3076,3132,3134,3135,3136,3142,3143,3144,3146,3147,3148,3149,3157,3158,3170,3171,3201,3260,3263,3266,3270,3276,3277,3285,3286,3298,3299,3328,3329,3387,3388,3390,3393,3394,3395,3396,3405,3415,3426,3427,3457,3530,3535,3538,3539,3540,3542,3551,3633,3636,3637,3638,3639,3640,3641,3642,3655,3656,3657,3658,3659,3660,3661,3662,3761,3764,3765,3766,3767,3768,3769,3770,3771,3772,3784,3785,3786,3787,3788,3789,3790,3864,3865,3893,3895,3897,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3968,3969,3970,3971,3972,3974,3975,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4038,4141,4142,4143,4144,4146,4147,4148,4149,4150,4151,4153,4154,4157,4158,4184,4185,4190,4191,4192,4209,4210,4211,4212,4226,4229,4230,4237,4253,4957,4958,4959,5906,5907,5908,5938,5939,5970,5971,6002,6003,6068,6069,6071,6072,6073,6074,6075,6076,6077,6086,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6109,6155,6156,6157,6159,6277,6278,6313,6432,6433,6434,6439,6440,6450,6457,6458,6459,6679,6680,6683,6742,6744,6745,6746,6747,6748,6749,6750,6752,6754,6757,6758,6759,6760,6761,6762,6763,6764,6771,6772,6773,6774,6775,6776,6777,6778,6779,6780,6783,6832,6833,6834,6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6912,6913,6914,6915,6964,6965,6966,6967,6968,6969,6970,6972,6978,7019,7020,7021,7022,7023,7024,7025,7026,7027,7040,7041,7074,7075,7076,7077,7080,7081,7083,7084,7085,7142,7144,7145,7149,7151,7152,7153,7212,7213,7214,7215,7216,7217,7218,7219,7222,7223,7376,7377,7378,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391,7392,7394,7395,7396,7397,7398,7399,7400,7405,7412,7416,7417,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679,8204,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,11503,11504,11505,11647,11744,11745,11746,11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,12330,12331,12332,12333,12334,12335,12441,12442,42607,42608,42609,42610,42612,42613,42614,42615,42616,42617,42618,42619,42620,42621,42654,42655,42736,42737,43010,43014,43019,43045,43046,43052,43204,43205,43232,43233,43234,43235,43236,43237,43238,43239,43240,43241,43242,43243,43244,43245,43246,43247,43248,43249,43263,43302,43303,43304,43305,43306,43307,43308,43309,43335,43336,43337,43338,43339,43340,43341,43342,43343,43344,43345,43392,43393,43394,43443,43446,43447,43448,43449,43452,43453,43493,43561,43562,43563,43564,43565,43566,43569,43570,43573,43574,43587,43596,43644,43696,43698,43699,43700,43703,43704,43710,43711,43713,43756,43757,43766,44005,44008,44013,64286,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65056,65057,65058,65059,65060,65061,65062,65063,65064,65065,65066,65067,65068,65069,65070,65071,65438,65439,66045,66272,66422,66423,66424,66425,66426,68097,68098,68099,68101,68102,68108,68109,68110,68111,68152,68153,68154,68159,68325,68326,68900,68901,68902,68903,69291,69292,69373,69374,69375,69446,69447,69448,69449,69450,69451,69452,69453,69454,69455,69456,69506,69507,69508,69509,69633,69688,69689,69690,69691,69692,69693,69694,69695,69696,69697,69698,69699,69700,69701,69702,69744,69747,69748,69759,69760,69761,69811,69812,69813,69814,69817,69818,69826,69888,69889,69890,69927,69928,69929,69930,69931,69933,69934,69935,69936,69937,69938,69939,69940,70003,70016,70017,70070,70071,70072,70073,70074,70075,70076,70077,70078,70089,70090,70091,70092,70095,70191,70192,70193,70196,70198,70199,70206,70209,70367,70371,70372,70373,70374,70375,70376,70377,70378,70400,70401,70459,70460,70462,70464,70487,70502,70503,70504,70505,70506,70507,70508,70512,70513,70514,70515,70516,70712,70713,70714,70715,70716,70717,70718,70719,70722,70723,70724,70726,70750,70832,70835,70836,70837,70838,70839,70840,70842,70845,70847,70848,70850,70851,71087,71090,71091,71092,71093,71100,71101,71103,71104,71132,71133,71219,71220,71221,71222,71223,71224,71225,71226,71229,71231,71232,71339,71341,71344,71345,71346,71347,71348,71349,71351,71453,71454,71455,71458,71459,71460,71461,71463,71464,71465,71466,71467,71727,71728,71729,71730,71731,71732,71733,71734,71735,71737,71738,71984,71995,71996,71998,72003,72148,72149,72150,72151,72154,72155,72160,72193,72194,72195,72196,72197,72198,72199,72200,72201,72202,72243,72244,72245,72246,72247,72248,72251,72252,72253,72254,72263,72273,72274,72275,72276,72277,72278,72281,72282,72283,72330,72331,72332,72333,72334,72335,72336,72337,72338,72339,72340,72341,72342,72344,72345,72752,72753,72754,72755,72756,72757,72758,72760,72761,72762,72763,72764,72765,72767,72850,72851,72852,72853,72854,72855,72856,72857,72858,72859,72860,72861,72862,72863,72864,72865,72866,72867,72868,72869,72870,72871,72874,72875,72876,72877,72878,72879,72880,72882,72883,72885,72886,73009,73010,73011,73012,73013,73014,73018,73020,73021,73023,73024,73025,73026,73027,73028,73029,73031,73104,73105,73109,73111,73459,73460,73472,73473,73526,73527,73528,73529,73530,73536,73538,78912,78919,78920,78921,78922,78923,78924,78925,78926,78927,78928,78929,78930,78931,78932,78933,92912,92913,92914,92915,92916,92976,92977,92978,92979,92980,92981,92982,94031,94095,94096,94097,94098,94180,113821,113822,118528,118529,118530,118531,118532,118533,118534,118535,118536,118537,118538,118539,118540,118541,118542,118543,118544,118545,118546,118547,118548,118549,118550,118551,118552,118553,118554,118555,118556,118557,118558,118559,118560,118561,118562,118563,118564,118565,118566,118567,118568,118569,118570,118571,118572,118573,118576,118577,118578,118579,118580,118581,118582,118583,118584,118585,118586,118587,118588,118589,118590,118591,118592,118593,118594,118595,118596,118597,118598,119141,119143,119144,119145,119150,119151,119152,119153,119154,119163,119164,119165,119166,119167,119168,119169,119170,119173,119174,119175,119176,119177,119178,119179,119210,119211,119212,119213,119362,119363,119364,121344,121345,121346,121347,121348,121349,121350,121351,121352,121353,121354,121355,121356,121357,121358,121359,121360,121361,121362,121363,121364,121365,121366,121367,121368,121369,121370,121371,121372,121373,121374,121375,121376,121377,121378,121379,121380,121381,121382,121383,121384,121385,121386,121387,121388,121389,121390,121391,121392,121393,121394,121395,121396,121397,121398,121403,121404,121405,121406,121407,121408,121409,121410,121411,121412,121413,121414,121415,121416,121417,121418,121419,121420,121421,121422,121423,121424,121425,121426,121427,121428,121429,121430,121431,121432,121433,121434,121435,121436,121437,121438,121439,121440,121441,121442,121443,121444,121445,121446,121447,121448,121449,121450,121451,121452,121461,121476,121499,121500,121501,121502,121503,121505,121506,121507,121508,121509,121510,121511,121512,121513,121514,121515,121516,121517,121518,121519,122880,122881,122882,122883,122884,122885,122886,122888,122889,122890,122891,122892,122893,122894,122895,122896,122897,122898,122899,122900,122901,122902,122903,122904,122907,122908,122909,122910,122911,122912,122913,122915,122916,122918,122919,122920,122921,122922,123023,123184,123185,123186,123187,123188,123189,123190,123566,123628,123629,123630,123631,124140,124141,124142,124143,125136,125137,125138,125139,125140,125141,125142,125252,125253,125254,125255,125256,125257,125258,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999],"Grapheme_Base":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,160,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,880,881,882,883,884,885,886,887,890,891,892,893,894,895,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1421,1422,1423,1470,1472,1475,1478,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1519,1520,1521,1522,1523,1524,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1563,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1758,1765,1766,1769,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2038,2039,2040,2041,2042,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2142,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2363,2365,2366,2367,2368,2377,2378,2379,2380,2382,2383,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2434,2435,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2495,2496,2503,2504,2507,2508,2510,2524,2525,2527,2528,2529,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2563,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2622,2623,2624,2649,2650,2651,2652,2654,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2674,2675,2676,2678,2691,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2750,2751,2752,2761,2763,2764,2768,2784,2785,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2809,2818,2819,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2880,2887,2888,2891,2892,2908,2909,2911,2912,2913,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3007,3009,3010,3014,3015,3016,3018,3019,3020,3024,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3073,3074,3075,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3133,3137,3138,3139,3140,3160,3161,3162,3165,3168,3169,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3262,3264,3265,3267,3268,3271,3272,3274,3275,3293,3294,3296,3297,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311,3313,3314,3315,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3391,3392,3398,3399,3400,3402,3403,3404,3406,3407,3412,3413,3414,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3458,3459,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3536,3537,3544,3545,3546,3547,3548,3549,3550,3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3570,3571,3572,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3647,3648,3649,3650,3651,3652,3653,3654,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3713,3714,3716,3718,3719,3720,3721,3722,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,3745,3746,3747,3749,3751,3752,3753,3754,3755,3756,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3782,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3804,3805,3806,3807,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3894,3896,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3967,3973,3976,3977,3978,3979,3980,4030,4031,4032,4033,4034,4035,4036,4037,4039,4040,4041,4042,4043,4044,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4139,4140,4145,4152,4155,4156,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4186,4187,4188,4189,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4227,4228,4231,4232,4233,4234,4235,4236,4238,4239,4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,5112,5113,5114,5115,5116,5117,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876,5877,5878,5879,5880,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5909,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5940,5941,5942,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6070,6078,6079,6080,6081,6082,6083,6084,6085,6087,6088,6100,6101,6102,6103,6104,6105,6106,6107,6108,6112,6113,6114,6115,6116,6117,6118,6119,6120,6121,6128,6129,6130,6131,6132,6133,6134,6135,6136,6137,6144,6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,6272,6273,6274,6275,6276,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6435,6436,6437,6438,6441,6442,6443,6448,6449,6451,6452,6453,6454,6455,6456,6464,6468,6469,6470,6471,6472,6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6576,6577,6578,6579,6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6608,6609,6610,6611,6612,6613,6614,6615,6616,6617,6618,6622,6623,6624,6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6681,6682,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6743,6753,6755,6756,6765,6766,6767,6768,6769,6770,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6971,6973,6974,6975,6976,6977,6979,6980,6981,6982,6983,6984,6985,6986,6987,6988,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014,7015,7016,7017,7018,7028,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7042,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7078,7079,7082,7086,7087,7088,7089,7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7143,7146,7147,7148,7150,7154,7155,7164,7165,7166,7167,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7220,7221,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296,7297,7298,7299,7300,7301,7302,7303,7304,7312,7313,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7379,7393,7401,7402,7403,7404,7406,7407,7408,7409,7410,7411,7413,7414,7415,7418,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711,7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759,7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807,7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7960,7961,7962,7963,7964,7965,7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983,7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999,8000,8001,8002,8003,8004,8005,8008,8009,8010,8011,8012,8013,8016,8017,8018,8019,8020,8021,8022,8023,8025,8027,8029,8031,8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111,8112,8113,8114,8115,8116,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127,8128,8129,8130,8131,8132,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8150,8151,8152,8153,8154,8155,8157,8158,8159,8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8178,8179,8180,8182,8183,8184,8185,8186,8187,8188,8189,8190,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8304,8305,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9450,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682,9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697,9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742,9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021,10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033,10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093,10094,10095,10096,10097,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141,10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153,10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165,10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201,10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345,10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357,10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393,10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429,10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441,10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501,10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513,10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621,10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657,10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693,10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705,10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717,10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729,10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885,10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957,10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029,11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053,11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150,11151,11152,11153,11154,11155,11156,11157,11159,11160,11161,11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185,11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197,11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209,11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378,11379,11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395,11396,11397,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410,11411,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457,11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,11470,11471,11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486,11487,11488,11489,11490,11491,11492,11493,11494,11495,11496,11497,11498,11499,11500,11501,11502,11506,11507,11513,11514,11515,11516,11517,11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11631,11632,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,11776,11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794,11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806,11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866,11867,11868,11869,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914,11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928,11929,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12032,12033,12034,12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058,12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118,12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130,12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166,12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286,12287,12288,12289,12290,12291,12292,12293,12294,12295,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12321,12322,12323,12324,12325,12326,12327,12328,12329,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12443,12444,12445,12446,12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539,12540,12541,12542,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12590,12591,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12688,12689,12690,12691,12692,12693,12694,12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742,12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12783,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,12828,12829,12830,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849,12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862,12863,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12885,12886,12887,12888,12889,12890,12891,12892,12893,12894,12895,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973,12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989,12990,12991,12992,12993,12994,12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018,13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030,13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114,13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126,13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138,13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174,13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270,13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,19895,19896,19897,19898,19899,19900,19901,19902,19903,19904,19905,19906,19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918,19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930,19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942,19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954,19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966,19967,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40909,40910,40911,40912,40913,40914,40915,40916,40917,40918,40919,40920,40921,40922,40923,40924,40925,40926,40927,40928,40929,40930,40931,40932,40933,40934,40935,40936,40937,40938,40939,40940,40941,40942,40943,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,40954,40955,40956,40957,40958,40959,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40981,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42128,42129,42130,42131,42132,42133,42134,42135,42136,42137,42138,42139,42140,42141,42142,42143,42144,42145,42146,42147,42148,42149,42150,42151,42152,42153,42154,42155,42156,42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169,42170,42171,42172,42173,42174,42175,42176,42177,42178,42179,42180,42181,42182,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42232,42233,42234,42235,42236,42237,42238,42239,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42508,42509,42510,42511,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42528,42529,42530,42531,42532,42533,42534,42535,42536,42537,42538,42539,42560,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,42600,42601,42602,42603,42604,42605,42606,42611,42622,42623,42624,42625,42626,42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,42653,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,42726,42727,42728,42729,42730,42731,42732,42733,42734,42735,42738,42739,42740,42741,42742,42743,42752,42753,42754,42755,42756,42757,42758,42759,42760,42761,42762,42763,42764,42765,42766,42767,42768,42769,42770,42771,42772,42773,42774,42775,42776,42777,42778,42779,42780,42781,42782,42783,42784,42785,42786,42787,42788,42789,42790,42791,42792,42793,42794,42795,42796,42797,42798,42799,42800,42801,42802,42803,42804,42805,42806,42807,42808,42809,42810,42811,42812,42813,42814,42815,42816,42817,42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,42877,42878,42879,42880,42881,42882,42883,42884,42885,42886,42887,42888,42889,42890,42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,42904,42905,42906,42907,42908,42909,42910,42911,42912,42913,42914,42915,42916,42917,42918,42919,42920,42921,42922,42923,42924,42925,42926,42927,42928,42929,42930,42931,42932,42933,42934,42935,42936,42937,42938,42939,42940,42941,42942,42943,42944,42945,42946,42947,42948,42949,42950,42951,42952,42953,42954,42960,42961,42963,42965,42966,42967,42968,42969,42994,42995,42996,42997,42998,42999,43000,43001,43002,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43043,43044,43047,43048,43049,43050,43051,43056,43057,43058,43059,43060,43061,43062,43063,43064,43065,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43124,43125,43126,43127,43136,43137,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43188,43189,43190,43191,43192,43193,43194,43195,43196,43197,43198,43199,43200,43201,43202,43203,43214,43215,43216,43217,43218,43219,43220,43221,43222,43223,43224,43225,43250,43251,43252,43253,43254,43255,43256,43257,43258,43259,43260,43261,43262,43264,43265,43266,43267,43268,43269,43270,43271,43272,43273,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43310,43311,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43346,43347,43359,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43395,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43444,43445,43450,43451,43454,43455,43456,43457,43458,43459,43460,43461,43462,43463,43464,43465,43466,43467,43468,43469,43471,43472,43473,43474,43475,43476,43477,43478,43479,43480,43481,43486,43487,43488,43489,43490,43491,43492,43494,43495,43496,43497,43498,43499,43500,43501,43502,43503,43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43514,43515,43516,43517,43518,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43567,43568,43571,43572,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43597,43600,43601,43602,43603,43604,43605,43606,43607,43608,43609,43612,43613,43614,43615,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43632,43633,43634,43635,43636,43637,43638,43639,43640,43641,43642,43643,43645,43646,43647,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43741,43742,43743,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43755,43758,43759,43760,43761,43762,43763,43764,43765,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43824,43825,43826,43827,43828,43829,43830,43831,43832,43833,43834,43835,43836,43837,43838,43839,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,43851,43852,43853,43854,43855,43856,43857,43858,43859,43860,43861,43862,43863,43864,43865,43866,43867,43868,43869,43870,43871,43872,43873,43874,43875,43876,43877,43878,43879,43880,43881,43882,43883,43888,43889,43890,43891,43892,43893,43894,43895,43896,43897,43898,43899,43900,43901,43902,43903,43904,43905,43906,43907,43908,43909,43910,43911,43912,43913,43914,43915,43916,43917,43918,43919,43920,43921,43922,43923,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,43935,43936,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44003,44004,44006,44007,44009,44010,44011,44012,44016,44017,44018,44019,44020,44021,44022,44023,44024,44025,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64297,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64450,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64830,64831,64832,64833,64834,64835,64836,64837,64838,64839,64840,64841,64842,64843,64844,64845,64846,64847,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,64975,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65020,65021,65022,65023,65040,65041,65042,65043,65044,65045,65046,65047,65048,65049,65072,65073,65074,65075,65076,65077,65078,65079,65080,65081,65082,65083,65084,65085,65086,65087,65088,65089,65090,65091,65092,65093,65094,65095,65096,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65112,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65374,65375,65376,65377,65378,65379,65380,65381,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65392,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65504,65505,65506,65507,65508,65509,65510,65512,65513,65514,65515,65516,65517,65518,65532,65533,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,65792,65793,65794,65799,65800,65801,65802,65803,65804,65805,65806,65807,65808,65809,65810,65811,65812,65813,65814,65815,65816,65817,65818,65819,65820,65821,65822,65823,65824,65825,65826,65827,65828,65829,65830,65831,65832,65833,65834,65835,65836,65837,65838,65839,65840,65841,65842,65843,65847,65848,65849,65850,65851,65852,65853,65854,65855,65856,65857,65858,65859,65860,65861,65862,65863,65864,65865,65866,65867,65868,65869,65870,65871,65872,65873,65874,65875,65876,65877,65878,65879,65880,65881,65882,65883,65884,65885,65886,65887,65888,65889,65890,65891,65892,65893,65894,65895,65896,65897,65898,65899,65900,65901,65902,65903,65904,65905,65906,65907,65908,65909,65910,65911,65912,65913,65914,65915,65916,65917,65918,65919,65920,65921,65922,65923,65924,65925,65926,65927,65928,65929,65930,65931,65932,65933,65934,65936,65937,65938,65939,65940,65941,65942,65943,65944,65945,65946,65947,65948,65952,66000,66001,66002,66003,66004,66005,66006,66007,66008,66009,66010,66011,66012,66013,66014,66015,66016,66017,66018,66019,66020,66021,66022,66023,66024,66025,66026,66027,66028,66029,66030,66031,66032,66033,66034,66035,66036,66037,66038,66039,66040,66041,66042,66043,66044,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66273,66274,66275,66276,66277,66278,66279,66280,66281,66282,66283,66284,66285,66286,66287,66288,66289,66290,66291,66292,66293,66294,66295,66296,66297,66298,66299,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66335,66336,66337,66338,66339,66349,66350,66351,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66369,66370,66371,66372,66373,66374,66375,66376,66377,66378,66384,66385,66386,66387,66388,66389,66390,66391,66392,66393,66394,66395,66396,66397,66398,66399,66400,66401,66402,66403,66404,66405,66406,66407,66408,66409,66410,66411,66412,66413,66414,66415,66416,66417,66418,66419,66420,66421,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66463,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66512,66513,66514,66515,66516,66517,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,66720,66721,66722,66723,66724,66725,66726,66727,66728,66729,66736,66737,66738,66739,66740,66741,66742,66743,66744,66745,66746,66747,66748,66749,66750,66751,66752,66753,66754,66755,66756,66757,66758,66759,66760,66761,66762,66763,66764,66765,66766,66767,66768,66769,66770,66771,66776,66777,66778,66779,66780,66781,66782,66783,66784,66785,66786,66787,66788,66789,66790,66791,66792,66793,66794,66795,66796,66797,66798,66799,66800,66801,66802,66803,66804,66805,66806,66807,66808,66809,66810,66811,66816,66817,66818,66819,66820,66821,66822,66823,66824,66825,66826,66827,66828,66829,66830,66831,66832,66833,66834,66835,66836,66837,66838,66839,66840,66841,66842,66843,66844,66845,66846,66847,66848,66849,66850,66851,66852,66853,66854,66855,66864,66865,66866,66867,66868,66869,66870,66871,66872,66873,66874,66875,66876,66877,66878,66879,66880,66881,66882,66883,66884,66885,66886,66887,66888,66889,66890,66891,66892,66893,66894,66895,66896,66897,66898,66899,66900,66901,66902,66903,66904,66905,66906,66907,66908,66909,66910,66911,66912,66913,66914,66915,66927,66928,66929,66930,66931,66932,66933,66934,66935,66936,66937,66938,66940,66941,66942,66943,66944,66945,66946,66947,66948,66949,66950,66951,66952,66953,66954,66956,66957,66958,66959,66960,66961,66962,66964,66965,66967,66968,66969,66970,66971,66972,66973,66974,66975,66976,66977,66979,66980,66981,66982,66983,66984,66985,66986,66987,66988,66989,66990,66991,66992,66993,66995,66996,66997,66998,66999,67000,67001,67003,67004,67072,67073,67074,67075,67076,67077,67078,67079,67080,67081,67082,67083,67084,67085,67086,67087,67088,67089,67090,67091,67092,67093,67094,67095,67096,67097,67098,67099,67100,67101,67102,67103,67104,67105,67106,67107,67108,67109,67110,67111,67112,67113,67114,67115,67116,67117,67118,67119,67120,67121,67122,67123,67124,67125,67126,67127,67128,67129,67130,67131,67132,67133,67134,67135,67136,67137,67138,67139,67140,67141,67142,67143,67144,67145,67146,67147,67148,67149,67150,67151,67152,67153,67154,67155,67156,67157,67158,67159,67160,67161,67162,67163,67164,67165,67166,67167,67168,67169,67170,67171,67172,67173,67174,67175,67176,67177,67178,67179,67180,67181,67182,67183,67184,67185,67186,67187,67188,67189,67190,67191,67192,67193,67194,67195,67196,67197,67198,67199,67200,67201,67202,67203,67204,67205,67206,67207,67208,67209,67210,67211,67212,67213,67214,67215,67216,67217,67218,67219,67220,67221,67222,67223,67224,67225,67226,67227,67228,67229,67230,67231,67232,67233,67234,67235,67236,67237,67238,67239,67240,67241,67242,67243,67244,67245,67246,67247,67248,67249,67250,67251,67252,67253,67254,67255,67256,67257,67258,67259,67260,67261,67262,67263,67264,67265,67266,67267,67268,67269,67270,67271,67272,67273,67274,67275,67276,67277,67278,67279,67280,67281,67282,67283,67284,67285,67286,67287,67288,67289,67290,67291,67292,67293,67294,67295,67296,67297,67298,67299,67300,67301,67302,67303,67304,67305,67306,67307,67308,67309,67310,67311,67312,67313,67314,67315,67316,67317,67318,67319,67320,67321,67322,67323,67324,67325,67326,67327,67328,67329,67330,67331,67332,67333,67334,67335,67336,67337,67338,67339,67340,67341,67342,67343,67344,67345,67346,67347,67348,67349,67350,67351,67352,67353,67354,67355,67356,67357,67358,67359,67360,67361,67362,67363,67364,67365,67366,67367,67368,67369,67370,67371,67372,67373,67374,67375,67376,67377,67378,67379,67380,67381,67382,67392,67393,67394,67395,67396,67397,67398,67399,67400,67401,67402,67403,67404,67405,67406,67407,67408,67409,67410,67411,67412,67413,67424,67425,67426,67427,67428,67429,67430,67431,67456,67457,67458,67459,67460,67461,67463,67464,67465,67466,67467,67468,67469,67470,67471,67472,67473,67474,67475,67476,67477,67478,67479,67480,67481,67482,67483,67484,67485,67486,67487,67488,67489,67490,67491,67492,67493,67494,67495,67496,67497,67498,67499,67500,67501,67502,67503,67504,67506,67507,67508,67509,67510,67511,67512,67513,67514,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67671,67672,67673,67674,67675,67676,67677,67678,67679,67680,67681,67682,67683,67684,67685,67686,67687,67688,67689,67690,67691,67692,67693,67694,67695,67696,67697,67698,67699,67700,67701,67702,67703,67704,67705,67706,67707,67708,67709,67710,67711,67712,67713,67714,67715,67716,67717,67718,67719,67720,67721,67722,67723,67724,67725,67726,67727,67728,67729,67730,67731,67732,67733,67734,67735,67736,67737,67738,67739,67740,67741,67742,67751,67752,67753,67754,67755,67756,67757,67758,67759,67808,67809,67810,67811,67812,67813,67814,67815,67816,67817,67818,67819,67820,67821,67822,67823,67824,67825,67826,67828,67829,67835,67836,67837,67838,67839,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67862,67863,67864,67865,67866,67867,67871,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67903,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68028,68029,68030,68031,68032,68033,68034,68035,68036,68037,68038,68039,68040,68041,68042,68043,68044,68045,68046,68047,68050,68051,68052,68053,68054,68055,68056,68057,68058,68059,68060,68061,68062,68063,68064,68065,68066,68067,68068,68069,68070,68071,68072,68073,68074,68075,68076,68077,68078,68079,68080,68081,68082,68083,68084,68085,68086,68087,68088,68089,68090,68091,68092,68093,68094,68095,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68148,68149,68160,68161,68162,68163,68164,68165,68166,68167,68168,68176,68177,68178,68179,68180,68181,68182,68183,68184,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68221,68222,68223,68224,68225,68226,68227,68228,68229,68230,68231,68232,68233,68234,68235,68236,68237,68238,68239,68240,68241,68242,68243,68244,68245,68246,68247,68248,68249,68250,68251,68252,68253,68254,68255,68288,68289,68290,68291,68292,68293,68294,68295,68296,68297,68298,68299,68300,68301,68302,68303,68304,68305,68306,68307,68308,68309,68310,68311,68312,68313,68314,68315,68316,68317,68318,68319,68320,68321,68322,68323,68324,68331,68332,68333,68334,68335,68336,68337,68338,68339,68340,68341,68342,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68409,68410,68411,68412,68413,68414,68415,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68440,68441,68442,68443,68444,68445,68446,68447,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68472,68473,68474,68475,68476,68477,68478,68479,68480,68481,68482,68483,68484,68485,68486,68487,68488,68489,68490,68491,68492,68493,68494,68495,68496,68497,68505,68506,68507,68508,68521,68522,68523,68524,68525,68526,68527,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,68736,68737,68738,68739,68740,68741,68742,68743,68744,68745,68746,68747,68748,68749,68750,68751,68752,68753,68754,68755,68756,68757,68758,68759,68760,68761,68762,68763,68764,68765,68766,68767,68768,68769,68770,68771,68772,68773,68774,68775,68776,68777,68778,68779,68780,68781,68782,68783,68784,68785,68786,68800,68801,68802,68803,68804,68805,68806,68807,68808,68809,68810,68811,68812,68813,68814,68815,68816,68817,68818,68819,68820,68821,68822,68823,68824,68825,68826,68827,68828,68829,68830,68831,68832,68833,68834,68835,68836,68837,68838,68839,68840,68841,68842,68843,68844,68845,68846,68847,68848,68849,68850,68858,68859,68860,68861,68862,68863,68864,68865,68866,68867,68868,68869,68870,68871,68872,68873,68874,68875,68876,68877,68878,68879,68880,68881,68882,68883,68884,68885,68886,68887,68888,68889,68890,68891,68892,68893,68894,68895,68896,68897,68898,68899,68912,68913,68914,68915,68916,68917,68918,68919,68920,68921,69216,69217,69218,69219,69220,69221,69222,69223,69224,69225,69226,69227,69228,69229,69230,69231,69232,69233,69234,69235,69236,69237,69238,69239,69240,69241,69242,69243,69244,69245,69246,69248,69249,69250,69251,69252,69253,69254,69255,69256,69257,69258,69259,69260,69261,69262,69263,69264,69265,69266,69267,69268,69269,69270,69271,69272,69273,69274,69275,69276,69277,69278,69279,69280,69281,69282,69283,69284,69285,69286,69287,69288,69289,69293,69296,69297,69376,69377,69378,69379,69380,69381,69382,69383,69384,69385,69386,69387,69388,69389,69390,69391,69392,69393,69394,69395,69396,69397,69398,69399,69400,69401,69402,69403,69404,69405,69406,69407,69408,69409,69410,69411,69412,69413,69414,69415,69424,69425,69426,69427,69428,69429,69430,69431,69432,69433,69434,69435,69436,69437,69438,69439,69440,69441,69442,69443,69444,69445,69457,69458,69459,69460,69461,69462,69463,69464,69465,69488,69489,69490,69491,69492,69493,69494,69495,69496,69497,69498,69499,69500,69501,69502,69503,69504,69505,69510,69511,69512,69513,69552,69553,69554,69555,69556,69557,69558,69559,69560,69561,69562,69563,69564,69565,69566,69567,69568,69569,69570,69571,69572,69573,69574,69575,69576,69577,69578,69579,69600,69601,69602,69603,69604,69605,69606,69607,69608,69609,69610,69611,69612,69613,69614,69615,69616,69617,69618,69619,69620,69621,69622,69632,69634,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69703,69704,69705,69706,69707,69708,69709,69714,69715,69716,69717,69718,69719,69720,69721,69722,69723,69724,69725,69726,69727,69728,69729,69730,69731,69732,69733,69734,69735,69736,69737,69738,69739,69740,69741,69742,69743,69745,69746,69749,69762,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69808,69809,69810,69815,69816,69819,69820,69822,69823,69824,69825,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69872,69873,69874,69875,69876,69877,69878,69879,69880,69881,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,69932,69942,69943,69944,69945,69946,69947,69948,69949,69950,69951,69952,69953,69954,69955,69956,69957,69958,69959,69968,69969,69970,69971,69972,69973,69974,69975,69976,69977,69978,69979,69980,69981,69982,69983,69984,69985,69986,69987,69988,69989,69990,69991,69992,69993,69994,69995,69996,69997,69998,69999,70000,70001,70002,70004,70005,70006,70018,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70067,70068,70069,70079,70080,70081,70082,70083,70084,70085,70086,70087,70088,70093,70094,70096,70097,70098,70099,70100,70101,70102,70103,70104,70105,70106,70107,70108,70109,70110,70111,70113,70114,70115,70116,70117,70118,70119,70120,70121,70122,70123,70124,70125,70126,70127,70128,70129,70130,70131,70132,70144,70145,70146,70147,70148,70149,70150,70151,70152,70153,70154,70155,70156,70157,70158,70159,70160,70161,70163,70164,70165,70166,70167,70168,70169,70170,70171,70172,70173,70174,70175,70176,70177,70178,70179,70180,70181,70182,70183,70184,70185,70186,70187,70188,70189,70190,70194,70195,70197,70200,70201,70202,70203,70204,70205,70207,70208,70272,70273,70274,70275,70276,70277,70278,70280,70282,70283,70284,70285,70287,70288,70289,70290,70291,70292,70293,70294,70295,70296,70297,70298,70299,70300,70301,70303,70304,70305,70306,70307,70308,70309,70310,70311,70312,70313,70320,70321,70322,70323,70324,70325,70326,70327,70328,70329,70330,70331,70332,70333,70334,70335,70336,70337,70338,70339,70340,70341,70342,70343,70344,70345,70346,70347,70348,70349,70350,70351,70352,70353,70354,70355,70356,70357,70358,70359,70360,70361,70362,70363,70364,70365,70366,70368,70369,70370,70384,70385,70386,70387,70388,70389,70390,70391,70392,70393,70402,70403,70405,70406,70407,70408,70409,70410,70411,70412,70415,70416,70419,70420,70421,70422,70423,70424,70425,70426,70427,70428,70429,70430,70431,70432,70433,70434,70435,70436,70437,70438,70439,70440,70442,70443,70444,70445,70446,70447,70448,70450,70451,70453,70454,70455,70456,70457,70461,70463,70465,70466,70467,70468,70471,70472,70475,70476,70477,70480,70493,70494,70495,70496,70497,70498,70499,70656,70657,70658,70659,70660,70661,70662,70663,70664,70665,70666,70667,70668,70669,70670,70671,70672,70673,70674,70675,70676,70677,70678,70679,70680,70681,70682,70683,70684,70685,70686,70687,70688,70689,70690,70691,70692,70693,70694,70695,70696,70697,70698,70699,70700,70701,70702,70703,70704,70705,70706,70707,70708,70709,70710,70711,70720,70721,70725,70727,70728,70729,70730,70731,70732,70733,70734,70735,70736,70737,70738,70739,70740,70741,70742,70743,70744,70745,70746,70747,70749,70751,70752,70753,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70833,70834,70841,70843,70844,70846,70849,70852,70853,70854,70855,70864,70865,70866,70867,70868,70869,70870,70871,70872,70873,71040,71041,71042,71043,71044,71045,71046,71047,71048,71049,71050,71051,71052,71053,71054,71055,71056,71057,71058,71059,71060,71061,71062,71063,71064,71065,71066,71067,71068,71069,71070,71071,71072,71073,71074,71075,71076,71077,71078,71079,71080,71081,71082,71083,71084,71085,71086,71088,71089,71096,71097,71098,71099,71102,71105,71106,71107,71108,71109,71110,71111,71112,71113,71114,71115,71116,71117,71118,71119,71120,71121,71122,71123,71124,71125,71126,71127,71128,71129,71130,71131,71168,71169,71170,71171,71172,71173,71174,71175,71176,71177,71178,71179,71180,71181,71182,71183,71184,71185,71186,71187,71188,71189,71190,71191,71192,71193,71194,71195,71196,71197,71198,71199,71200,71201,71202,71203,71204,71205,71206,71207,71208,71209,71210,71211,71212,71213,71214,71215,71216,71217,71218,71227,71228,71230,71233,71234,71235,71236,71248,71249,71250,71251,71252,71253,71254,71255,71256,71257,71264,71265,71266,71267,71268,71269,71270,71271,71272,71273,71274,71275,71276,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,71340,71342,71343,71350,71352,71353,71360,71361,71362,71363,71364,71365,71366,71367,71368,71369,71424,71425,71426,71427,71428,71429,71430,71431,71432,71433,71434,71435,71436,71437,71438,71439,71440,71441,71442,71443,71444,71445,71446,71447,71448,71449,71450,71456,71457,71462,71472,71473,71474,71475,71476,71477,71478,71479,71480,71481,71482,71483,71484,71485,71486,71487,71488,71489,71490,71491,71492,71493,71494,71680,71681,71682,71683,71684,71685,71686,71687,71688,71689,71690,71691,71692,71693,71694,71695,71696,71697,71698,71699,71700,71701,71702,71703,71704,71705,71706,71707,71708,71709,71710,71711,71712,71713,71714,71715,71716,71717,71718,71719,71720,71721,71722,71723,71724,71725,71726,71736,71739,71840,71841,71842,71843,71844,71845,71846,71847,71848,71849,71850,71851,71852,71853,71854,71855,71856,71857,71858,71859,71860,71861,71862,71863,71864,71865,71866,71867,71868,71869,71870,71871,71872,71873,71874,71875,71876,71877,71878,71879,71880,71881,71882,71883,71884,71885,71886,71887,71888,71889,71890,71891,71892,71893,71894,71895,71896,71897,71898,71899,71900,71901,71902,71903,71904,71905,71906,71907,71908,71909,71910,71911,71912,71913,71914,71915,71916,71917,71918,71919,71920,71921,71922,71935,71936,71937,71938,71939,71940,71941,71942,71945,71948,71949,71950,71951,71952,71953,71954,71955,71957,71958,71960,71961,71962,71963,71964,71965,71966,71967,71968,71969,71970,71971,71972,71973,71974,71975,71976,71977,71978,71979,71980,71981,71982,71983,71985,71986,71987,71988,71989,71991,71992,71997,71999,72000,72001,72002,72004,72005,72006,72016,72017,72018,72019,72020,72021,72022,72023,72024,72025,72096,72097,72098,72099,72100,72101,72102,72103,72106,72107,72108,72109,72110,72111,72112,72113,72114,72115,72116,72117,72118,72119,72120,72121,72122,72123,72124,72125,72126,72127,72128,72129,72130,72131,72132,72133,72134,72135,72136,72137,72138,72139,72140,72141,72142,72143,72144,72145,72146,72147,72156,72157,72158,72159,72161,72162,72163,72164,72192,72203,72204,72205,72206,72207,72208,72209,72210,72211,72212,72213,72214,72215,72216,72217,72218,72219,72220,72221,72222,72223,72224,72225,72226,72227,72228,72229,72230,72231,72232,72233,72234,72235,72236,72237,72238,72239,72240,72241,72242,72249,72250,72255,72256,72257,72258,72259,72260,72261,72262,72272,72279,72280,72284,72285,72286,72287,72288,72289,72290,72291,72292,72293,72294,72295,72296,72297,72298,72299,72300,72301,72302,72303,72304,72305,72306,72307,72308,72309,72310,72311,72312,72313,72314,72315,72316,72317,72318,72319,72320,72321,72322,72323,72324,72325,72326,72327,72328,72329,72343,72346,72347,72348,72349,72350,72351,72352,72353,72354,72368,72369,72370,72371,72372,72373,72374,72375,72376,72377,72378,72379,72380,72381,72382,72383,72384,72385,72386,72387,72388,72389,72390,72391,72392,72393,72394,72395,72396,72397,72398,72399,72400,72401,72402,72403,72404,72405,72406,72407,72408,72409,72410,72411,72412,72413,72414,72415,72416,72417,72418,72419,72420,72421,72422,72423,72424,72425,72426,72427,72428,72429,72430,72431,72432,72433,72434,72435,72436,72437,72438,72439,72440,72448,72449,72450,72451,72452,72453,72454,72455,72456,72457,72704,72705,72706,72707,72708,72709,72710,72711,72712,72714,72715,72716,72717,72718,72719,72720,72721,72722,72723,72724,72725,72726,72727,72728,72729,72730,72731,72732,72733,72734,72735,72736,72737,72738,72739,72740,72741,72742,72743,72744,72745,72746,72747,72748,72749,72750,72751,72766,72768,72769,72770,72771,72772,72773,72784,72785,72786,72787,72788,72789,72790,72791,72792,72793,72794,72795,72796,72797,72798,72799,72800,72801,72802,72803,72804,72805,72806,72807,72808,72809,72810,72811,72812,72816,72817,72818,72819,72820,72821,72822,72823,72824,72825,72826,72827,72828,72829,72830,72831,72832,72833,72834,72835,72836,72837,72838,72839,72840,72841,72842,72843,72844,72845,72846,72847,72873,72881,72884,72960,72961,72962,72963,72964,72965,72966,72968,72969,72971,72972,72973,72974,72975,72976,72977,72978,72979,72980,72981,72982,72983,72984,72985,72986,72987,72988,72989,72990,72991,72992,72993,72994,72995,72996,72997,72998,72999,73000,73001,73002,73003,73004,73005,73006,73007,73008,73030,73040,73041,73042,73043,73044,73045,73046,73047,73048,73049,73056,73057,73058,73059,73060,73061,73063,73064,73066,73067,73068,73069,73070,73071,73072,73073,73074,73075,73076,73077,73078,73079,73080,73081,73082,73083,73084,73085,73086,73087,73088,73089,73090,73091,73092,73093,73094,73095,73096,73097,73098,73099,73100,73101,73102,73107,73108,73110,73112,73120,73121,73122,73123,73124,73125,73126,73127,73128,73129,73440,73441,73442,73443,73444,73445,73446,73447,73448,73449,73450,73451,73452,73453,73454,73455,73456,73457,73458,73461,73462,73463,73464,73474,73475,73476,73477,73478,73479,73480,73481,73482,73483,73484,73485,73486,73487,73488,73490,73491,73492,73493,73494,73495,73496,73497,73498,73499,73500,73501,73502,73503,73504,73505,73506,73507,73508,73509,73510,73511,73512,73513,73514,73515,73516,73517,73518,73519,73520,73521,73522,73523,73524,73525,73534,73535,73537,73539,73540,73541,73542,73543,73544,73545,73546,73547,73548,73549,73550,73551,73552,73553,73554,73555,73556,73557,73558,73559,73560,73561,73648,73664,73665,73666,73667,73668,73669,73670,73671,73672,73673,73674,73675,73676,73677,73678,73679,73680,73681,73682,73683,73684,73685,73686,73687,73688,73689,73690,73691,73692,73693,73694,73695,73696,73697,73698,73699,73700,73701,73702,73703,73704,73705,73706,73707,73708,73709,73710,73711,73712,73713,73727,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,74607,74608,74609,74610,74611,74612,74613,74614,74615,74616,74617,74618,74619,74620,74621,74622,74623,74624,74625,74626,74627,74628,74629,74630,74631,74632,74633,74634,74635,74636,74637,74638,74639,74640,74641,74642,74643,74644,74645,74646,74647,74648,74649,74752,74753,74754,74755,74756,74757,74758,74759,74760,74761,74762,74763,74764,74765,74766,74767,74768,74769,74770,74771,74772,74773,74774,74775,74776,74777,74778,74779,74780,74781,74782,74783,74784,74785,74786,74787,74788,74789,74790,74791,74792,74793,74794,74795,74796,74797,74798,74799,74800,74801,74802,74803,74804,74805,74806,74807,74808,74809,74810,74811,74812,74813,74814,74815,74816,74817,74818,74819,74820,74821,74822,74823,74824,74825,74826,74827,74828,74829,74830,74831,74832,74833,74834,74835,74836,74837,74838,74839,74840,74841,74842,74843,74844,74845,74846,74847,74848,74849,74850,74851,74852,74853,74854,74855,74856,74857,74858,74859,74860,74861,74862,74864,74865,74866,74867,74868,74880,74881,74882,74883,74884,74885,74886,74887,74888,74889,74890,74891,74892,74893,74894,74895,74896,74897,74898,74899,74900,74901,74902,74903,74904,74905,74906,74907,74908,74909,74910,74911,74912,74913,74914,74915,74916,74917,74918,74919,74920,74921,74922,74923,74924,74925,74926,74927,74928,74929,74930,74931,74932,74933,74934,74935,74936,74937,74938,74939,74940,74941,74942,74943,74944,74945,74946,74947,74948,74949,74950,74951,74952,74953,74954,74955,74956,74957,74958,74959,74960,74961,74962,74963,74964,74965,74966,74967,74968,74969,74970,74971,74972,74973,74974,74975,74976,74977,74978,74979,74980,74981,74982,74983,74984,74985,74986,74987,74988,74989,74990,74991,74992,74993,74994,74995,74996,74997,74998,74999,75000,75001,75002,75003,75004,75005,75006,75007,75008,75009,75010,75011,75012,75013,75014,75015,75016,75017,75018,75019,75020,75021,75022,75023,75024,75025,75026,75027,75028,75029,75030,75031,75032,75033,75034,75035,75036,75037,75038,75039,75040,75041,75042,75043,75044,75045,75046,75047,75048,75049,75050,75051,75052,75053,75054,75055,75056,75057,75058,75059,75060,75061,75062,75063,75064,75065,75066,75067,75068,75069,75070,75071,75072,75073,75074,75075,77712,77713,77714,77715,77716,77717,77718,77719,77720,77721,77722,77723,77724,77725,77726,77727,77728,77729,77730,77731,77732,77733,77734,77735,77736,77737,77738,77739,77740,77741,77742,77743,77744,77745,77746,77747,77748,77749,77750,77751,77752,77753,77754,77755,77756,77757,77758,77759,77760,77761,77762,77763,77764,77765,77766,77767,77768,77769,77770,77771,77772,77773,77774,77775,77776,77777,77778,77779,77780,77781,77782,77783,77784,77785,77786,77787,77788,77789,77790,77791,77792,77793,77794,77795,77796,77797,77798,77799,77800,77801,77802,77803,77804,77805,77806,77807,77808,77809,77810,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,78895,78913,78914,78915,78916,78917,78918,82944,82945,82946,82947,82948,82949,82950,82951,82952,82953,82954,82955,82956,82957,82958,82959,82960,82961,82962,82963,82964,82965,82966,82967,82968,82969,82970,82971,82972,82973,82974,82975,82976,82977,82978,82979,82980,82981,82982,82983,82984,82985,82986,82987,82988,82989,82990,82991,82992,82993,82994,82995,82996,82997,82998,82999,83000,83001,83002,83003,83004,83005,83006,83007,83008,83009,83010,83011,83012,83013,83014,83015,83016,83017,83018,83019,83020,83021,83022,83023,83024,83025,83026,83027,83028,83029,83030,83031,83032,83033,83034,83035,83036,83037,83038,83039,83040,83041,83042,83043,83044,83045,83046,83047,83048,83049,83050,83051,83052,83053,83054,83055,83056,83057,83058,83059,83060,83061,83062,83063,83064,83065,83066,83067,83068,83069,83070,83071,83072,83073,83074,83075,83076,83077,83078,83079,83080,83081,83082,83083,83084,83085,83086,83087,83088,83089,83090,83091,83092,83093,83094,83095,83096,83097,83098,83099,83100,83101,83102,83103,83104,83105,83106,83107,83108,83109,83110,83111,83112,83113,83114,83115,83116,83117,83118,83119,83120,83121,83122,83123,83124,83125,83126,83127,83128,83129,83130,83131,83132,83133,83134,83135,83136,83137,83138,83139,83140,83141,83142,83143,83144,83145,83146,83147,83148,83149,83150,83151,83152,83153,83154,83155,83156,83157,83158,83159,83160,83161,83162,83163,83164,83165,83166,83167,83168,83169,83170,83171,83172,83173,83174,83175,83176,83177,83178,83179,83180,83181,83182,83183,83184,83185,83186,83187,83188,83189,83190,83191,83192,83193,83194,83195,83196,83197,83198,83199,83200,83201,83202,83203,83204,83205,83206,83207,83208,83209,83210,83211,83212,83213,83214,83215,83216,83217,83218,83219,83220,83221,83222,83223,83224,83225,83226,83227,83228,83229,83230,83231,83232,83233,83234,83235,83236,83237,83238,83239,83240,83241,83242,83243,83244,83245,83246,83247,83248,83249,83250,83251,83252,83253,83254,83255,83256,83257,83258,83259,83260,83261,83262,83263,83264,83265,83266,83267,83268,83269,83270,83271,83272,83273,83274,83275,83276,83277,83278,83279,83280,83281,83282,83283,83284,83285,83286,83287,83288,83289,83290,83291,83292,83293,83294,83295,83296,83297,83298,83299,83300,83301,83302,83303,83304,83305,83306,83307,83308,83309,83310,83311,83312,83313,83314,83315,83316,83317,83318,83319,83320,83321,83322,83323,83324,83325,83326,83327,83328,83329,83330,83331,83332,83333,83334,83335,83336,83337,83338,83339,83340,83341,83342,83343,83344,83345,83346,83347,83348,83349,83350,83351,83352,83353,83354,83355,83356,83357,83358,83359,83360,83361,83362,83363,83364,83365,83366,83367,83368,83369,83370,83371,83372,83373,83374,83375,83376,83377,83378,83379,83380,83381,83382,83383,83384,83385,83386,83387,83388,83389,83390,83391,83392,83393,83394,83395,83396,83397,83398,83399,83400,83401,83402,83403,83404,83405,83406,83407,83408,83409,83410,83411,83412,83413,83414,83415,83416,83417,83418,83419,83420,83421,83422,83423,83424,83425,83426,83427,83428,83429,83430,83431,83432,83433,83434,83435,83436,83437,83438,83439,83440,83441,83442,83443,83444,83445,83446,83447,83448,83449,83450,83451,83452,83453,83454,83455,83456,83457,83458,83459,83460,83461,83462,83463,83464,83465,83466,83467,83468,83469,83470,83471,83472,83473,83474,83475,83476,83477,83478,83479,83480,83481,83482,83483,83484,83485,83486,83487,83488,83489,83490,83491,83492,83493,83494,83495,83496,83497,83498,83499,83500,83501,83502,83503,83504,83505,83506,83507,83508,83509,83510,83511,83512,83513,83514,83515,83516,83517,83518,83519,83520,83521,83522,83523,83524,83525,83526,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,92736,92737,92738,92739,92740,92741,92742,92743,92744,92745,92746,92747,92748,92749,92750,92751,92752,92753,92754,92755,92756,92757,92758,92759,92760,92761,92762,92763,92764,92765,92766,92768,92769,92770,92771,92772,92773,92774,92775,92776,92777,92782,92783,92784,92785,92786,92787,92788,92789,92790,92791,92792,92793,92794,92795,92796,92797,92798,92799,92800,92801,92802,92803,92804,92805,92806,92807,92808,92809,92810,92811,92812,92813,92814,92815,92816,92817,92818,92819,92820,92821,92822,92823,92824,92825,92826,92827,92828,92829,92830,92831,92832,92833,92834,92835,92836,92837,92838,92839,92840,92841,92842,92843,92844,92845,92846,92847,92848,92849,92850,92851,92852,92853,92854,92855,92856,92857,92858,92859,92860,92861,92862,92864,92865,92866,92867,92868,92869,92870,92871,92872,92873,92880,92881,92882,92883,92884,92885,92886,92887,92888,92889,92890,92891,92892,92893,92894,92895,92896,92897,92898,92899,92900,92901,92902,92903,92904,92905,92906,92907,92908,92909,92917,92928,92929,92930,92931,92932,92933,92934,92935,92936,92937,92938,92939,92940,92941,92942,92943,92944,92945,92946,92947,92948,92949,92950,92951,92952,92953,92954,92955,92956,92957,92958,92959,92960,92961,92962,92963,92964,92965,92966,92967,92968,92969,92970,92971,92972,92973,92974,92975,92983,92984,92985,92986,92987,92988,92989,92990,92991,92992,92993,92994,92995,92996,92997,93008,93009,93010,93011,93012,93013,93014,93015,93016,93017,93019,93020,93021,93022,93023,93024,93025,93027,93028,93029,93030,93031,93032,93033,93034,93035,93036,93037,93038,93039,93040,93041,93042,93043,93044,93045,93046,93047,93053,93054,93055,93056,93057,93058,93059,93060,93061,93062,93063,93064,93065,93066,93067,93068,93069,93070,93071,93760,93761,93762,93763,93764,93765,93766,93767,93768,93769,93770,93771,93772,93773,93774,93775,93776,93777,93778,93779,93780,93781,93782,93783,93784,93785,93786,93787,93788,93789,93790,93791,93792,93793,93794,93795,93796,93797,93798,93799,93800,93801,93802,93803,93804,93805,93806,93807,93808,93809,93810,93811,93812,93813,93814,93815,93816,93817,93818,93819,93820,93821,93822,93823,93824,93825,93826,93827,93828,93829,93830,93831,93832,93833,93834,93835,93836,93837,93838,93839,93840,93841,93842,93843,93844,93845,93846,93847,93848,93849,93850,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94021,94022,94023,94024,94025,94026,94032,94033,94034,94035,94036,94037,94038,94039,94040,94041,94042,94043,94044,94045,94046,94047,94048,94049,94050,94051,94052,94053,94054,94055,94056,94057,94058,94059,94060,94061,94062,94063,94064,94065,94066,94067,94068,94069,94070,94071,94072,94073,94074,94075,94076,94077,94078,94079,94080,94081,94082,94083,94084,94085,94086,94087,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111,94176,94177,94178,94179,94192,94193,94208,94209,94210,94211,94212,94213,94214,94215,94216,94217,94218,94219,94220,94221,94222,94223,94224,94225,94226,94227,94228,94229,94230,94231,94232,94233,94234,94235,94236,94237,94238,94239,94240,94241,94242,94243,94244,94245,94246,94247,94248,94249,94250,94251,94252,94253,94254,94255,94256,94257,94258,94259,94260,94261,94262,94263,94264,94265,94266,94267,94268,94269,94270,94271,94272,94273,94274,94275,94276,94277,94278,94279,94280,94281,94282,94283,94284,94285,94286,94287,94288,94289,94290,94291,94292,94293,94294,94295,94296,94297,94298,94299,94300,94301,94302,94303,94304,94305,94306,94307,94308,94309,94310,94311,94312,94313,94314,94315,94316,94317,94318,94319,94320,94321,94322,94323,94324,94325,94326,94327,94328,94329,94330,94331,94332,94333,94334,94335,94336,94337,94338,94339,94340,94341,94342,94343,94344,94345,94346,94347,94348,94349,94350,94351,94352,94353,94354,94355,94356,94357,94358,94359,94360,94361,94362,94363,94364,94365,94366,94367,94368,94369,94370,94371,94372,94373,94374,94375,94376,94377,94378,94379,94380,94381,94382,94383,94384,94385,94386,94387,94388,94389,94390,94391,94392,94393,94394,94395,94396,94397,94398,94399,94400,94401,94402,94403,94404,94405,94406,94407,94408,94409,94410,94411,94412,94413,94414,94415,94416,94417,94418,94419,94420,94421,94422,94423,94424,94425,94426,94427,94428,94429,94430,94431,94432,94433,94434,94435,94436,94437,94438,94439,94440,94441,94442,94443,94444,94445,94446,94447,94448,94449,94450,94451,94452,94453,94454,94455,94456,94457,94458,94459,94460,94461,94462,94463,94464,94465,94466,94467,94468,94469,94470,94471,94472,94473,94474,94475,94476,94477,94478,94479,94480,94481,94482,94483,94484,94485,94486,94487,94488,94489,94490,94491,94492,94493,94494,94495,94496,94497,94498,94499,94500,94501,94502,94503,94504,94505,94506,94507,94508,94509,94510,94511,94512,94513,94514,94515,94516,94517,94518,94519,94520,94521,94522,94523,94524,94525,94526,94527,94528,94529,94530,94531,94532,94533,94534,94535,94536,94537,94538,94539,94540,94541,94542,94543,94544,94545,94546,94547,94548,94549,94550,94551,94552,94553,94554,94555,94556,94557,94558,94559,94560,94561,94562,94563,94564,94565,94566,94567,94568,94569,94570,94571,94572,94573,94574,94575,94576,94577,94578,94579,94580,94581,94582,94583,94584,94585,94586,94587,94588,94589,94590,94591,94592,94593,94594,94595,94596,94597,94598,94599,94600,94601,94602,94603,94604,94605,94606,94607,94608,94609,94610,94611,94612,94613,94614,94615,94616,94617,94618,94619,94620,94621,94622,94623,94624,94625,94626,94627,94628,94629,94630,94631,94632,94633,94634,94635,94636,94637,94638,94639,94640,94641,94642,94643,94644,94645,94646,94647,94648,94649,94650,94651,94652,94653,94654,94655,94656,94657,94658,94659,94660,94661,94662,94663,94664,94665,94666,94667,94668,94669,94670,94671,94672,94673,94674,94675,94676,94677,94678,94679,94680,94681,94682,94683,94684,94685,94686,94687,94688,94689,94690,94691,94692,94693,94694,94695,94696,94697,94698,94699,94700,94701,94702,94703,94704,94705,94706,94707,94708,94709,94710,94711,94712,94713,94714,94715,94716,94717,94718,94719,94720,94721,94722,94723,94724,94725,94726,94727,94728,94729,94730,94731,94732,94733,94734,94735,94736,94737,94738,94739,94740,94741,94742,94743,94744,94745,94746,94747,94748,94749,94750,94751,94752,94753,94754,94755,94756,94757,94758,94759,94760,94761,94762,94763,94764,94765,94766,94767,94768,94769,94770,94771,94772,94773,94774,94775,94776,94777,94778,94779,94780,94781,94782,94783,94784,94785,94786,94787,94788,94789,94790,94791,94792,94793,94794,94795,94796,94797,94798,94799,94800,94801,94802,94803,94804,94805,94806,94807,94808,94809,94810,94811,94812,94813,94814,94815,94816,94817,94818,94819,94820,94821,94822,94823,94824,94825,94826,94827,94828,94829,94830,94831,94832,94833,94834,94835,94836,94837,94838,94839,94840,94841,94842,94843,94844,94845,94846,94847,94848,94849,94850,94851,94852,94853,94854,94855,94856,94857,94858,94859,94860,94861,94862,94863,94864,94865,94866,94867,94868,94869,94870,94871,94872,94873,94874,94875,94876,94877,94878,94879,94880,94881,94882,94883,94884,94885,94886,94887,94888,94889,94890,94891,94892,94893,94894,94895,94896,94897,94898,94899,94900,94901,94902,94903,94904,94905,94906,94907,94908,94909,94910,94911,94912,94913,94914,94915,94916,94917,94918,94919,94920,94921,94922,94923,94924,94925,94926,94927,94928,94929,94930,94931,94932,94933,94934,94935,94936,94937,94938,94939,94940,94941,94942,94943,94944,94945,94946,94947,94948,94949,94950,94951,94952,94953,94954,94955,94956,94957,94958,94959,94960,94961,94962,94963,94964,94965,94966,94967,94968,94969,94970,94971,94972,94973,94974,94975,94976,94977,94978,94979,94980,94981,94982,94983,94984,94985,94986,94987,94988,94989,94990,94991,94992,94993,94994,94995,94996,94997,94998,94999,95000,95001,95002,95003,95004,95005,95006,95007,95008,95009,95010,95011,95012,95013,95014,95015,95016,95017,95018,95019,95020,95021,95022,95023,95024,95025,95026,95027,95028,95029,95030,95031,95032,95033,95034,95035,95036,95037,95038,95039,95040,95041,95042,95043,95044,95045,95046,95047,95048,95049,95050,95051,95052,95053,95054,95055,95056,95057,95058,95059,95060,95061,95062,95063,95064,95065,95066,95067,95068,95069,95070,95071,95072,95073,95074,95075,95076,95077,95078,95079,95080,95081,95082,95083,95084,95085,95086,95087,95088,95089,95090,95091,95092,95093,95094,95095,95096,95097,95098,95099,95100,95101,95102,95103,95104,95105,95106,95107,95108,95109,95110,95111,95112,95113,95114,95115,95116,95117,95118,95119,95120,95121,95122,95123,95124,95125,95126,95127,95128,95129,95130,95131,95132,95133,95134,95135,95136,95137,95138,95139,95140,95141,95142,95143,95144,95145,95146,95147,95148,95149,95150,95151,95152,95153,95154,95155,95156,95157,95158,95159,95160,95161,95162,95163,95164,95165,95166,95167,95168,95169,95170,95171,95172,95173,95174,95175,95176,95177,95178,95179,95180,95181,95182,95183,95184,95185,95186,95187,95188,95189,95190,95191,95192,95193,95194,95195,95196,95197,95198,95199,95200,95201,95202,95203,95204,95205,95206,95207,95208,95209,95210,95211,95212,95213,95214,95215,95216,95217,95218,95219,95220,95221,95222,95223,95224,95225,95226,95227,95228,95229,95230,95231,95232,95233,95234,95235,95236,95237,95238,95239,95240,95241,95242,95243,95244,95245,95246,95247,95248,95249,95250,95251,95252,95253,95254,95255,95256,95257,95258,95259,95260,95261,95262,95263,95264,95265,95266,95267,95268,95269,95270,95271,95272,95273,95274,95275,95276,95277,95278,95279,95280,95281,95282,95283,95284,95285,95286,95287,95288,95289,95290,95291,95292,95293,95294,95295,95296,95297,95298,95299,95300,95301,95302,95303,95304,95305,95306,95307,95308,95309,95310,95311,95312,95313,95314,95315,95316,95317,95318,95319,95320,95321,95322,95323,95324,95325,95326,95327,95328,95329,95330,95331,95332,95333,95334,95335,95336,95337,95338,95339,95340,95341,95342,95343,95344,95345,95346,95347,95348,95349,95350,95351,95352,95353,95354,95355,95356,95357,95358,95359,95360,95361,95362,95363,95364,95365,95366,95367,95368,95369,95370,95371,95372,95373,95374,95375,95376,95377,95378,95379,95380,95381,95382,95383,95384,95385,95386,95387,95388,95389,95390,95391,95392,95393,95394,95395,95396,95397,95398,95399,95400,95401,95402,95403,95404,95405,95406,95407,95408,95409,95410,95411,95412,95413,95414,95415,95416,95417,95418,95419,95420,95421,95422,95423,95424,95425,95426,95427,95428,95429,95430,95431,95432,95433,95434,95435,95436,95437,95438,95439,95440,95441,95442,95443,95444,95445,95446,95447,95448,95449,95450,95451,95452,95453,95454,95455,95456,95457,95458,95459,95460,95461,95462,95463,95464,95465,95466,95467,95468,95469,95470,95471,95472,95473,95474,95475,95476,95477,95478,95479,95480,95481,95482,95483,95484,95485,95486,95487,95488,95489,95490,95491,95492,95493,95494,95495,95496,95497,95498,95499,95500,95501,95502,95503,95504,95505,95506,95507,95508,95509,95510,95511,95512,95513,95514,95515,95516,95517,95518,95519,95520,95521,95522,95523,95524,95525,95526,95527,95528,95529,95530,95531,95532,95533,95534,95535,95536,95537,95538,95539,95540,95541,95542,95543,95544,95545,95546,95547,95548,95549,95550,95551,95552,95553,95554,95555,95556,95557,95558,95559,95560,95561,95562,95563,95564,95565,95566,95567,95568,95569,95570,95571,95572,95573,95574,95575,95576,95577,95578,95579,95580,95581,95582,95583,95584,95585,95586,95587,95588,95589,95590,95591,95592,95593,95594,95595,95596,95597,95598,95599,95600,95601,95602,95603,95604,95605,95606,95607,95608,95609,95610,95611,95612,95613,95614,95615,95616,95617,95618,95619,95620,95621,95622,95623,95624,95625,95626,95627,95628,95629,95630,95631,95632,95633,95634,95635,95636,95637,95638,95639,95640,95641,95642,95643,95644,95645,95646,95647,95648,95649,95650,95651,95652,95653,95654,95655,95656,95657,95658,95659,95660,95661,95662,95663,95664,95665,95666,95667,95668,95669,95670,95671,95672,95673,95674,95675,95676,95677,95678,95679,95680,95681,95682,95683,95684,95685,95686,95687,95688,95689,95690,95691,95692,95693,95694,95695,95696,95697,95698,95699,95700,95701,95702,95703,95704,95705,95706,95707,95708,95709,95710,95711,95712,95713,95714,95715,95716,95717,95718,95719,95720,95721,95722,95723,95724,95725,95726,95727,95728,95729,95730,95731,95732,95733,95734,95735,95736,95737,95738,95739,95740,95741,95742,95743,95744,95745,95746,95747,95748,95749,95750,95751,95752,95753,95754,95755,95756,95757,95758,95759,95760,95761,95762,95763,95764,95765,95766,95767,95768,95769,95770,95771,95772,95773,95774,95775,95776,95777,95778,95779,95780,95781,95782,95783,95784,95785,95786,95787,95788,95789,95790,95791,95792,95793,95794,95795,95796,95797,95798,95799,95800,95801,95802,95803,95804,95805,95806,95807,95808,95809,95810,95811,95812,95813,95814,95815,95816,95817,95818,95819,95820,95821,95822,95823,95824,95825,95826,95827,95828,95829,95830,95831,95832,95833,95834,95835,95836,95837,95838,95839,95840,95841,95842,95843,95844,95845,95846,95847,95848,95849,95850,95851,95852,95853,95854,95855,95856,95857,95858,95859,95860,95861,95862,95863,95864,95865,95866,95867,95868,95869,95870,95871,95872,95873,95874,95875,95876,95877,95878,95879,95880,95881,95882,95883,95884,95885,95886,95887,95888,95889,95890,95891,95892,95893,95894,95895,95896,95897,95898,95899,95900,95901,95902,95903,95904,95905,95906,95907,95908,95909,95910,95911,95912,95913,95914,95915,95916,95917,95918,95919,95920,95921,95922,95923,95924,95925,95926,95927,95928,95929,95930,95931,95932,95933,95934,95935,95936,95937,95938,95939,95940,95941,95942,95943,95944,95945,95946,95947,95948,95949,95950,95951,95952,95953,95954,95955,95956,95957,95958,95959,95960,95961,95962,95963,95964,95965,95966,95967,95968,95969,95970,95971,95972,95973,95974,95975,95976,95977,95978,95979,95980,95981,95982,95983,95984,95985,95986,95987,95988,95989,95990,95991,95992,95993,95994,95995,95996,95997,95998,95999,96000,96001,96002,96003,96004,96005,96006,96007,96008,96009,96010,96011,96012,96013,96014,96015,96016,96017,96018,96019,96020,96021,96022,96023,96024,96025,96026,96027,96028,96029,96030,96031,96032,96033,96034,96035,96036,96037,96038,96039,96040,96041,96042,96043,96044,96045,96046,96047,96048,96049,96050,96051,96052,96053,96054,96055,96056,96057,96058,96059,96060,96061,96062,96063,96064,96065,96066,96067,96068,96069,96070,96071,96072,96073,96074,96075,96076,96077,96078,96079,96080,96081,96082,96083,96084,96085,96086,96087,96088,96089,96090,96091,96092,96093,96094,96095,96096,96097,96098,96099,96100,96101,96102,96103,96104,96105,96106,96107,96108,96109,96110,96111,96112,96113,96114,96115,96116,96117,96118,96119,96120,96121,96122,96123,96124,96125,96126,96127,96128,96129,96130,96131,96132,96133,96134,96135,96136,96137,96138,96139,96140,96141,96142,96143,96144,96145,96146,96147,96148,96149,96150,96151,96152,96153,96154,96155,96156,96157,96158,96159,96160,96161,96162,96163,96164,96165,96166,96167,96168,96169,96170,96171,96172,96173,96174,96175,96176,96177,96178,96179,96180,96181,96182,96183,96184,96185,96186,96187,96188,96189,96190,96191,96192,96193,96194,96195,96196,96197,96198,96199,96200,96201,96202,96203,96204,96205,96206,96207,96208,96209,96210,96211,96212,96213,96214,96215,96216,96217,96218,96219,96220,96221,96222,96223,96224,96225,96226,96227,96228,96229,96230,96231,96232,96233,96234,96235,96236,96237,96238,96239,96240,96241,96242,96243,96244,96245,96246,96247,96248,96249,96250,96251,96252,96253,96254,96255,96256,96257,96258,96259,96260,96261,96262,96263,96264,96265,96266,96267,96268,96269,96270,96271,96272,96273,96274,96275,96276,96277,96278,96279,96280,96281,96282,96283,96284,96285,96286,96287,96288,96289,96290,96291,96292,96293,96294,96295,96296,96297,96298,96299,96300,96301,96302,96303,96304,96305,96306,96307,96308,96309,96310,96311,96312,96313,96314,96315,96316,96317,96318,96319,96320,96321,96322,96323,96324,96325,96326,96327,96328,96329,96330,96331,96332,96333,96334,96335,96336,96337,96338,96339,96340,96341,96342,96343,96344,96345,96346,96347,96348,96349,96350,96351,96352,96353,96354,96355,96356,96357,96358,96359,96360,96361,96362,96363,96364,96365,96366,96367,96368,96369,96370,96371,96372,96373,96374,96375,96376,96377,96378,96379,96380,96381,96382,96383,96384,96385,96386,96387,96388,96389,96390,96391,96392,96393,96394,96395,96396,96397,96398,96399,96400,96401,96402,96403,96404,96405,96406,96407,96408,96409,96410,96411,96412,96413,96414,96415,96416,96417,96418,96419,96420,96421,96422,96423,96424,96425,96426,96427,96428,96429,96430,96431,96432,96433,96434,96435,96436,96437,96438,96439,96440,96441,96442,96443,96444,96445,96446,96447,96448,96449,96450,96451,96452,96453,96454,96455,96456,96457,96458,96459,96460,96461,96462,96463,96464,96465,96466,96467,96468,96469,96470,96471,96472,96473,96474,96475,96476,96477,96478,96479,96480,96481,96482,96483,96484,96485,96486,96487,96488,96489,96490,96491,96492,96493,96494,96495,96496,96497,96498,96499,96500,96501,96502,96503,96504,96505,96506,96507,96508,96509,96510,96511,96512,96513,96514,96515,96516,96517,96518,96519,96520,96521,96522,96523,96524,96525,96526,96527,96528,96529,96530,96531,96532,96533,96534,96535,96536,96537,96538,96539,96540,96541,96542,96543,96544,96545,96546,96547,96548,96549,96550,96551,96552,96553,96554,96555,96556,96557,96558,96559,96560,96561,96562,96563,96564,96565,96566,96567,96568,96569,96570,96571,96572,96573,96574,96575,96576,96577,96578,96579,96580,96581,96582,96583,96584,96585,96586,96587,96588,96589,96590,96591,96592,96593,96594,96595,96596,96597,96598,96599,96600,96601,96602,96603,96604,96605,96606,96607,96608,96609,96610,96611,96612,96613,96614,96615,96616,96617,96618,96619,96620,96621,96622,96623,96624,96625,96626,96627,96628,96629,96630,96631,96632,96633,96634,96635,96636,96637,96638,96639,96640,96641,96642,96643,96644,96645,96646,96647,96648,96649,96650,96651,96652,96653,96654,96655,96656,96657,96658,96659,96660,96661,96662,96663,96664,96665,96666,96667,96668,96669,96670,96671,96672,96673,96674,96675,96676,96677,96678,96679,96680,96681,96682,96683,96684,96685,96686,96687,96688,96689,96690,96691,96692,96693,96694,96695,96696,96697,96698,96699,96700,96701,96702,96703,96704,96705,96706,96707,96708,96709,96710,96711,96712,96713,96714,96715,96716,96717,96718,96719,96720,96721,96722,96723,96724,96725,96726,96727,96728,96729,96730,96731,96732,96733,96734,96735,96736,96737,96738,96739,96740,96741,96742,96743,96744,96745,96746,96747,96748,96749,96750,96751,96752,96753,96754,96755,96756,96757,96758,96759,96760,96761,96762,96763,96764,96765,96766,96767,96768,96769,96770,96771,96772,96773,96774,96775,96776,96777,96778,96779,96780,96781,96782,96783,96784,96785,96786,96787,96788,96789,96790,96791,96792,96793,96794,96795,96796,96797,96798,96799,96800,96801,96802,96803,96804,96805,96806,96807,96808,96809,96810,96811,96812,96813,96814,96815,96816,96817,96818,96819,96820,96821,96822,96823,96824,96825,96826,96827,96828,96829,96830,96831,96832,96833,96834,96835,96836,96837,96838,96839,96840,96841,96842,96843,96844,96845,96846,96847,96848,96849,96850,96851,96852,96853,96854,96855,96856,96857,96858,96859,96860,96861,96862,96863,96864,96865,96866,96867,96868,96869,96870,96871,96872,96873,96874,96875,96876,96877,96878,96879,96880,96881,96882,96883,96884,96885,96886,96887,96888,96889,96890,96891,96892,96893,96894,96895,96896,96897,96898,96899,96900,96901,96902,96903,96904,96905,96906,96907,96908,96909,96910,96911,96912,96913,96914,96915,96916,96917,96918,96919,96920,96921,96922,96923,96924,96925,96926,96927,96928,96929,96930,96931,96932,96933,96934,96935,96936,96937,96938,96939,96940,96941,96942,96943,96944,96945,96946,96947,96948,96949,96950,96951,96952,96953,96954,96955,96956,96957,96958,96959,96960,96961,96962,96963,96964,96965,96966,96967,96968,96969,96970,96971,96972,96973,96974,96975,96976,96977,96978,96979,96980,96981,96982,96983,96984,96985,96986,96987,96988,96989,96990,96991,96992,96993,96994,96995,96996,96997,96998,96999,97000,97001,97002,97003,97004,97005,97006,97007,97008,97009,97010,97011,97012,97013,97014,97015,97016,97017,97018,97019,97020,97021,97022,97023,97024,97025,97026,97027,97028,97029,97030,97031,97032,97033,97034,97035,97036,97037,97038,97039,97040,97041,97042,97043,97044,97045,97046,97047,97048,97049,97050,97051,97052,97053,97054,97055,97056,97057,97058,97059,97060,97061,97062,97063,97064,97065,97066,97067,97068,97069,97070,97071,97072,97073,97074,97075,97076,97077,97078,97079,97080,97081,97082,97083,97084,97085,97086,97087,97088,97089,97090,97091,97092,97093,97094,97095,97096,97097,97098,97099,97100,97101,97102,97103,97104,97105,97106,97107,97108,97109,97110,97111,97112,97113,97114,97115,97116,97117,97118,97119,97120,97121,97122,97123,97124,97125,97126,97127,97128,97129,97130,97131,97132,97133,97134,97135,97136,97137,97138,97139,97140,97141,97142,97143,97144,97145,97146,97147,97148,97149,97150,97151,97152,97153,97154,97155,97156,97157,97158,97159,97160,97161,97162,97163,97164,97165,97166,97167,97168,97169,97170,97171,97172,97173,97174,97175,97176,97177,97178,97179,97180,97181,97182,97183,97184,97185,97186,97187,97188,97189,97190,97191,97192,97193,97194,97195,97196,97197,97198,97199,97200,97201,97202,97203,97204,97205,97206,97207,97208,97209,97210,97211,97212,97213,97214,97215,97216,97217,97218,97219,97220,97221,97222,97223,97224,97225,97226,97227,97228,97229,97230,97231,97232,97233,97234,97235,97236,97237,97238,97239,97240,97241,97242,97243,97244,97245,97246,97247,97248,97249,97250,97251,97252,97253,97254,97255,97256,97257,97258,97259,97260,97261,97262,97263,97264,97265,97266,97267,97268,97269,97270,97271,97272,97273,97274,97275,97276,97277,97278,97279,97280,97281,97282,97283,97284,97285,97286,97287,97288,97289,97290,97291,97292,97293,97294,97295,97296,97297,97298,97299,97300,97301,97302,97303,97304,97305,97306,97307,97308,97309,97310,97311,97312,97313,97314,97315,97316,97317,97318,97319,97320,97321,97322,97323,97324,97325,97326,97327,97328,97329,97330,97331,97332,97333,97334,97335,97336,97337,97338,97339,97340,97341,97342,97343,97344,97345,97346,97347,97348,97349,97350,97351,97352,97353,97354,97355,97356,97357,97358,97359,97360,97361,97362,97363,97364,97365,97366,97367,97368,97369,97370,97371,97372,97373,97374,97375,97376,97377,97378,97379,97380,97381,97382,97383,97384,97385,97386,97387,97388,97389,97390,97391,97392,97393,97394,97395,97396,97397,97398,97399,97400,97401,97402,97403,97404,97405,97406,97407,97408,97409,97410,97411,97412,97413,97414,97415,97416,97417,97418,97419,97420,97421,97422,97423,97424,97425,97426,97427,97428,97429,97430,97431,97432,97433,97434,97435,97436,97437,97438,97439,97440,97441,97442,97443,97444,97445,97446,97447,97448,97449,97450,97451,97452,97453,97454,97455,97456,97457,97458,97459,97460,97461,97462,97463,97464,97465,97466,97467,97468,97469,97470,97471,97472,97473,97474,97475,97476,97477,97478,97479,97480,97481,97482,97483,97484,97485,97486,97487,97488,97489,97490,97491,97492,97493,97494,97495,97496,97497,97498,97499,97500,97501,97502,97503,97504,97505,97506,97507,97508,97509,97510,97511,97512,97513,97514,97515,97516,97517,97518,97519,97520,97521,97522,97523,97524,97525,97526,97527,97528,97529,97530,97531,97532,97533,97534,97535,97536,97537,97538,97539,97540,97541,97542,97543,97544,97545,97546,97547,97548,97549,97550,97551,97552,97553,97554,97555,97556,97557,97558,97559,97560,97561,97562,97563,97564,97565,97566,97567,97568,97569,97570,97571,97572,97573,97574,97575,97576,97577,97578,97579,97580,97581,97582,97583,97584,97585,97586,97587,97588,97589,97590,97591,97592,97593,97594,97595,97596,97597,97598,97599,97600,97601,97602,97603,97604,97605,97606,97607,97608,97609,97610,97611,97612,97613,97614,97615,97616,97617,97618,97619,97620,97621,97622,97623,97624,97625,97626,97627,97628,97629,97630,97631,97632,97633,97634,97635,97636,97637,97638,97639,97640,97641,97642,97643,97644,97645,97646,97647,97648,97649,97650,97651,97652,97653,97654,97655,97656,97657,97658,97659,97660,97661,97662,97663,97664,97665,97666,97667,97668,97669,97670,97671,97672,97673,97674,97675,97676,97677,97678,97679,97680,97681,97682,97683,97684,97685,97686,97687,97688,97689,97690,97691,97692,97693,97694,97695,97696,97697,97698,97699,97700,97701,97702,97703,97704,97705,97706,97707,97708,97709,97710,97711,97712,97713,97714,97715,97716,97717,97718,97719,97720,97721,97722,97723,97724,97725,97726,97727,97728,97729,97730,97731,97732,97733,97734,97735,97736,97737,97738,97739,97740,97741,97742,97743,97744,97745,97746,97747,97748,97749,97750,97751,97752,97753,97754,97755,97756,97757,97758,97759,97760,97761,97762,97763,97764,97765,97766,97767,97768,97769,97770,97771,97772,97773,97774,97775,97776,97777,97778,97779,97780,97781,97782,97783,97784,97785,97786,97787,97788,97789,97790,97791,97792,97793,97794,97795,97796,97797,97798,97799,97800,97801,97802,97803,97804,97805,97806,97807,97808,97809,97810,97811,97812,97813,97814,97815,97816,97817,97818,97819,97820,97821,97822,97823,97824,97825,97826,97827,97828,97829,97830,97831,97832,97833,97834,97835,97836,97837,97838,97839,97840,97841,97842,97843,97844,97845,97846,97847,97848,97849,97850,97851,97852,97853,97854,97855,97856,97857,97858,97859,97860,97861,97862,97863,97864,97865,97866,97867,97868,97869,97870,97871,97872,97873,97874,97875,97876,97877,97878,97879,97880,97881,97882,97883,97884,97885,97886,97887,97888,97889,97890,97891,97892,97893,97894,97895,97896,97897,97898,97899,97900,97901,97902,97903,97904,97905,97906,97907,97908,97909,97910,97911,97912,97913,97914,97915,97916,97917,97918,97919,97920,97921,97922,97923,97924,97925,97926,97927,97928,97929,97930,97931,97932,97933,97934,97935,97936,97937,97938,97939,97940,97941,97942,97943,97944,97945,97946,97947,97948,97949,97950,97951,97952,97953,97954,97955,97956,97957,97958,97959,97960,97961,97962,97963,97964,97965,97966,97967,97968,97969,97970,97971,97972,97973,97974,97975,97976,97977,97978,97979,97980,97981,97982,97983,97984,97985,97986,97987,97988,97989,97990,97991,97992,97993,97994,97995,97996,97997,97998,97999,98000,98001,98002,98003,98004,98005,98006,98007,98008,98009,98010,98011,98012,98013,98014,98015,98016,98017,98018,98019,98020,98021,98022,98023,98024,98025,98026,98027,98028,98029,98030,98031,98032,98033,98034,98035,98036,98037,98038,98039,98040,98041,98042,98043,98044,98045,98046,98047,98048,98049,98050,98051,98052,98053,98054,98055,98056,98057,98058,98059,98060,98061,98062,98063,98064,98065,98066,98067,98068,98069,98070,98071,98072,98073,98074,98075,98076,98077,98078,98079,98080,98081,98082,98083,98084,98085,98086,98087,98088,98089,98090,98091,98092,98093,98094,98095,98096,98097,98098,98099,98100,98101,98102,98103,98104,98105,98106,98107,98108,98109,98110,98111,98112,98113,98114,98115,98116,98117,98118,98119,98120,98121,98122,98123,98124,98125,98126,98127,98128,98129,98130,98131,98132,98133,98134,98135,98136,98137,98138,98139,98140,98141,98142,98143,98144,98145,98146,98147,98148,98149,98150,98151,98152,98153,98154,98155,98156,98157,98158,98159,98160,98161,98162,98163,98164,98165,98166,98167,98168,98169,98170,98171,98172,98173,98174,98175,98176,98177,98178,98179,98180,98181,98182,98183,98184,98185,98186,98187,98188,98189,98190,98191,98192,98193,98194,98195,98196,98197,98198,98199,98200,98201,98202,98203,98204,98205,98206,98207,98208,98209,98210,98211,98212,98213,98214,98215,98216,98217,98218,98219,98220,98221,98222,98223,98224,98225,98226,98227,98228,98229,98230,98231,98232,98233,98234,98235,98236,98237,98238,98239,98240,98241,98242,98243,98244,98245,98246,98247,98248,98249,98250,98251,98252,98253,98254,98255,98256,98257,98258,98259,98260,98261,98262,98263,98264,98265,98266,98267,98268,98269,98270,98271,98272,98273,98274,98275,98276,98277,98278,98279,98280,98281,98282,98283,98284,98285,98286,98287,98288,98289,98290,98291,98292,98293,98294,98295,98296,98297,98298,98299,98300,98301,98302,98303,98304,98305,98306,98307,98308,98309,98310,98311,98312,98313,98314,98315,98316,98317,98318,98319,98320,98321,98322,98323,98324,98325,98326,98327,98328,98329,98330,98331,98332,98333,98334,98335,98336,98337,98338,98339,98340,98341,98342,98343,98344,98345,98346,98347,98348,98349,98350,98351,98352,98353,98354,98355,98356,98357,98358,98359,98360,98361,98362,98363,98364,98365,98366,98367,98368,98369,98370,98371,98372,98373,98374,98375,98376,98377,98378,98379,98380,98381,98382,98383,98384,98385,98386,98387,98388,98389,98390,98391,98392,98393,98394,98395,98396,98397,98398,98399,98400,98401,98402,98403,98404,98405,98406,98407,98408,98409,98410,98411,98412,98413,98414,98415,98416,98417,98418,98419,98420,98421,98422,98423,98424,98425,98426,98427,98428,98429,98430,98431,98432,98433,98434,98435,98436,98437,98438,98439,98440,98441,98442,98443,98444,98445,98446,98447,98448,98449,98450,98451,98452,98453,98454,98455,98456,98457,98458,98459,98460,98461,98462,98463,98464,98465,98466,98467,98468,98469,98470,98471,98472,98473,98474,98475,98476,98477,98478,98479,98480,98481,98482,98483,98484,98485,98486,98487,98488,98489,98490,98491,98492,98493,98494,98495,98496,98497,98498,98499,98500,98501,98502,98503,98504,98505,98506,98507,98508,98509,98510,98511,98512,98513,98514,98515,98516,98517,98518,98519,98520,98521,98522,98523,98524,98525,98526,98527,98528,98529,98530,98531,98532,98533,98534,98535,98536,98537,98538,98539,98540,98541,98542,98543,98544,98545,98546,98547,98548,98549,98550,98551,98552,98553,98554,98555,98556,98557,98558,98559,98560,98561,98562,98563,98564,98565,98566,98567,98568,98569,98570,98571,98572,98573,98574,98575,98576,98577,98578,98579,98580,98581,98582,98583,98584,98585,98586,98587,98588,98589,98590,98591,98592,98593,98594,98595,98596,98597,98598,98599,98600,98601,98602,98603,98604,98605,98606,98607,98608,98609,98610,98611,98612,98613,98614,98615,98616,98617,98618,98619,98620,98621,98622,98623,98624,98625,98626,98627,98628,98629,98630,98631,98632,98633,98634,98635,98636,98637,98638,98639,98640,98641,98642,98643,98644,98645,98646,98647,98648,98649,98650,98651,98652,98653,98654,98655,98656,98657,98658,98659,98660,98661,98662,98663,98664,98665,98666,98667,98668,98669,98670,98671,98672,98673,98674,98675,98676,98677,98678,98679,98680,98681,98682,98683,98684,98685,98686,98687,98688,98689,98690,98691,98692,98693,98694,98695,98696,98697,98698,98699,98700,98701,98702,98703,98704,98705,98706,98707,98708,98709,98710,98711,98712,98713,98714,98715,98716,98717,98718,98719,98720,98721,98722,98723,98724,98725,98726,98727,98728,98729,98730,98731,98732,98733,98734,98735,98736,98737,98738,98739,98740,98741,98742,98743,98744,98745,98746,98747,98748,98749,98750,98751,98752,98753,98754,98755,98756,98757,98758,98759,98760,98761,98762,98763,98764,98765,98766,98767,98768,98769,98770,98771,98772,98773,98774,98775,98776,98777,98778,98779,98780,98781,98782,98783,98784,98785,98786,98787,98788,98789,98790,98791,98792,98793,98794,98795,98796,98797,98798,98799,98800,98801,98802,98803,98804,98805,98806,98807,98808,98809,98810,98811,98812,98813,98814,98815,98816,98817,98818,98819,98820,98821,98822,98823,98824,98825,98826,98827,98828,98829,98830,98831,98832,98833,98834,98835,98836,98837,98838,98839,98840,98841,98842,98843,98844,98845,98846,98847,98848,98849,98850,98851,98852,98853,98854,98855,98856,98857,98858,98859,98860,98861,98862,98863,98864,98865,98866,98867,98868,98869,98870,98871,98872,98873,98874,98875,98876,98877,98878,98879,98880,98881,98882,98883,98884,98885,98886,98887,98888,98889,98890,98891,98892,98893,98894,98895,98896,98897,98898,98899,98900,98901,98902,98903,98904,98905,98906,98907,98908,98909,98910,98911,98912,98913,98914,98915,98916,98917,98918,98919,98920,98921,98922,98923,98924,98925,98926,98927,98928,98929,98930,98931,98932,98933,98934,98935,98936,98937,98938,98939,98940,98941,98942,98943,98944,98945,98946,98947,98948,98949,98950,98951,98952,98953,98954,98955,98956,98957,98958,98959,98960,98961,98962,98963,98964,98965,98966,98967,98968,98969,98970,98971,98972,98973,98974,98975,98976,98977,98978,98979,98980,98981,98982,98983,98984,98985,98986,98987,98988,98989,98990,98991,98992,98993,98994,98995,98996,98997,98998,98999,99000,99001,99002,99003,99004,99005,99006,99007,99008,99009,99010,99011,99012,99013,99014,99015,99016,99017,99018,99019,99020,99021,99022,99023,99024,99025,99026,99027,99028,99029,99030,99031,99032,99033,99034,99035,99036,99037,99038,99039,99040,99041,99042,99043,99044,99045,99046,99047,99048,99049,99050,99051,99052,99053,99054,99055,99056,99057,99058,99059,99060,99061,99062,99063,99064,99065,99066,99067,99068,99069,99070,99071,99072,99073,99074,99075,99076,99077,99078,99079,99080,99081,99082,99083,99084,99085,99086,99087,99088,99089,99090,99091,99092,99093,99094,99095,99096,99097,99098,99099,99100,99101,99102,99103,99104,99105,99106,99107,99108,99109,99110,99111,99112,99113,99114,99115,99116,99117,99118,99119,99120,99121,99122,99123,99124,99125,99126,99127,99128,99129,99130,99131,99132,99133,99134,99135,99136,99137,99138,99139,99140,99141,99142,99143,99144,99145,99146,99147,99148,99149,99150,99151,99152,99153,99154,99155,99156,99157,99158,99159,99160,99161,99162,99163,99164,99165,99166,99167,99168,99169,99170,99171,99172,99173,99174,99175,99176,99177,99178,99179,99180,99181,99182,99183,99184,99185,99186,99187,99188,99189,99190,99191,99192,99193,99194,99195,99196,99197,99198,99199,99200,99201,99202,99203,99204,99205,99206,99207,99208,99209,99210,99211,99212,99213,99214,99215,99216,99217,99218,99219,99220,99221,99222,99223,99224,99225,99226,99227,99228,99229,99230,99231,99232,99233,99234,99235,99236,99237,99238,99239,99240,99241,99242,99243,99244,99245,99246,99247,99248,99249,99250,99251,99252,99253,99254,99255,99256,99257,99258,99259,99260,99261,99262,99263,99264,99265,99266,99267,99268,99269,99270,99271,99272,99273,99274,99275,99276,99277,99278,99279,99280,99281,99282,99283,99284,99285,99286,99287,99288,99289,99290,99291,99292,99293,99294,99295,99296,99297,99298,99299,99300,99301,99302,99303,99304,99305,99306,99307,99308,99309,99310,99311,99312,99313,99314,99315,99316,99317,99318,99319,99320,99321,99322,99323,99324,99325,99326,99327,99328,99329,99330,99331,99332,99333,99334,99335,99336,99337,99338,99339,99340,99341,99342,99343,99344,99345,99346,99347,99348,99349,99350,99351,99352,99353,99354,99355,99356,99357,99358,99359,99360,99361,99362,99363,99364,99365,99366,99367,99368,99369,99370,99371,99372,99373,99374,99375,99376,99377,99378,99379,99380,99381,99382,99383,99384,99385,99386,99387,99388,99389,99390,99391,99392,99393,99394,99395,99396,99397,99398,99399,99400,99401,99402,99403,99404,99405,99406,99407,99408,99409,99410,99411,99412,99413,99414,99415,99416,99417,99418,99419,99420,99421,99422,99423,99424,99425,99426,99427,99428,99429,99430,99431,99432,99433,99434,99435,99436,99437,99438,99439,99440,99441,99442,99443,99444,99445,99446,99447,99448,99449,99450,99451,99452,99453,99454,99455,99456,99457,99458,99459,99460,99461,99462,99463,99464,99465,99466,99467,99468,99469,99470,99471,99472,99473,99474,99475,99476,99477,99478,99479,99480,99481,99482,99483,99484,99485,99486,99487,99488,99489,99490,99491,99492,99493,99494,99495,99496,99497,99498,99499,99500,99501,99502,99503,99504,99505,99506,99507,99508,99509,99510,99511,99512,99513,99514,99515,99516,99517,99518,99519,99520,99521,99522,99523,99524,99525,99526,99527,99528,99529,99530,99531,99532,99533,99534,99535,99536,99537,99538,99539,99540,99541,99542,99543,99544,99545,99546,99547,99548,99549,99550,99551,99552,99553,99554,99555,99556,99557,99558,99559,99560,99561,99562,99563,99564,99565,99566,99567,99568,99569,99570,99571,99572,99573,99574,99575,99576,99577,99578,99579,99580,99581,99582,99583,99584,99585,99586,99587,99588,99589,99590,99591,99592,99593,99594,99595,99596,99597,99598,99599,99600,99601,99602,99603,99604,99605,99606,99607,99608,99609,99610,99611,99612,99613,99614,99615,99616,99617,99618,99619,99620,99621,99622,99623,99624,99625,99626,99627,99628,99629,99630,99631,99632,99633,99634,99635,99636,99637,99638,99639,99640,99641,99642,99643,99644,99645,99646,99647,99648,99649,99650,99651,99652,99653,99654,99655,99656,99657,99658,99659,99660,99661,99662,99663,99664,99665,99666,99667,99668,99669,99670,99671,99672,99673,99674,99675,99676,99677,99678,99679,99680,99681,99682,99683,99684,99685,99686,99687,99688,99689,99690,99691,99692,99693,99694,99695,99696,99697,99698,99699,99700,99701,99702,99703,99704,99705,99706,99707,99708,99709,99710,99711,99712,99713,99714,99715,99716,99717,99718,99719,99720,99721,99722,99723,99724,99725,99726,99727,99728,99729,99730,99731,99732,99733,99734,99735,99736,99737,99738,99739,99740,99741,99742,99743,99744,99745,99746,99747,99748,99749,99750,99751,99752,99753,99754,99755,99756,99757,99758,99759,99760,99761,99762,99763,99764,99765,99766,99767,99768,99769,99770,99771,99772,99773,99774,99775,99776,99777,99778,99779,99780,99781,99782,99783,99784,99785,99786,99787,99788,99789,99790,99791,99792,99793,99794,99795,99796,99797,99798,99799,99800,99801,99802,99803,99804,99805,99806,99807,99808,99809,99810,99811,99812,99813,99814,99815,99816,99817,99818,99819,99820,99821,99822,99823,99824,99825,99826,99827,99828,99829,99830,99831,99832,99833,99834,99835,99836,99837,99838,99839,99840,99841,99842,99843,99844,99845,99846,99847,99848,99849,99850,99851,99852,99853,99854,99855,99856,99857,99858,99859,99860,99861,99862,99863,99864,99865,99866,99867,99868,99869,99870,99871,99872,99873,99874,99875,99876,99877,99878,99879,99880,99881,99882,99883,99884,99885,99886,99887,99888,99889,99890,99891,99892,99893,99894,99895,99896,99897,99898,99899,99900,99901,99902,99903,99904,99905,99906,99907,99908,99909,99910,99911,99912,99913,99914,99915,99916,99917,99918,99919,99920,99921,99922,99923,99924,99925,99926,99927,99928,99929,99930,99931,99932,99933,99934,99935,99936,99937,99938,99939,99940,99941,99942,99943,99944,99945,99946,99947,99948,99949,99950,99951,99952,99953,99954,99955,99956,99957,99958,99959,99960,99961,99962,99963,99964,99965,99966,99967,99968,99969,99970,99971,99972,99973,99974,99975,99976,99977,99978,99979,99980,99981,99982,99983,99984,99985,99986,99987,99988,99989,99990,99991,99992,99993,99994,99995,99996,99997,99998,99999,100000,100001,100002,100003,100004,100005,100006,100007,100008,100009,100010,100011,100012,100013,100014,100015,100016,100017,100018,100019,100020,100021,100022,100023,100024,100025,100026,100027,100028,100029,100030,100031,100032,100033,100034,100035,100036,100037,100038,100039,100040,100041,100042,100043,100044,100045,100046,100047,100048,100049,100050,100051,100052,100053,100054,100055,100056,100057,100058,100059,100060,100061,100062,100063,100064,100065,100066,100067,100068,100069,100070,100071,100072,100073,100074,100075,100076,100077,100078,100079,100080,100081,100082,100083,100084,100085,100086,100087,100088,100089,100090,100091,100092,100093,100094,100095,100096,100097,100098,100099,100100,100101,100102,100103,100104,100105,100106,100107,100108,100109,100110,100111,100112,100113,100114,100115,100116,100117,100118,100119,100120,100121,100122,100123,100124,100125,100126,100127,100128,100129,100130,100131,100132,100133,100134,100135,100136,100137,100138,100139,100140,100141,100142,100143,100144,100145,100146,100147,100148,100149,100150,100151,100152,100153,100154,100155,100156,100157,100158,100159,100160,100161,100162,100163,100164,100165,100166,100167,100168,100169,100170,100171,100172,100173,100174,100175,100176,100177,100178,100179,100180,100181,100182,100183,100184,100185,100186,100187,100188,100189,100190,100191,100192,100193,100194,100195,100196,100197,100198,100199,100200,100201,100202,100203,100204,100205,100206,100207,100208,100209,100210,100211,100212,100213,100214,100215,100216,100217,100218,100219,100220,100221,100222,100223,100224,100225,100226,100227,100228,100229,100230,100231,100232,100233,100234,100235,100236,100237,100238,100239,100240,100241,100242,100243,100244,100245,100246,100247,100248,100249,100250,100251,100252,100253,100254,100255,100256,100257,100258,100259,100260,100261,100262,100263,100264,100265,100266,100267,100268,100269,100270,100271,100272,100273,100274,100275,100276,100277,100278,100279,100280,100281,100282,100283,100284,100285,100286,100287,100288,100289,100290,100291,100292,100293,100294,100295,100296,100297,100298,100299,100300,100301,100302,100303,100304,100305,100306,100307,100308,100309,100310,100311,100312,100313,100314,100315,100316,100317,100318,100319,100320,100321,100322,100323,100324,100325,100326,100327,100328,100329,100330,100331,100332,100333,100334,100335,100336,100337,100338,100339,100340,100341,100342,100343,100352,100353,100354,100355,100356,100357,100358,100359,100360,100361,100362,100363,100364,100365,100366,100367,100368,100369,100370,100371,100372,100373,100374,100375,100376,100377,100378,100379,100380,100381,100382,100383,100384,100385,100386,100387,100388,100389,100390,100391,100392,100393,100394,100395,100396,100397,100398,100399,100400,100401,100402,100403,100404,100405,100406,100407,100408,100409,100410,100411,100412,100413,100414,100415,100416,100417,100418,100419,100420,100421,100422,100423,100424,100425,100426,100427,100428,100429,100430,100431,100432,100433,100434,100435,100436,100437,100438,100439,100440,100441,100442,100443,100444,100445,100446,100447,100448,100449,100450,100451,100452,100453,100454,100455,100456,100457,100458,100459,100460,100461,100462,100463,100464,100465,100466,100467,100468,100469,100470,100471,100472,100473,100474,100475,100476,100477,100478,100479,100480,100481,100482,100483,100484,100485,100486,100487,100488,100489,100490,100491,100492,100493,100494,100495,100496,100497,100498,100499,100500,100501,100502,100503,100504,100505,100506,100507,100508,100509,100510,100511,100512,100513,100514,100515,100516,100517,100518,100519,100520,100521,100522,100523,100524,100525,100526,100527,100528,100529,100530,100531,100532,100533,100534,100535,100536,100537,100538,100539,100540,100541,100542,100543,100544,100545,100546,100547,100548,100549,100550,100551,100552,100553,100554,100555,100556,100557,100558,100559,100560,100561,100562,100563,100564,100565,100566,100567,100568,100569,100570,100571,100572,100573,100574,100575,100576,100577,100578,100579,100580,100581,100582,100583,100584,100585,100586,100587,100588,100589,100590,100591,100592,100593,100594,100595,100596,100597,100598,100599,100600,100601,100602,100603,100604,100605,100606,100607,100608,100609,100610,100611,100612,100613,100614,100615,100616,100617,100618,100619,100620,100621,100622,100623,100624,100625,100626,100627,100628,100629,100630,100631,100632,100633,100634,100635,100636,100637,100638,100639,100640,100641,100642,100643,100644,100645,100646,100647,100648,100649,100650,100651,100652,100653,100654,100655,100656,100657,100658,100659,100660,100661,100662,100663,100664,100665,100666,100667,100668,100669,100670,100671,100672,100673,100674,100675,100676,100677,100678,100679,100680,100681,100682,100683,100684,100685,100686,100687,100688,100689,100690,100691,100692,100693,100694,100695,100696,100697,100698,100699,100700,100701,100702,100703,100704,100705,100706,100707,100708,100709,100710,100711,100712,100713,100714,100715,100716,100717,100718,100719,100720,100721,100722,100723,100724,100725,100726,100727,100728,100729,100730,100731,100732,100733,100734,100735,100736,100737,100738,100739,100740,100741,100742,100743,100744,100745,100746,100747,100748,100749,100750,100751,100752,100753,100754,100755,100756,100757,100758,100759,100760,100761,100762,100763,100764,100765,100766,100767,100768,100769,100770,100771,100772,100773,100774,100775,100776,100777,100778,100779,100780,100781,100782,100783,100784,100785,100786,100787,100788,100789,100790,100791,100792,100793,100794,100795,100796,100797,100798,100799,100800,100801,100802,100803,100804,100805,100806,100807,100808,100809,100810,100811,100812,100813,100814,100815,100816,100817,100818,100819,100820,100821,100822,100823,100824,100825,100826,100827,100828,100829,100830,100831,100832,100833,100834,100835,100836,100837,100838,100839,100840,100841,100842,100843,100844,100845,100846,100847,100848,100849,100850,100851,100852,100853,100854,100855,100856,100857,100858,100859,100860,100861,100862,100863,100864,100865,100866,100867,100868,100869,100870,100871,100872,100873,100874,100875,100876,100877,100878,100879,100880,100881,100882,100883,100884,100885,100886,100887,100888,100889,100890,100891,100892,100893,100894,100895,100896,100897,100898,100899,100900,100901,100902,100903,100904,100905,100906,100907,100908,100909,100910,100911,100912,100913,100914,100915,100916,100917,100918,100919,100920,100921,100922,100923,100924,100925,100926,100927,100928,100929,100930,100931,100932,100933,100934,100935,100936,100937,100938,100939,100940,100941,100942,100943,100944,100945,100946,100947,100948,100949,100950,100951,100952,100953,100954,100955,100956,100957,100958,100959,100960,100961,100962,100963,100964,100965,100966,100967,100968,100969,100970,100971,100972,100973,100974,100975,100976,100977,100978,100979,100980,100981,100982,100983,100984,100985,100986,100987,100988,100989,100990,100991,100992,100993,100994,100995,100996,100997,100998,100999,101000,101001,101002,101003,101004,101005,101006,101007,101008,101009,101010,101011,101012,101013,101014,101015,101016,101017,101018,101019,101020,101021,101022,101023,101024,101025,101026,101027,101028,101029,101030,101031,101032,101033,101034,101035,101036,101037,101038,101039,101040,101041,101042,101043,101044,101045,101046,101047,101048,101049,101050,101051,101052,101053,101054,101055,101056,101057,101058,101059,101060,101061,101062,101063,101064,101065,101066,101067,101068,101069,101070,101071,101072,101073,101074,101075,101076,101077,101078,101079,101080,101081,101082,101083,101084,101085,101086,101087,101088,101089,101090,101091,101092,101093,101094,101095,101096,101097,101098,101099,101100,101101,101102,101103,101104,101105,101106,101107,101108,101109,101110,101111,101112,101113,101114,101115,101116,101117,101118,101119,101120,101121,101122,101123,101124,101125,101126,101127,101128,101129,101130,101131,101132,101133,101134,101135,101136,101137,101138,101139,101140,101141,101142,101143,101144,101145,101146,101147,101148,101149,101150,101151,101152,101153,101154,101155,101156,101157,101158,101159,101160,101161,101162,101163,101164,101165,101166,101167,101168,101169,101170,101171,101172,101173,101174,101175,101176,101177,101178,101179,101180,101181,101182,101183,101184,101185,101186,101187,101188,101189,101190,101191,101192,101193,101194,101195,101196,101197,101198,101199,101200,101201,101202,101203,101204,101205,101206,101207,101208,101209,101210,101211,101212,101213,101214,101215,101216,101217,101218,101219,101220,101221,101222,101223,101224,101225,101226,101227,101228,101229,101230,101231,101232,101233,101234,101235,101236,101237,101238,101239,101240,101241,101242,101243,101244,101245,101246,101247,101248,101249,101250,101251,101252,101253,101254,101255,101256,101257,101258,101259,101260,101261,101262,101263,101264,101265,101266,101267,101268,101269,101270,101271,101272,101273,101274,101275,101276,101277,101278,101279,101280,101281,101282,101283,101284,101285,101286,101287,101288,101289,101290,101291,101292,101293,101294,101295,101296,101297,101298,101299,101300,101301,101302,101303,101304,101305,101306,101307,101308,101309,101310,101311,101312,101313,101314,101315,101316,101317,101318,101319,101320,101321,101322,101323,101324,101325,101326,101327,101328,101329,101330,101331,101332,101333,101334,101335,101336,101337,101338,101339,101340,101341,101342,101343,101344,101345,101346,101347,101348,101349,101350,101351,101352,101353,101354,101355,101356,101357,101358,101359,101360,101361,101362,101363,101364,101365,101366,101367,101368,101369,101370,101371,101372,101373,101374,101375,101376,101377,101378,101379,101380,101381,101382,101383,101384,101385,101386,101387,101388,101389,101390,101391,101392,101393,101394,101395,101396,101397,101398,101399,101400,101401,101402,101403,101404,101405,101406,101407,101408,101409,101410,101411,101412,101413,101414,101415,101416,101417,101418,101419,101420,101421,101422,101423,101424,101425,101426,101427,101428,101429,101430,101431,101432,101433,101434,101435,101436,101437,101438,101439,101440,101441,101442,101443,101444,101445,101446,101447,101448,101449,101450,101451,101452,101453,101454,101455,101456,101457,101458,101459,101460,101461,101462,101463,101464,101465,101466,101467,101468,101469,101470,101471,101472,101473,101474,101475,101476,101477,101478,101479,101480,101481,101482,101483,101484,101485,101486,101487,101488,101489,101490,101491,101492,101493,101494,101495,101496,101497,101498,101499,101500,101501,101502,101503,101504,101505,101506,101507,101508,101509,101510,101511,101512,101513,101514,101515,101516,101517,101518,101519,101520,101521,101522,101523,101524,101525,101526,101527,101528,101529,101530,101531,101532,101533,101534,101535,101536,101537,101538,101539,101540,101541,101542,101543,101544,101545,101546,101547,101548,101549,101550,101551,101552,101553,101554,101555,101556,101557,101558,101559,101560,101561,101562,101563,101564,101565,101566,101567,101568,101569,101570,101571,101572,101573,101574,101575,101576,101577,101578,101579,101580,101581,101582,101583,101584,101585,101586,101587,101588,101589,101632,101633,101634,101635,101636,101637,101638,101639,101640,110576,110577,110578,110579,110581,110582,110583,110584,110585,110586,110587,110589,110590,110592,110593,110594,110595,110596,110597,110598,110599,110600,110601,110602,110603,110604,110605,110606,110607,110608,110609,110610,110611,110612,110613,110614,110615,110616,110617,110618,110619,110620,110621,110622,110623,110624,110625,110626,110627,110628,110629,110630,110631,110632,110633,110634,110635,110636,110637,110638,110639,110640,110641,110642,110643,110644,110645,110646,110647,110648,110649,110650,110651,110652,110653,110654,110655,110656,110657,110658,110659,110660,110661,110662,110663,110664,110665,110666,110667,110668,110669,110670,110671,110672,110673,110674,110675,110676,110677,110678,110679,110680,110681,110682,110683,110684,110685,110686,110687,110688,110689,110690,110691,110692,110693,110694,110695,110696,110697,110698,110699,110700,110701,110702,110703,110704,110705,110706,110707,110708,110709,110710,110711,110712,110713,110714,110715,110716,110717,110718,110719,110720,110721,110722,110723,110724,110725,110726,110727,110728,110729,110730,110731,110732,110733,110734,110735,110736,110737,110738,110739,110740,110741,110742,110743,110744,110745,110746,110747,110748,110749,110750,110751,110752,110753,110754,110755,110756,110757,110758,110759,110760,110761,110762,110763,110764,110765,110766,110767,110768,110769,110770,110771,110772,110773,110774,110775,110776,110777,110778,110779,110780,110781,110782,110783,110784,110785,110786,110787,110788,110789,110790,110791,110792,110793,110794,110795,110796,110797,110798,110799,110800,110801,110802,110803,110804,110805,110806,110807,110808,110809,110810,110811,110812,110813,110814,110815,110816,110817,110818,110819,110820,110821,110822,110823,110824,110825,110826,110827,110828,110829,110830,110831,110832,110833,110834,110835,110836,110837,110838,110839,110840,110841,110842,110843,110844,110845,110846,110847,110848,110849,110850,110851,110852,110853,110854,110855,110856,110857,110858,110859,110860,110861,110862,110863,110864,110865,110866,110867,110868,110869,110870,110871,110872,110873,110874,110875,110876,110877,110878,110879,110880,110881,110882,110898,110928,110929,110930,110933,110948,110949,110950,110951,110960,110961,110962,110963,110964,110965,110966,110967,110968,110969,110970,110971,110972,110973,110974,110975,110976,110977,110978,110979,110980,110981,110982,110983,110984,110985,110986,110987,110988,110989,110990,110991,110992,110993,110994,110995,110996,110997,110998,110999,111000,111001,111002,111003,111004,111005,111006,111007,111008,111009,111010,111011,111012,111013,111014,111015,111016,111017,111018,111019,111020,111021,111022,111023,111024,111025,111026,111027,111028,111029,111030,111031,111032,111033,111034,111035,111036,111037,111038,111039,111040,111041,111042,111043,111044,111045,111046,111047,111048,111049,111050,111051,111052,111053,111054,111055,111056,111057,111058,111059,111060,111061,111062,111063,111064,111065,111066,111067,111068,111069,111070,111071,111072,111073,111074,111075,111076,111077,111078,111079,111080,111081,111082,111083,111084,111085,111086,111087,111088,111089,111090,111091,111092,111093,111094,111095,111096,111097,111098,111099,111100,111101,111102,111103,111104,111105,111106,111107,111108,111109,111110,111111,111112,111113,111114,111115,111116,111117,111118,111119,111120,111121,111122,111123,111124,111125,111126,111127,111128,111129,111130,111131,111132,111133,111134,111135,111136,111137,111138,111139,111140,111141,111142,111143,111144,111145,111146,111147,111148,111149,111150,111151,111152,111153,111154,111155,111156,111157,111158,111159,111160,111161,111162,111163,111164,111165,111166,111167,111168,111169,111170,111171,111172,111173,111174,111175,111176,111177,111178,111179,111180,111181,111182,111183,111184,111185,111186,111187,111188,111189,111190,111191,111192,111193,111194,111195,111196,111197,111198,111199,111200,111201,111202,111203,111204,111205,111206,111207,111208,111209,111210,111211,111212,111213,111214,111215,111216,111217,111218,111219,111220,111221,111222,111223,111224,111225,111226,111227,111228,111229,111230,111231,111232,111233,111234,111235,111236,111237,111238,111239,111240,111241,111242,111243,111244,111245,111246,111247,111248,111249,111250,111251,111252,111253,111254,111255,111256,111257,111258,111259,111260,111261,111262,111263,111264,111265,111266,111267,111268,111269,111270,111271,111272,111273,111274,111275,111276,111277,111278,111279,111280,111281,111282,111283,111284,111285,111286,111287,111288,111289,111290,111291,111292,111293,111294,111295,111296,111297,111298,111299,111300,111301,111302,111303,111304,111305,111306,111307,111308,111309,111310,111311,111312,111313,111314,111315,111316,111317,111318,111319,111320,111321,111322,111323,111324,111325,111326,111327,111328,111329,111330,111331,111332,111333,111334,111335,111336,111337,111338,111339,111340,111341,111342,111343,111344,111345,111346,111347,111348,111349,111350,111351,111352,111353,111354,111355,113664,113665,113666,113667,113668,113669,113670,113671,113672,113673,113674,113675,113676,113677,113678,113679,113680,113681,113682,113683,113684,113685,113686,113687,113688,113689,113690,113691,113692,113693,113694,113695,113696,113697,113698,113699,113700,113701,113702,113703,113704,113705,113706,113707,113708,113709,113710,113711,113712,113713,113714,113715,113716,113717,113718,113719,113720,113721,113722,113723,113724,113725,113726,113727,113728,113729,113730,113731,113732,113733,113734,113735,113736,113737,113738,113739,113740,113741,113742,113743,113744,113745,113746,113747,113748,113749,113750,113751,113752,113753,113754,113755,113756,113757,113758,113759,113760,113761,113762,113763,113764,113765,113766,113767,113768,113769,113770,113776,113777,113778,113779,113780,113781,113782,113783,113784,113785,113786,113787,113788,113792,113793,113794,113795,113796,113797,113798,113799,113800,113808,113809,113810,113811,113812,113813,113814,113815,113816,113817,113820,113823,118608,118609,118610,118611,118612,118613,118614,118615,118616,118617,118618,118619,118620,118621,118622,118623,118624,118625,118626,118627,118628,118629,118630,118631,118632,118633,118634,118635,118636,118637,118638,118639,118640,118641,118642,118643,118644,118645,118646,118647,118648,118649,118650,118651,118652,118653,118654,118655,118656,118657,118658,118659,118660,118661,118662,118663,118664,118665,118666,118667,118668,118669,118670,118671,118672,118673,118674,118675,118676,118677,118678,118679,118680,118681,118682,118683,118684,118685,118686,118687,118688,118689,118690,118691,118692,118693,118694,118695,118696,118697,118698,118699,118700,118701,118702,118703,118704,118705,118706,118707,118708,118709,118710,118711,118712,118713,118714,118715,118716,118717,118718,118719,118720,118721,118722,118723,118784,118785,118786,118787,118788,118789,118790,118791,118792,118793,118794,118795,118796,118797,118798,118799,118800,118801,118802,118803,118804,118805,118806,118807,118808,118809,118810,118811,118812,118813,118814,118815,118816,118817,118818,118819,118820,118821,118822,118823,118824,118825,118826,118827,118828,118829,118830,118831,118832,118833,118834,118835,118836,118837,118838,118839,118840,118841,118842,118843,118844,118845,118846,118847,118848,118849,118850,118851,118852,118853,118854,118855,118856,118857,118858,118859,118860,118861,118862,118863,118864,118865,118866,118867,118868,118869,118870,118871,118872,118873,118874,118875,118876,118877,118878,118879,118880,118881,118882,118883,118884,118885,118886,118887,118888,118889,118890,118891,118892,118893,118894,118895,118896,118897,118898,118899,118900,118901,118902,118903,118904,118905,118906,118907,118908,118909,118910,118911,118912,118913,118914,118915,118916,118917,118918,118919,118920,118921,118922,118923,118924,118925,118926,118927,118928,118929,118930,118931,118932,118933,118934,118935,118936,118937,118938,118939,118940,118941,118942,118943,118944,118945,118946,118947,118948,118949,118950,118951,118952,118953,118954,118955,118956,118957,118958,118959,118960,118961,118962,118963,118964,118965,118966,118967,118968,118969,118970,118971,118972,118973,118974,118975,118976,118977,118978,118979,118980,118981,118982,118983,118984,118985,118986,118987,118988,118989,118990,118991,118992,118993,118994,118995,118996,118997,118998,118999,119000,119001,119002,119003,119004,119005,119006,119007,119008,119009,119010,119011,119012,119013,119014,119015,119016,119017,119018,119019,119020,119021,119022,119023,119024,119025,119026,119027,119028,119029,119040,119041,119042,119043,119044,119045,119046,119047,119048,119049,119050,119051,119052,119053,119054,119055,119056,119057,119058,119059,119060,119061,119062,119063,119064,119065,119066,119067,119068,119069,119070,119071,119072,119073,119074,119075,119076,119077,119078,119081,119082,119083,119084,119085,119086,119087,119088,119089,119090,119091,119092,119093,119094,119095,119096,119097,119098,119099,119100,119101,119102,119103,119104,119105,119106,119107,119108,119109,119110,119111,119112,119113,119114,119115,119116,119117,119118,119119,119120,119121,119122,119123,119124,119125,119126,119127,119128,119129,119130,119131,119132,119133,119134,119135,119136,119137,119138,119139,119140,119142,119146,119147,119148,119149,119171,119172,119180,119181,119182,119183,119184,119185,119186,119187,119188,119189,119190,119191,119192,119193,119194,119195,119196,119197,119198,119199,119200,119201,119202,119203,119204,119205,119206,119207,119208,119209,119214,119215,119216,119217,119218,119219,119220,119221,119222,119223,119224,119225,119226,119227,119228,119229,119230,119231,119232,119233,119234,119235,119236,119237,119238,119239,119240,119241,119242,119243,119244,119245,119246,119247,119248,119249,119250,119251,119252,119253,119254,119255,119256,119257,119258,119259,119260,119261,119262,119263,119264,119265,119266,119267,119268,119269,119270,119271,119272,119273,119274,119296,119297,119298,119299,119300,119301,119302,119303,119304,119305,119306,119307,119308,119309,119310,119311,119312,119313,119314,119315,119316,119317,119318,119319,119320,119321,119322,119323,119324,119325,119326,119327,119328,119329,119330,119331,119332,119333,119334,119335,119336,119337,119338,119339,119340,119341,119342,119343,119344,119345,119346,119347,119348,119349,119350,119351,119352,119353,119354,119355,119356,119357,119358,119359,119360,119361,119365,119488,119489,119490,119491,119492,119493,119494,119495,119496,119497,119498,119499,119500,119501,119502,119503,119504,119505,119506,119507,119520,119521,119522,119523,119524,119525,119526,119527,119528,119529,119530,119531,119532,119533,119534,119535,119536,119537,119538,119539,119552,119553,119554,119555,119556,119557,119558,119559,119560,119561,119562,119563,119564,119565,119566,119567,119568,119569,119570,119571,119572,119573,119574,119575,119576,119577,119578,119579,119580,119581,119582,119583,119584,119585,119586,119587,119588,119589,119590,119591,119592,119593,119594,119595,119596,119597,119598,119599,119600,119601,119602,119603,119604,119605,119606,119607,119608,119609,119610,119611,119612,119613,119614,119615,119616,119617,119618,119619,119620,119621,119622,119623,119624,119625,119626,119627,119628,119629,119630,119631,119632,119633,119634,119635,119636,119637,119638,119648,119649,119650,119651,119652,119653,119654,119655,119656,119657,119658,119659,119660,119661,119662,119663,119664,119665,119666,119667,119668,119669,119670,119671,119672,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120513,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120539,120540,120541,120542,120543,120544,120545,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120571,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120597,120598,120599,120600,120601,120602,120603,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120629,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120655,120656,120657,120658,120659,120660,120661,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120687,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120713,120714,120715,120716,120717,120718,120719,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120745,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120771,120772,120773,120774,120775,120776,120777,120778,120779,120782,120783,120784,120785,120786,120787,120788,120789,120790,120791,120792,120793,120794,120795,120796,120797,120798,120799,120800,120801,120802,120803,120804,120805,120806,120807,120808,120809,120810,120811,120812,120813,120814,120815,120816,120817,120818,120819,120820,120821,120822,120823,120824,120825,120826,120827,120828,120829,120830,120831,120832,120833,120834,120835,120836,120837,120838,120839,120840,120841,120842,120843,120844,120845,120846,120847,120848,120849,120850,120851,120852,120853,120854,120855,120856,120857,120858,120859,120860,120861,120862,120863,120864,120865,120866,120867,120868,120869,120870,120871,120872,120873,120874,120875,120876,120877,120878,120879,120880,120881,120882,120883,120884,120885,120886,120887,120888,120889,120890,120891,120892,120893,120894,120895,120896,120897,120898,120899,120900,120901,120902,120903,120904,120905,120906,120907,120908,120909,120910,120911,120912,120913,120914,120915,120916,120917,120918,120919,120920,120921,120922,120923,120924,120925,120926,120927,120928,120929,120930,120931,120932,120933,120934,120935,120936,120937,120938,120939,120940,120941,120942,120943,120944,120945,120946,120947,120948,120949,120950,120951,120952,120953,120954,120955,120956,120957,120958,120959,120960,120961,120962,120963,120964,120965,120966,120967,120968,120969,120970,120971,120972,120973,120974,120975,120976,120977,120978,120979,120980,120981,120982,120983,120984,120985,120986,120987,120988,120989,120990,120991,120992,120993,120994,120995,120996,120997,120998,120999,121000,121001,121002,121003,121004,121005,121006,121007,121008,121009,121010,121011,121012,121013,121014,121015,121016,121017,121018,121019,121020,121021,121022,121023,121024,121025,121026,121027,121028,121029,121030,121031,121032,121033,121034,121035,121036,121037,121038,121039,121040,121041,121042,121043,121044,121045,121046,121047,121048,121049,121050,121051,121052,121053,121054,121055,121056,121057,121058,121059,121060,121061,121062,121063,121064,121065,121066,121067,121068,121069,121070,121071,121072,121073,121074,121075,121076,121077,121078,121079,121080,121081,121082,121083,121084,121085,121086,121087,121088,121089,121090,121091,121092,121093,121094,121095,121096,121097,121098,121099,121100,121101,121102,121103,121104,121105,121106,121107,121108,121109,121110,121111,121112,121113,121114,121115,121116,121117,121118,121119,121120,121121,121122,121123,121124,121125,121126,121127,121128,121129,121130,121131,121132,121133,121134,121135,121136,121137,121138,121139,121140,121141,121142,121143,121144,121145,121146,121147,121148,121149,121150,121151,121152,121153,121154,121155,121156,121157,121158,121159,121160,121161,121162,121163,121164,121165,121166,121167,121168,121169,121170,121171,121172,121173,121174,121175,121176,121177,121178,121179,121180,121181,121182,121183,121184,121185,121186,121187,121188,121189,121190,121191,121192,121193,121194,121195,121196,121197,121198,121199,121200,121201,121202,121203,121204,121205,121206,121207,121208,121209,121210,121211,121212,121213,121214,121215,121216,121217,121218,121219,121220,121221,121222,121223,121224,121225,121226,121227,121228,121229,121230,121231,121232,121233,121234,121235,121236,121237,121238,121239,121240,121241,121242,121243,121244,121245,121246,121247,121248,121249,121250,121251,121252,121253,121254,121255,121256,121257,121258,121259,121260,121261,121262,121263,121264,121265,121266,121267,121268,121269,121270,121271,121272,121273,121274,121275,121276,121277,121278,121279,121280,121281,121282,121283,121284,121285,121286,121287,121288,121289,121290,121291,121292,121293,121294,121295,121296,121297,121298,121299,121300,121301,121302,121303,121304,121305,121306,121307,121308,121309,121310,121311,121312,121313,121314,121315,121316,121317,121318,121319,121320,121321,121322,121323,121324,121325,121326,121327,121328,121329,121330,121331,121332,121333,121334,121335,121336,121337,121338,121339,121340,121341,121342,121343,121399,121400,121401,121402,121453,121454,121455,121456,121457,121458,121459,121460,121462,121463,121464,121465,121466,121467,121468,121469,121470,121471,121472,121473,121474,121475,121477,121478,121479,121480,121481,121482,121483,122624,122625,122626,122627,122628,122629,122630,122631,122632,122633,122634,122635,122636,122637,122638,122639,122640,122641,122642,122643,122644,122645,122646,122647,122648,122649,122650,122651,122652,122653,122654,122661,122662,122663,122664,122665,122666,122928,122929,122930,122931,122932,122933,122934,122935,122936,122937,122938,122939,122940,122941,122942,122943,122944,122945,122946,122947,122948,122949,122950,122951,122952,122953,122954,122955,122956,122957,122958,122959,122960,122961,122962,122963,122964,122965,122966,122967,122968,122969,122970,122971,122972,122973,122974,122975,122976,122977,122978,122979,122980,122981,122982,122983,122984,122985,122986,122987,122988,122989,123136,123137,123138,123139,123140,123141,123142,123143,123144,123145,123146,123147,123148,123149,123150,123151,123152,123153,123154,123155,123156,123157,123158,123159,123160,123161,123162,123163,123164,123165,123166,123167,123168,123169,123170,123171,123172,123173,123174,123175,123176,123177,123178,123179,123180,123191,123192,123193,123194,123195,123196,123197,123200,123201,123202,123203,123204,123205,123206,123207,123208,123209,123214,123215,123536,123537,123538,123539,123540,123541,123542,123543,123544,123545,123546,123547,123548,123549,123550,123551,123552,123553,123554,123555,123556,123557,123558,123559,123560,123561,123562,123563,123564,123565,123584,123585,123586,123587,123588,123589,123590,123591,123592,123593,123594,123595,123596,123597,123598,123599,123600,123601,123602,123603,123604,123605,123606,123607,123608,123609,123610,123611,123612,123613,123614,123615,123616,123617,123618,123619,123620,123621,123622,123623,123624,123625,123626,123627,123632,123633,123634,123635,123636,123637,123638,123639,123640,123641,123647,124112,124113,124114,124115,124116,124117,124118,124119,124120,124121,124122,124123,124124,124125,124126,124127,124128,124129,124130,124131,124132,124133,124134,124135,124136,124137,124138,124139,124144,124145,124146,124147,124148,124149,124150,124151,124152,124153,124896,124897,124898,124899,124900,124901,124902,124904,124905,124906,124907,124909,124910,124912,124913,124914,124915,124916,124917,124918,124919,124920,124921,124922,124923,124924,124925,124926,124928,124929,124930,124931,124932,124933,124934,124935,124936,124937,124938,124939,124940,124941,124942,124943,124944,124945,124946,124947,124948,124949,124950,124951,124952,124953,124954,124955,124956,124957,124958,124959,124960,124961,124962,124963,124964,124965,124966,124967,124968,124969,124970,124971,124972,124973,124974,124975,124976,124977,124978,124979,124980,124981,124982,124983,124984,124985,124986,124987,124988,124989,124990,124991,124992,124993,124994,124995,124996,124997,124998,124999,125000,125001,125002,125003,125004,125005,125006,125007,125008,125009,125010,125011,125012,125013,125014,125015,125016,125017,125018,125019,125020,125021,125022,125023,125024,125025,125026,125027,125028,125029,125030,125031,125032,125033,125034,125035,125036,125037,125038,125039,125040,125041,125042,125043,125044,125045,125046,125047,125048,125049,125050,125051,125052,125053,125054,125055,125056,125057,125058,125059,125060,125061,125062,125063,125064,125065,125066,125067,125068,125069,125070,125071,125072,125073,125074,125075,125076,125077,125078,125079,125080,125081,125082,125083,125084,125085,125086,125087,125088,125089,125090,125091,125092,125093,125094,125095,125096,125097,125098,125099,125100,125101,125102,125103,125104,125105,125106,125107,125108,125109,125110,125111,125112,125113,125114,125115,125116,125117,125118,125119,125120,125121,125122,125123,125124,125127,125128,125129,125130,125131,125132,125133,125134,125135,125184,125185,125186,125187,125188,125189,125190,125191,125192,125193,125194,125195,125196,125197,125198,125199,125200,125201,125202,125203,125204,125205,125206,125207,125208,125209,125210,125211,125212,125213,125214,125215,125216,125217,125218,125219,125220,125221,125222,125223,125224,125225,125226,125227,125228,125229,125230,125231,125232,125233,125234,125235,125236,125237,125238,125239,125240,125241,125242,125243,125244,125245,125246,125247,125248,125249,125250,125251,125259,125264,125265,125266,125267,125268,125269,125270,125271,125272,125273,125278,125279,126065,126066,126067,126068,126069,126070,126071,126072,126073,126074,126075,126076,126077,126078,126079,126080,126081,126082,126083,126084,126085,126086,126087,126088,126089,126090,126091,126092,126093,126094,126095,126096,126097,126098,126099,126100,126101,126102,126103,126104,126105,126106,126107,126108,126109,126110,126111,126112,126113,126114,126115,126116,126117,126118,126119,126120,126121,126122,126123,126124,126125,126126,126127,126128,126129,126130,126131,126132,126209,126210,126211,126212,126213,126214,126215,126216,126217,126218,126219,126220,126221,126222,126223,126224,126225,126226,126227,126228,126229,126230,126231,126232,126233,126234,126235,126236,126237,126238,126239,126240,126241,126242,126243,126244,126245,126246,126247,126248,126249,126250,126251,126252,126253,126254,126255,126256,126257,126258,126259,126260,126261,126262,126263,126264,126265,126266,126267,126268,126269,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,126704,126705,126976,126977,126978,126979,126980,126981,126982,126983,126984,126985,126986,126987,126988,126989,126990,126991,126992,126993,126994,126995,126996,126997,126998,126999,127000,127001,127002,127003,127004,127005,127006,127007,127008,127009,127010,127011,127012,127013,127014,127015,127016,127017,127018,127019,127024,127025,127026,127027,127028,127029,127030,127031,127032,127033,127034,127035,127036,127037,127038,127039,127040,127041,127042,127043,127044,127045,127046,127047,127048,127049,127050,127051,127052,127053,127054,127055,127056,127057,127058,127059,127060,127061,127062,127063,127064,127065,127066,127067,127068,127069,127070,127071,127072,127073,127074,127075,127076,127077,127078,127079,127080,127081,127082,127083,127084,127085,127086,127087,127088,127089,127090,127091,127092,127093,127094,127095,127096,127097,127098,127099,127100,127101,127102,127103,127104,127105,127106,127107,127108,127109,127110,127111,127112,127113,127114,127115,127116,127117,127118,127119,127120,127121,127122,127123,127136,127137,127138,127139,127140,127141,127142,127143,127144,127145,127146,127147,127148,127149,127150,127153,127154,127155,127156,127157,127158,127159,127160,127161,127162,127163,127164,127165,127166,127167,127169,127170,127171,127172,127173,127174,127175,127176,127177,127178,127179,127180,127181,127182,127183,127185,127186,127187,127188,127189,127190,127191,127192,127193,127194,127195,127196,127197,127198,127199,127200,127201,127202,127203,127204,127205,127206,127207,127208,127209,127210,127211,127212,127213,127214,127215,127216,127217,127218,127219,127220,127221,127232,127233,127234,127235,127236,127237,127238,127239,127240,127241,127242,127243,127244,127245,127246,127247,127248,127249,127250,127251,127252,127253,127254,127255,127256,127257,127258,127259,127260,127261,127262,127263,127264,127265,127266,127267,127268,127269,127270,127271,127272,127273,127274,127275,127276,127277,127278,127279,127280,127281,127282,127283,127284,127285,127286,127287,127288,127289,127290,127291,127292,127293,127294,127295,127296,127297,127298,127299,127300,127301,127302,127303,127304,127305,127306,127307,127308,127309,127310,127311,127312,127313,127314,127315,127316,127317,127318,127319,127320,127321,127322,127323,127324,127325,127326,127327,127328,127329,127330,127331,127332,127333,127334,127335,127336,127337,127338,127339,127340,127341,127342,127343,127344,127345,127346,127347,127348,127349,127350,127351,127352,127353,127354,127355,127356,127357,127358,127359,127360,127361,127362,127363,127364,127365,127366,127367,127368,127369,127370,127371,127372,127373,127374,127375,127376,127377,127378,127379,127380,127381,127382,127383,127384,127385,127386,127387,127388,127389,127390,127391,127392,127393,127394,127395,127396,127397,127398,127399,127400,127401,127402,127403,127404,127405,127462,127463,127464,127465,127466,127467,127468,127469,127470,127471,127472,127473,127474,127475,127476,127477,127478,127479,127480,127481,127482,127483,127484,127485,127486,127487,127488,127489,127490,127504,127505,127506,127507,127508,127509,127510,127511,127512,127513,127514,127515,127516,127517,127518,127519,127520,127521,127522,127523,127524,127525,127526,127527,127528,127529,127530,127531,127532,127533,127534,127535,127536,127537,127538,127539,127540,127541,127542,127543,127544,127545,127546,127547,127552,127553,127554,127555,127556,127557,127558,127559,127560,127568,127569,127584,127585,127586,127587,127588,127589,127744,127745,127746,127747,127748,127749,127750,127751,127752,127753,127754,127755,127756,127757,127758,127759,127760,127761,127762,127763,127764,127765,127766,127767,127768,127769,127770,127771,127772,127773,127774,127775,127776,127777,127778,127779,127780,127781,127782,127783,127784,127785,127786,127787,127788,127789,127790,127791,127792,127793,127794,127795,127796,127797,127798,127799,127800,127801,127802,127803,127804,127805,127806,127807,127808,127809,127810,127811,127812,127813,127814,127815,127816,127817,127818,127819,127820,127821,127822,127823,127824,127825,127826,127827,127828,127829,127830,127831,127832,127833,127834,127835,127836,127837,127838,127839,127840,127841,127842,127843,127844,127845,127846,127847,127848,127849,127850,127851,127852,127853,127854,127855,127856,127857,127858,127859,127860,127861,127862,127863,127864,127865,127866,127867,127868,127869,127870,127871,127872,127873,127874,127875,127876,127877,127878,127879,127880,127881,127882,127883,127884,127885,127886,127887,127888,127889,127890,127891,127892,127893,127894,127895,127896,127897,127898,127899,127900,127901,127902,127903,127904,127905,127906,127907,127908,127909,127910,127911,127912,127913,127914,127915,127916,127917,127918,127919,127920,127921,127922,127923,127924,127925,127926,127927,127928,127929,127930,127931,127932,127933,127934,127935,127936,127937,127938,127939,127940,127941,127942,127943,127944,127945,127946,127947,127948,127949,127950,127951,127952,127953,127954,127955,127956,127957,127958,127959,127960,127961,127962,127963,127964,127965,127966,127967,127968,127969,127970,127971,127972,127973,127974,127975,127976,127977,127978,127979,127980,127981,127982,127983,127984,127985,127986,127987,127988,127989,127990,127991,127992,127993,127994,127995,127996,127997,127998,127999,128000,128001,128002,128003,128004,128005,128006,128007,128008,128009,128010,128011,128012,128013,128014,128015,128016,128017,128018,128019,128020,128021,128022,128023,128024,128025,128026,128027,128028,128029,128030,128031,128032,128033,128034,128035,128036,128037,128038,128039,128040,128041,128042,128043,128044,128045,128046,128047,128048,128049,128050,128051,128052,128053,128054,128055,128056,128057,128058,128059,128060,128061,128062,128063,128064,128065,128066,128067,128068,128069,128070,128071,128072,128073,128074,128075,128076,128077,128078,128079,128080,128081,128082,128083,128084,128085,128086,128087,128088,128089,128090,128091,128092,128093,128094,128095,128096,128097,128098,128099,128100,128101,128102,128103,128104,128105,128106,128107,128108,128109,128110,128111,128112,128113,128114,128115,128116,128117,128118,128119,128120,128121,128122,128123,128124,128125,128126,128127,128128,128129,128130,128131,128132,128133,128134,128135,128136,128137,128138,128139,128140,128141,128142,128143,128144,128145,128146,128147,128148,128149,128150,128151,128152,128153,128154,128155,128156,128157,128158,128159,128160,128161,128162,128163,128164,128165,128166,128167,128168,128169,128170,128171,128172,128173,128174,128175,128176,128177,128178,128179,128180,128181,128182,128183,128184,128185,128186,128187,128188,128189,128190,128191,128192,128193,128194,128195,128196,128197,128198,128199,128200,128201,128202,128203,128204,128205,128206,128207,128208,128209,128210,128211,128212,128213,128214,128215,128216,128217,128218,128219,128220,128221,128222,128223,128224,128225,128226,128227,128228,128229,128230,128231,128232,128233,128234,128235,128236,128237,128238,128239,128240,128241,128242,128243,128244,128245,128246,128247,128248,128249,128250,128251,128252,128253,128254,128255,128256,128257,128258,128259,128260,128261,128262,128263,128264,128265,128266,128267,128268,128269,128270,128271,128272,128273,128274,128275,128276,128277,128278,128279,128280,128281,128282,128283,128284,128285,128286,128287,128288,128289,128290,128291,128292,128293,128294,128295,128296,128297,128298,128299,128300,128301,128302,128303,128304,128305,128306,128307,128308,128309,128310,128311,128312,128313,128314,128315,128316,128317,128318,128319,128320,128321,128322,128323,128324,128325,128326,128327,128328,128329,128330,128331,128332,128333,128334,128335,128336,128337,128338,128339,128340,128341,128342,128343,128344,128345,128346,128347,128348,128349,128350,128351,128352,128353,128354,128355,128356,128357,128358,128359,128360,128361,128362,128363,128364,128365,128366,128367,128368,128369,128370,128371,128372,128373,128374,128375,128376,128377,128378,128379,128380,128381,128382,128383,128384,128385,128386,128387,128388,128389,128390,128391,128392,128393,128394,128395,128396,128397,128398,128399,128400,128401,128402,128403,128404,128405,128406,128407,128408,128409,128410,128411,128412,128413,128414,128415,128416,128417,128418,128419,128420,128421,128422,128423,128424,128425,128426,128427,128428,128429,128430,128431,128432,128433,128434,128435,128436,128437,128438,128439,128440,128441,128442,128443,128444,128445,128446,128447,128448,128449,128450,128451,128452,128453,128454,128455,128456,128457,128458,128459,128460,128461,128462,128463,128464,128465,128466,128467,128468,128469,128470,128471,128472,128473,128474,128475,128476,128477,128478,128479,128480,128481,128482,128483,128484,128485,128486,128487,128488,128489,128490,128491,128492,128493,128494,128495,128496,128497,128498,128499,128500,128501,128502,128503,128504,128505,128506,128507,128508,128509,128510,128511,128512,128513,128514,128515,128516,128517,128518,128519,128520,128521,128522,128523,128524,128525,128526,128527,128528,128529,128530,128531,128532,128533,128534,128535,128536,128537,128538,128539,128540,128541,128542,128543,128544,128545,128546,128547,128548,128549,128550,128551,128552,128553,128554,128555,128556,128557,128558,128559,128560,128561,128562,128563,128564,128565,128566,128567,128568,128569,128570,128571,128572,128573,128574,128575,128576,128577,128578,128579,128580,128581,128582,128583,128584,128585,128586,128587,128588,128589,128590,128591,128592,128593,128594,128595,128596,128597,128598,128599,128600,128601,128602,128603,128604,128605,128606,128607,128608,128609,128610,128611,128612,128613,128614,128615,128616,128617,128618,128619,128620,128621,128622,128623,128624,128625,128626,128627,128628,128629,128630,128631,128632,128633,128634,128635,128636,128637,128638,128639,128640,128641,128642,128643,128644,128645,128646,128647,128648,128649,128650,128651,128652,128653,128654,128655,128656,128657,128658,128659,128660,128661,128662,128663,128664,128665,128666,128667,128668,128669,128670,128671,128672,128673,128674,128675,128676,128677,128678,128679,128680,128681,128682,128683,128684,128685,128686,128687,128688,128689,128690,128691,128692,128693,128694,128695,128696,128697,128698,128699,128700,128701,128702,128703,128704,128705,128706,128707,128708,128709,128710,128711,128712,128713,128714,128715,128716,128717,128718,128719,128720,128721,128722,128723,128724,128725,128726,128727,128732,128733,128734,128735,128736,128737,128738,128739,128740,128741,128742,128743,128744,128745,128746,128747,128748,128752,128753,128754,128755,128756,128757,128758,128759,128760,128761,128762,128763,128764,128768,128769,128770,128771,128772,128773,128774,128775,128776,128777,128778,128779,128780,128781,128782,128783,128784,128785,128786,128787,128788,128789,128790,128791,128792,128793,128794,128795,128796,128797,128798,128799,128800,128801,128802,128803,128804,128805,128806,128807,128808,128809,128810,128811,128812,128813,128814,128815,128816,128817,128818,128819,128820,128821,128822,128823,128824,128825,128826,128827,128828,128829,128830,128831,128832,128833,128834,128835,128836,128837,128838,128839,128840,128841,128842,128843,128844,128845,128846,128847,128848,128849,128850,128851,128852,128853,128854,128855,128856,128857,128858,128859,128860,128861,128862,128863,128864,128865,128866,128867,128868,128869,128870,128871,128872,128873,128874,128875,128876,128877,128878,128879,128880,128881,128882,128883,128884,128885,128886],"Emoji":[35,42,48,49,50,51,52,53,54,55,56,57,169,174,8252,8265,8482,8505,8596,8597,8598,8599,8600,8601,8617,8618,8986,8987,9000,9167,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9208,9209,9210,9410,9642,9643,9654,9664,9723,9724,9725,9726,9728,9729,9730,9731,9732,9742,9745,9748,9749,9752,9757,9760,9762,9763,9766,9770,9774,9775,9784,9785,9786,9792,9794,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9823,9824,9827,9829,9830,9832,9851,9854,9855,9874,9875,9876,9877,9878,9879,9881,9883,9884,9888,9889,9895,9898,9899,9904,9905,9917,9918,9924,9925,9928,9934,9935,9937,9939,9940,9961,9962,9968,9969,9970,9971,9972,9973,9975,9976,9977,9978,9981,9986,9989,9992,9993,9994,9995,9996,9997,9999,10002,10004,10006,10013,10017,10024,10035,10036,10052,10055,10060,10062,10067,10068,10069,10071,10083,10084,10133,10134,10135,10145,10160,10175,10548,10549,11013,11014,11015,11035,11036,11088,11093,12336,12349,12951,12953,126980,127183,127344,127345,127358,127359,127374,127377,127378,127379,127380,127381,127382,127383,127384,127385,127386,127462,127463,127464,127465,127466,127467,127468,127469,127470,127471,127472,127473,127474,127475,127476,127477,127478,127479,127480,127481,127482,127483,127484,127485,127486,127487,127489,127490,127514,127535,127538,127539,127540,127541,127542,127543,127544,127545,127546,127568,127569,127744,127745,127746,127747,127748,127749,127750,127751,127752,127753,127754,127755,127756,127757,127758,127759,127760,127761,127762,127763,127764,127765,127766,127767,127768,127769,127770,127771,127772,127773,127774,127775,127776,127777,127780,127781,127782,127783,127784,127785,127786,127787,127788,127789,127790,127791,127792,127793,127794,127795,127796,127797,127798,127799,127800,127801,127802,127803,127804,127805,127806,127807,127808,127809,127810,127811,127812,127813,127814,127815,127816,127817,127818,127819,127820,127821,127822,127823,127824,127825,127826,127827,127828,127829,127830,127831,127832,127833,127834,127835,127836,127837,127838,127839,127840,127841,127842,127843,127844,127845,127846,127847,127848,127849,127850,127851,127852,127853,127854,127855,127856,127857,127858,127859,127860,127861,127862,127863,127864,127865,127866,127867,127868,127869,127870,127871,127872,127873,127874,127875,127876,127877,127878,127879,127880,127881,127882,127883,127884,127885,127886,127887,127888,127889,127890,127891,127894,127895,127897,127898,127899,127902,127903,127904,127905,127906,127907,127908,127909,127910,127911,127912,127913,127914,127915,127916,127917,127918,127919,127920,127921,127922,127923,127924,127925,127926,127927,127928,127929,127930,127931,127932,127933,127934,127935,127936,127937,127938,127939,127940,127941,127942,127943,127944,127945,127946,127947,127948,127949,127950,127951,127952,127953,127954,127955,127956,127957,127958,127959,127960,127961,127962,127963,127964,127965,127966,127967,127968,127969,127970,127971,127972,127973,127974,127975,127976,127977,127978,127979,127980,127981,127982,127983,127984,127987,127988,127989,127991,127992,127993,127994,127995,127996,127997,127998,127999,128000,128001,128002,128003,128004,128005,128006,128007,128008,128009,128010,128011,128012,128013,128014,128015,128016,128017,128018,128019,128020,128021,128022,128023,128024,128025,128026,128027,128028,128029,128030,128031,128032,128033,128034,128035,128036,128037,128038,128039,128040,128041,128042,128043,128044,128045,128046,128047,128048,128049,128050,128051,128052,128053,128054,128055,128056,128057,128058,128059,128060,128061,128062,128063,128064,128065,128066,128067,128068,128069,128070,128071,128072,128073,128074,128075,128076,128077,128078,128079,128080,128081,128082,128083,128084,128085,128086,128087,128088,128089,128090,128091,128092,128093,128094,128095,128096,128097,128098,128099,128100,128101,128102,128103,128104,128105,128106,128107,128108,128109,128110,128111,128112,128113,128114,128115,128116,128117,128118,128119,128120,128121,128122,128123,128124,128125,128126,128127,128128,128129,128130,128131,128132,128133,128134,128135,128136,128137,128138,128139,128140,128141,128142,128143,128144,128145,128146,128147,128148,128149,128150,128151,128152,128153,128154,128155,128156,128157,128158,128159,128160,128161,128162,128163,128164,128165,128166,128167,128168,128169,128170,128171,128172,128173,128174,128175,128176,128177,128178,128179,128180,128181,128182,128183,128184,128185,128186,128187,128188,128189,128190,128191,128192,128193,128194,128195,128196,128197,128198,128199,128200,128201,128202,128203,128204,128205,128206,128207,128208,128209,128210,128211,128212,128213,128214,128215,128216,128217,128218,128219,128220,128221,128222,128223,128224,128225,128226,128227,128228,128229,128230,128231,128232,128233,128234,128235,128236,128237,128238,128239,128240,128241,128242,128243,128244,128245,128246,128247,128248,128249,128250,128251,128252,128253,128255,128256,128257,128258,128259,128260,128261,128262,128263,128264,128265,128266,128267,128268,128269,128270,128271,128272,128273,128274,128275,128276,128277,128278,128279,128280,128281,128282,128283,128284,128285,128286,128287,128288,128289,128290,128291,128292,128293,128294,128295,128296,128297,128298,128299,128300,128301,128302,128303,128304,128305,128306,128307,128308,128309,128310,128311,128312,128313,128314,128315,128316,128317,128329,128330,128331,128332,128333,128334,128336,128337,128338,128339,128340,128341,128342,128343,128344,128345,128346,128347,128348,128349,128350,128351,128352,128353,128354,128355,128356,128357,128358,128359,128367,128368,128371,128372,128373,128374,128375,128376,128377,128378,128391,128394,128395,128396,128397,128400,128405,128406,128420,128421,128424,128433,128434,128444,128450,128451,128452,128465,128466,128467,128476,128477,128478,128481,128483,128488,128495,128499,128506,128507,128508,128509,128510,128511,128512,128513,128514,128515,128516,128517,128518,128519,128520,128521,128522,128523,128524,128525,128526,128527,128528,128529,128530,128531,128532,128533,128534,128535,128536,128537,128538,128539,128540,128541,128542,128543,128544,128545,128546,128547,128548,128549,128550,128551,128552,128553,128554,128555,128556,128557,128558,128559,128560,128561,128562,128563,128564,128565,128566,128567,128568,128569,128570,128571,128572,128573,128574,128575,128576,128577,128578,128579,128580,128581,128582,128583,128584,128585,128586,128587,128588,128589,128590,128591,128640,128641,128642,128643,128644,128645,128646,128647,128648,128649,128650,128651,128652,128653,128654,128655,128656,128657,128658,128659,128660,128661,128662,128663,128664,128665,128666,128667,128668,128669,128670,128671,128672,128673,128674,128675,128676,128677,128678,128679,128680,128681,128682,128683,128684,128685,128686,128687,128688,128689,128690,128691,128692,128693,128694,128695,128696,128697,128698,128699,128700,128701,128702,128703,128704,128705,128706,128707,128708,128709,128715,128716,128717,128718,128719,128720,128721,128722,128725,128726,128727,128732,128733,128734,128735,128736,128737,128738,128739,128740,128741,128745,128747,128748,128752,128755,128756,128757,128758,128759,128760,128761,128762,128763,128764,128992,128993,128994,128995,128996,128997,128998,128999,129000,129001,129002,129003,129008,129292,129293,129294,129295,129296,129297,129298,129299,129300,129301,129302,129303,129304,129305,129306,129307,129308,129309,129310,129311,129312,129313,129314,129315,129316,129317,129318,129319,129320,129321,129322,129323,129324,129325,129326,129327,129328,129329,129330,129331,129332,129333,129334,129335,129336,129337,129338,129340,129341,129342,129343,129344,129345,129346,129347,129348,129349,129351,129352,129353,129354,129355,129356,129357,129358,129359,129360,129361,129362,129363,129364,129365,129366,129367,129368,129369,129370,129371,129372,129373,129374,129375,129376,129377,129378,129379,129380,129381,129382,129383,129384,129385,129386,129387,129388,129389,129390,129391,129392,129393,129394,129395,129396,129397,129398,129399,129400,129401,129402,129403,129404,129405,129406,129407,129408,129409,129410,129411,129412,129413,129414,129415,129416,129417,129418,129419,129420,129421,129422,129423,129424,129425,129426,129427,129428,129429,129430,129431,129432,129433,129434,129435,129436,129437,129438,129439,129440,129441,129442,129443,129444,129445,129446,129447,129448,129449,129450,129451,129452,129453,129454,129455,129456,129457,129458,129459,129460,129461,129462,129463,129464,129465,129466,129467,129468,129469,129470,129471,129472,129473,129474,129475,129476,129477,129478,129479,129480,129481,129482,129483,129484,129485,129486,129487,129488,129489,129490,129491,129492,129493,129494,129495,129496,129497,129498,129499,129500,129501,129502,129503,129504,129505,129506,129507,129508,129509,129510,129511,129512,129513,129514,129515,129516,129517,129518,129519,129520,129521,129522,129523,129524,129525,129526,129527,129528,129529,129530,129531,129532,129533,129534,129535,129648,129649,129650,129651,129652,129653,129654,129655,129656,129657,129658,129659,129660,129664,129665,129666,129667,129668,129669,129670,129671,129672,129680,129681,129682,129683,129684,129685,129686,129687,129688,129689,129690,129691,129692,129693,129694,129695,129696,129697,129698,129699,129700,129701,129702,129703,129704,129705,129706,129707,129708,129709,129710,129711,129712,129713,129714,129715,129716,129717,129718,129719,129720,129721,129722,129723,129724,129725,129727,129728,129729,129730,129731,129732,129733,129742,129743,129744,129745,129746,129747,129748,129749,129750,129751,129752,129753,129754,129755,129760,129761,129762,129763,129764,129765,129766,129767,129768,129776,129777,129778,129779,129780,129781,129782,129783,129784],"Emoji_Presentation":[8986,8987,9193,9194,9195,9196,9200,9203,9725,9726,9748,9749,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9855,9875,9889,9898,9899,9917,9918,9924,9925,9934,9940,9962,9970,9971,9973,9978,9981,9989,9994,9995,10024,10060,10062,10067,10068,10069,10071,10133,10134,10135,10160,10175,11035,11036,11088,11093,126980,127183,127374,127377,127378,127379,127380,127381,127382,127383,127384,127385,127386,127462,127463,127464,127465,127466,127467,127468,127469,127470,127471,127472,127473,127474,127475,127476,127477,127478,127479,127480,127481,127482,127483,127484,127485,127486,127487,127489,127514,127535,127538,127539,127540,127541,127542,127544,127545,127546,127568,127569,127744,127745,127746,127747,127748,127749,127750,127751,127752,127753,127754,127755,127756,127757,127758,127759,127760,127761,127762,127763,127764,127765,127766,127767,127768,127769,127770,127771,127772,127773,127774,127775,127776,127789,127790,127791,127792,127793,127794,127795,127796,127797,127799,127800,127801,127802,127803,127804,127805,127806,127807,127808,127809,127810,127811,127812,127813,127814,127815,127816,127817,127818,127819,127820,127821,127822,127823,127824,127825,127826,127827,127828,127829,127830,127831,127832,127833,127834,127835,127836,127837,127838,127839,127840,127841,127842,127843,127844,127845,127846,127847,127848,127849,127850,127851,127852,127853,127854,127855,127856,127857,127858,127859,127860,127861,127862,127863,127864,127865,127866,127867,127868,127870,127871,127872,127873,127874,127875,127876,127877,127878,127879,127880,127881,127882,127883,127884,127885,127886,127887,127888,127889,127890,127891,127904,127905,127906,127907,127908,127909,127910,127911,127912,127913,127914,127915,127916,127917,127918,127919,127920,127921,127922,127923,127924,127925,127926,127927,127928,127929,127930,127931,127932,127933,127934,127935,127936,127937,127938,127939,127940,127941,127942,127943,127944,127945,127946,127951,127952,127953,127954,127955,127968,127969,127970,127971,127972,127973,127974,127975,127976,127977,127978,127979,127980,127981,127982,127983,127984,127988,127992,127993,127994,127995,127996,127997,127998,127999,128000,128001,128002,128003,128004,128005,128006,128007,128008,128009,128010,128011,128012,128013,128014,128015,128016,128017,128018,128019,128020,128021,128022,128023,128024,128025,128026,128027,128028,128029,128030,128031,128032,128033,128034,128035,128036,128037,128038,128039,128040,128041,128042,128043,128044,128045,128046,128047,128048,128049,128050,128051,128052,128053,128054,128055,128056,128057,128058,128059,128060,128061,128062,128064,128066,128067,128068,128069,128070,128071,128072,128073,128074,128075,128076,128077,128078,128079,128080,128081,128082,128083,128084,128085,128086,128087,128088,128089,128090,128091,128092,128093,128094,128095,128096,128097,128098,128099,128100,128101,128102,128103,128104,128105,128106,128107,128108,128109,128110,128111,128112,128113,128114,128115,128116,128117,128118,128119,128120,128121,128122,128123,128124,128125,128126,128127,128128,128129,128130,128131,128132,128133,128134,128135,128136,128137,128138,128139,128140,128141,128142,128143,128144,128145,128146,128147,128148,128149,128150,128151,128152,128153,128154,128155,128156,128157,128158,128159,128160,128161,128162,128163,128164,128165,128166,128167,128168,128169,128170,128171,128172,128173,128174,128175,128176,128177,128178,128179,128180,128181,128182,128183,128184,128185,128186,128187,128188,128189,128190,128191,128192,128193,128194,128195,128196,128197,128198,128199,128200,128201,128202,128203,128204,128205,128206,128207,128208,128209,128210,128211,128212,128213,128214,128215,128216,128217,128218,128219,128220,128221,128222,128223,128224,128225,128226,128227,128228,128229,128230,128231,128232,128233,128234,128235,128236,128237,128238,128239,128240,128241,128242,128243,128244,128245,128246,128247,128248,128249,128250,128251,128252,128255,128256,128257,128258,128259,128260,128261,128262,128263,128264,128265,128266,128267,128268,128269,128270,128271,128272,128273,128274,128275,128276,128277,128278,128279,128280,128281,128282,128283,128284,128285,128286,128287,128288,128289,128290,128291,128292,128293,128294,128295,128296,128297,128298,128299,128300,128301,128302,128303,128304,128305,128306,128307,128308,128309,128310,128311,128312,128313,128314,128315,128316,128317,128331,128332,128333,128334,128336,128337,128338,128339,128340,128341,128342,128343,128344,128345,128346,128347,128348,128349,128350,128351,128352,128353,128354,128355,128356,128357,128358,128359,128378,128405,128406,128420,128507,128508,128509,128510,128511,128512,128513,128514,128515,128516,128517,128518,128519,128520,128521,128522,128523,128524,128525,128526,128527,128528,128529,128530,128531,128532,128533,128534,128535,128536,128537,128538,128539,128540,128541,128542,128543,128544,128545,128546,128547,128548,128549,128550,128551,128552,128553,128554,128555,128556,128557,128558,128559,128560,128561,128562,128563,128564,128565,128566,128567,128568,128569,128570,128571,128572,128573,128574,128575,128576,128577,128578,128579,128580,128581,128582,128583,128584,128585,128586,128587,128588,128589,128590,128591,128640,128641,128642,128643,128644,128645,128646,128647,128648,128649,128650,128651,128652,128653,128654,128655,128656,128657,128658,128659,128660,128661,128662,128663,128664,128665,128666,128667,128668,128669,128670,128671,128672,128673,128674,128675,128676,128677,128678,128679,128680,128681,128682,128683,128684,128685,128686,128687,128688,128689,128690,128691,128692,128693,128694,128695,128696,128697,128698,128699,128700,128701,128702,128703,128704,128705,128706,128707,128708,128709,128716,128720,128721,128722,128725,128726,128727,128732,128733,128734,128735,128747,128748,128756,128757,128758,128759,128760,128761,128762,128763,128764,128992,128993,128994,128995,128996,128997,128998,128999,129000,129001,129002,129003,129008,129292,129293,129294,129295,129296,129297,129298,129299,129300,129301,129302,129303,129304,129305,129306,129307,129308,129309,129310,129311,129312,129313,129314,129315,129316,129317,129318,129319,129320,129321,129322,129323,129324,129325,129326,129327,129328,129329,129330,129331,129332,129333,129334,129335,129336,129337,129338,129340,129341,129342,129343,129344,129345,129346,129347,129348,129349,129351,129352,129353,129354,129355,129356,129357,129358,129359,129360,129361,129362,129363,129364,129365,129366,129367,129368,129369,129370,129371,129372,129373,129374,129375,129376,129377,129378,129379,129380,129381,129382,129383,129384,129385,129386,129387,129388,129389,129390,129391,129392,129393,129394,129395,129396,129397,129398,129399,129400,129401,129402,129403,129404,129405,129406,129407,129408,129409,129410,129411,129412,129413,129414,129415,129416,129417,129418,129419,129420,129421,129422,129423,129424,129425,129426,129427,129428,129429,129430,129431,129432,129433,129434,129435,129436,129437,129438,129439,129440,129441,129442,129443,129444,129445,129446,129447,129448,129449,129450,129451,129452,129453,129454,129455,129456,129457,129458,129459,129460,129461,129462,129463,129464,129465,129466,129467,129468,129469,129470,129471,129472,129473,129474,129475,129476,129477,129478,129479,129480,129481,129482,129483,129484,129485,129486,129487,129488,129489,129490,129491,129492,129493,129494,129495,129496,129497,129498,129499,129500,129501,129502,129503,129504,129505,129506,129507,129508,129509,129510,129511,129512,129513,129514,129515,129516,129517,129518,129519,129520,129521,129522,129523,129524,129525,129526,129527,129528,129529,129530,129531,129532,129533,129534,129535,129648,129649,129650,129651,129652,129653,129654,129655,129656,129657,129658,129659,129660,129664,129665,129666,129667,129668,129669,129670,129671,129672,129680,129681,129682,129683,129684,129685,129686,129687,129688,129689,129690,129691,129692,129693,129694,129695,129696,129697,129698,129699,129700,129701,129702,129703,129704,129705,129706,129707,129708,129709,129710,129711,129712,129713,129714,129715,129716,129717,129718,129719,129720,129721,129722,129723,129724,129725,129727,129728,129729,129730,129731,129732,129733,129742,129743,129744,129745,129746,129747,129748,129749,129750,129751,129752,129753,129754,129755,129760,129761,129762,129763,129764,129765,129766,129767,129768,129776,129777,129778,129779,129780,129781,129782,129783,129784],"Emoji_Modifier":[127995,127996,127997,127998,127999],"Emoji_Modifier_Base":[9757,9977,9994,9995,9996,9997,127877,127938,127939,127940,127943,127946,127947,127948,128066,128067,128070,128071,128072,128073,128074,128075,128076,128077,128078,128079,128080,128102,128103,128104,128105,128106,128107,128108,128109,128110,128111,128112,128113,128114,128115,128116,128117,128118,128119,128120,128124,128129,128130,128131,128133,128134,128135,128143,128145,128170,128372,128373,128378,128400,128405,128406,128581,128582,128583,128587,128588,128589,128590,128591,128675,128692,128693,128694,128704,128716,129292,129295,129304,129305,129306,129307,129308,129309,129310,129311,129318,129328,129329,129330,129331,129332,129333,129334,129335,129336,129337,129340,129341,129342,129399,129461,129462,129464,129465,129467,129485,129486,129487,129489,129490,129491,129492,129493,129494,129495,129496,129497,129498,129499,129500,129501,129731,129732,129733,129776,129777,129778,129779,129780,129781,129782,129783,129784],"Emoji_Component":[35,42,48,49,50,51,52,53,54,55,56,57,8205,8419,65039,127462,127463,127464,127465,127466,127467,127468,127469,127470,127471,127472,127473,127474,127475,127476,127477,127478,127479,127480,127481,127482,127483,127484,127485,127486,127487,127995,127996,127997,127998,127999,129456,129457,129458,129459,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631],"Extended_Pictographic":[169,174,8252,8265,8482,8505,8596,8597,8598,8599,8600,8601,8617,8618,8986,8987,9000,9096,9167,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9208,9209,9210,9410,9642,9643,9654,9664,9723,9724,9725,9726,9728,9729,9730,9731,9732,9733,9735,9736,9737,9738,9739,9740,9741,9742,9743,9744,9745,9746,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987,9988,9989,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10004,10006,10013,10017,10024,10035,10036,10052,10055,10060,10062,10067,10068,10069,10071,10083,10084,10085,10086,10087,10133,10134,10135,10145,10160,10175,10548,10549,11013,11014,11015,11035,11036,11088,11093,12336,12349,12951,12953,126976,126977,126978,126979,126980,126981,126982,126983,126984,126985,126986,126987,126988,126989,126990,126991,126992,126993,126994,126995,126996,126997,126998,126999,127000,127001,127002,127003,127004,127005,127006,127007,127008,127009,127010,127011,127012,127013,127014,127015,127016,127017,127018,127019,127020,127021,127022,127023,127024,127025,127026,127027,127028,127029,127030,127031,127032,127033,127034,127035,127036,127037,127038,127039,127040,127041,127042,127043,127044,127045,127046,127047,127048,127049,127050,127051,127052,127053,127054,127055,127056,127057,127058,127059,127060,127061,127062,127063,127064,127065,127066,127067,127068,127069,127070,127071,127072,127073,127074,127075,127076,127077,127078,127079,127080,127081,127082,127083,127084,127085,127086,127087,127088,127089,127090,127091,127092,127093,127094,127095,127096,127097,127098,127099,127100,127101,127102,127103,127104,127105,127106,127107,127108,127109,127110,127111,127112,127113,127114,127115,127116,127117,127118,127119,127120,127121,127122,127123,127124,127125,127126,127127,127128,127129,127130,127131,127132,127133,127134,127135,127136,127137,127138,127139,127140,127141,127142,127143,127144,127145,127146,127147,127148,127149,127150,127151,127152,127153,127154,127155,127156,127157,127158,127159,127160,127161,127162,127163,127164,127165,127166,127167,127168,127169,127170,127171,127172,127173,127174,127175,127176,127177,127178,127179,127180,127181,127182,127183,127184,127185,127186,127187,127188,127189,127190,127191,127192,127193,127194,127195,127196,127197,127198,127199,127200,127201,127202,127203,127204,127205,127206,127207,127208,127209,127210,127211,127212,127213,127214,127215,127216,127217,127218,127219,127220,127221,127222,127223,127224,127225,127226,127227,127228,127229,127230,127231,127245,127246,127247,127279,127340,127341,127342,127343,127344,127345,127358,127359,127374,127377,127378,127379,127380,127381,127382,127383,127384,127385,127386,127405,127406,127407,127408,127409,127410,127411,127412,127413,127414,127415,127416,127417,127418,127419,127420,127421,127422,127423,127424,127425,127426,127427,127428,127429,127430,127431,127432,127433,127434,127435,127436,127437,127438,127439,127440,127441,127442,127443,127444,127445,127446,127447,127448,127449,127450,127451,127452,127453,127454,127455,127456,127457,127458,127459,127460,127461,127489,127490,127491,127492,127493,127494,127495,127496,127497,127498,127499,127500,127501,127502,127503,127514,127535,127538,127539,127540,127541,127542,127543,127544,127545,127546,127548,127549,127550,127551,127561,127562,127563,127564,127565,127566,127567,127568,127569,127570,127571,127572,127573,127574,127575,127576,127577,127578,127579,127580,127581,127582,127583,127584,127585,127586,127587,127588,127589,127590,127591,127592,127593,127594,127595,127596,127597,127598,127599,127600,127601,127602,127603,127604,127605,127606,127607,127608,127609,127610,127611,127612,127613,127614,127615,127616,127617,127618,127619,127620,127621,127622,127623,127624,127625,127626,127627,127628,127629,127630,127631,127632,127633,127634,127635,127636,127637,127638,127639,127640,127641,127642,127643,127644,127645,127646,127647,127648,127649,127650,127651,127652,127653,127654,127655,127656,127657,127658,127659,127660,127661,127662,127663,127664,127665,127666,127667,127668,127669,127670,127671,127672,127673,127674,127675,127676,127677,127678,127679,127680,127681,127682,127683,127684,127685,127686,127687,127688,127689,127690,127691,127692,127693,127694,127695,127696,127697,127698,127699,127700,127701,127702,127703,127704,127705,127706,127707,127708,127709,127710,127711,127712,127713,127714,127715,127716,127717,127718,127719,127720,127721,127722,127723,127724,127725,127726,127727,127728,127729,127730,127731,127732,127733,127734,127735,127736,127737,127738,127739,127740,127741,127742,127743,127744,127745,127746,127747,127748,127749,127750,127751,127752,127753,127754,127755,127756,127757,127758,127759,127760,127761,127762,127763,127764,127765,127766,127767,127768,127769,127770,127771,127772,127773,127774,127775,127776,127777,127778,127779,127780,127781,127782,127783,127784,127785,127786,127787,127788,127789,127790,127791,127792,127793,127794,127795,127796,127797,127798,127799,127800,127801,127802,127803,127804,127805,127806,127807,127808,127809,127810,127811,127812,127813,127814,127815,127816,127817,127818,127819,127820,127821,127822,127823,127824,127825,127826,127827,127828,127829,127830,127831,127832,127833,127834,127835,127836,127837,127838,127839,127840,127841,127842,127843,127844,127845,127846,127847,127848,127849,127850,127851,127852,127853,127854,127855,127856,127857,127858,127859,127860,127861,127862,127863,127864,127865,127866,127867,127868,127869,127870,127871,127872,127873,127874,127875,127876,127877,127878,127879,127880,127881,127882,127883,127884,127885,127886,127887,127888,127889,127890,127891,127892,127893,127894,127895,127896,127897,127898,127899,127900,127901,127902,127903,127904,127905,127906,127907,127908,127909,127910,127911,127912,127913,127914,127915,127916,127917,127918,127919,127920,127921,127922,127923,127924,127925,127926,127927,127928,127929,127930,127931,127932,127933,127934,127935,127936,127937,127938,127939,127940,127941,127942,127943,127944,127945,127946,127947,127948,127949,127950,127951,127952,127953,127954,127955,127956,127957,127958,127959,127960,127961,127962,127963,127964,127965,127966,127967,127968,127969,127970,127971,127972,127973,127974,127975,127976,127977,127978,127979,127980,127981,127982,127983,127984,127985,127986,127987,127988,127989,127990,127991,127992,127993,127994,128000,128001,128002,128003,128004,128005,128006,128007,128008,128009,128010,128011,128012,128013,128014,128015,128016,128017,128018,128019,128020,128021,128022,128023,128024,128025,128026,128027,128028,128029,128030,128031,128032,128033,128034,128035,128036,128037,128038,128039,128040,128041,128042,128043,128044,128045,128046,128047,128048,128049,128050,128051,128052,128053,128054,128055,128056,128057,128058,128059,128060,128061,128062,128063,128064,128065,128066,128067,128068,128069,128070,128071,128072,128073,128074,128075,128076,128077,128078,128079,128080,128081,128082,128083,128084,128085,128086,128087,128088,128089,128090,128091,128092,128093,128094,128095,128096,128097,128098,128099,128100,128101,128102,128103,128104,128105,128106,128107,128108,128109,128110,128111,128112,128113,128114,128115,128116,128117,128118,128119,128120,128121,128122,128123,128124,128125,128126,128127,128128,128129,128130,128131,128132,128133,128134,128135,128136,128137,128138,128139,128140,128141,128142,128143,128144,128145,128146,128147,128148,128149,128150,128151,128152,128153,128154,128155,128156,128157,128158,128159,128160,128161,128162,128163,128164,128165,128166,128167,128168,128169,128170,128171,128172,128173,128174,128175,128176,128177,128178,128179,128180,128181,128182,128183,128184,128185,128186,128187,128188,128189,128190,128191,128192,128193,128194,128195,128196,128197,128198,128199,128200,128201,128202,128203,128204,128205,128206,128207,128208,128209,128210,128211,128212,128213,128214,128215,128216,128217,128218,128219,128220,128221,128222,128223,128224,128225,128226,128227,128228,128229,128230,128231,128232,128233,128234,128235,128236,128237,128238,128239,128240,128241,128242,128243,128244,128245,128246,128247,128248,128249,128250,128251,128252,128253,128254,128255,128256,128257,128258,128259,128260,128261,128262,128263,128264,128265,128266,128267,128268,128269,128270,128271,128272,128273,128274,128275,128276,128277,128278,128279,128280,128281,128282,128283,128284,128285,128286,128287,128288,128289,128290,128291,128292,128293,128294,128295,128296,128297,128298,128299,128300,128301,128302,128303,128304,128305,128306,128307,128308,128309,128310,128311,128312,128313,128314,128315,128316,128317,128326,128327,128328,128329,128330,128331,128332,128333,128334,128335,128336,128337,128338,128339,128340,128341,128342,128343,128344,128345,128346,128347,128348,128349,128350,128351,128352,128353,128354,128355,128356,128357,128358,128359,128360,128361,128362,128363,128364,128365,128366,128367,128368,128369,128370,128371,128372,128373,128374,128375,128376,128377,128378,128379,128380,128381,128382,128383,128384,128385,128386,128387,128388,128389,128390,128391,128392,128393,128394,128395,128396,128397,128398,128399,128400,128401,128402,128403,128404,128405,128406,128407,128408,128409,128410,128411,128412,128413,128414,128415,128416,128417,128418,128419,128420,128421,128422,128423,128424,128425,128426,128427,128428,128429,128430,128431,128432,128433,128434,128435,128436,128437,128438,128439,128440,128441,128442,128443,128444,128445,128446,128447,128448,128449,128450,128451,128452,128453,128454,128455,128456,128457,128458,128459,128460,128461,128462,128463,128464,128465,128466,128467,128468,128469,128470,128471,128472,128473,128474,128475,128476,128477,128478,128479,128480,128481,128482,128483,128484,128485,128486,128487,128488,128489,128490,128491,128492,128493,128494,128495,128496,128497,128498,128499,128500,128501,128502,128503,128504,128505,128506,128507,128508,128509,128510,128511,128512,128513,128514,128515,128516,128517,128518,128519,128520,128521,128522,128523,128524,128525,128526,128527,128528,128529,128530,128531,128532,128533,128534,128535,128536,128537,128538,128539,128540,128541,128542,128543,128544,128545,128546,128547,128548,128549,128550,128551,128552,128553,128554,128555,128556,128557,128558,128559,128560,128561,128562,128563,128564,128565,128566,128567,128568,128569,128570,128571,128572,128573,128574,128575,128576,128577,128578,128579,128580,128581,128582,128583,128584,128585,128586,128587,128588,128589,128590,128591,128640,128641,128642,128643,128644,128645,128646,128647,128648,128649,128650,128651,128652,128653,128654,128655,128656,128657,128658,128659,128660,128661,128662,128663,128664,128665,128666,128667,128668,128669,128670,128671,128672,128673,128674,128675,128676,128677,128678,128679,128680,128681,128682,128683,128684,128685,128686,128687,128688,128689,128690,128691,128692,128693,128694,128695,128696,128697,128698,128699,128700,128701,128702,128703,128704,128705,128706,128707,128708,128709,128710,128711,128712,128713,128714,128715,128716,128717,128718,128719,128720,128721,128722,128723,128724,128725,128726,128727,128728,128729,128730,128731,128732,128733,128734,128735,128736,128737,128738,128739,128740,128741,128742,128743,128744,128745,128746,128747,128748,128749,128750,128751,128752,128753,128754,128755,128756,128757,128758,128759,128760,128761,128762,128763,128764,128765,128766,128767,128884,128885,128886,128887,128888,128889,128890,128891,128892,128893,128894,128895,128981,128982,128983,128984,128985,128986,128987,128988,128989,128990,128991,128992,128993,128994,128995,128996,128997,128998,128999,129000,129001,129002,129003,129004,129005,129006,129007,129008,129009,129010,129011,129012,129013,129014,129015,129016,129017,129018,129019,129020,129021,129022,129023,129036,129037,129038,129039,129096,129097,129098,129099,129100,129101,129102,129103,129114,129115,129116,129117,129118,129119,129160,129161,129162,129163,129164,129165,129166,129167,129198,129199,129200,129201,129202,129203,129204,129205,129206,129207,129208,129209,129210,129211,129212,129213,129214,129215,129216,129217,129218,129219,129220,129221,129222,129223,129224,129225,129226,129227,129228,129229,129230,129231,129232,129233,129234,129235,129236,129237,129238,129239,129240,129241,129242,129243,129244,129245,129246,129247,129248,129249,129250,129251,129252,129253,129254,129255,129256,129257,129258,129259,129260,129261,129262,129263,129264,129265,129266,129267,129268,129269,129270,129271,129272,129273,129274,129275,129276,129277,129278,129279,129292,129293,129294,129295,129296,129297,129298,129299,129300,129301,129302,129303,129304,129305,129306,129307,129308,129309,129310,129311,129312,129313,129314,129315,129316,129317,129318,129319,129320,129321,129322,129323,129324,129325,129326,129327,129328,129329,129330,129331,129332,129333,129334,129335,129336,129337,129338,129340,129341,129342,129343,129344,129345,129346,129347,129348,129349,129351,129352,129353,129354,129355,129356,129357,129358,129359,129360,129361,129362,129363,129364,129365,129366,129367,129368,129369,129370,129371,129372,129373,129374,129375,129376,129377,129378,129379,129380,129381,129382,129383,129384,129385,129386,129387,129388,129389,129390,129391,129392,129393,129394,129395,129396,129397,129398,129399,129400,129401,129402,129403,129404,129405,129406,129407,129408,129409,129410,129411,129412,129413,129414,129415,129416,129417,129418,129419,129420,129421,129422,129423,129424,129425,129426,129427,129428,129429,129430,129431,129432,129433,129434,129435,129436,129437,129438,129439,129440,129441,129442,129443,129444,129445,129446,129447,129448,129449,129450,129451,129452,129453,129454,129455,129456,129457,129458,129459,129460,129461,129462,129463,129464,129465,129466,129467,129468,129469,129470,129471,129472,129473,129474,129475,129476,129477,129478,129479,129480,129481,129482,129483,129484,129485,129486,129487,129488,129489,129490,129491,129492,129493,129494,129495,129496,129497,129498,129499,129500,129501,129502,129503,129504,129505,129506,129507,129508,129509,129510,129511,129512,129513,129514,129515,129516,129517,129518,129519,129520,129521,129522,129523,129524,129525,129526,129527,129528,129529,129530,129531,129532,129533,129534,129535,129536,129537,129538,129539,129540,129541,129542,129543,129544,129545,129546,129547,129548,129549,129550,129551,129552,129553,129554,129555,129556,129557,129558,129559,129560,129561,129562,129563,129564,129565,129566,129567,129568,129569,129570,129571,129572,129573,129574,129575,129576,129577,129578,129579,129580,129581,129582,129583,129584,129585,129586,129587,129588,129589,129590,129591,129592,129593,129594,129595,129596,129597,129598,129599,129600,129601,129602,129603,129604,129605,129606,129607,129608,129609,129610,129611,129612,129613,129614,129615,129616,129617,129618,129619,129620,129621,129622,129623,129624,129625,129626,129627,129628,129629,129630,129631,129632,129633,129634,129635,129636,129637,129638,129639,129640,129641,129642,129643,129644,129645,129646,129647,129648,129649,129650,129651,129652,129653,129654,129655,129656,129657,129658,129659,129660,129661,129662,129663,129664,129665,129666,129667,129668,129669,129670,129671,129672,129673,129674,129675,129676,129677,129678,129679,129680,129681,129682,129683,129684,129685,129686,129687,129688,129689,129690,129691,129692,129693,129694,129695,129696,129697,129698,129699,129700,129701,129702,129703,129704,129705,129706,129707,129708,129709,129710,129711,129712,129713,129714,129715,129716,129717,129718,129719,129720,129721,129722,129723,129724,129725,129726,129727,129728,129729,129730,129731,129732,129733,129734,129735,129736,129737,129738,129739,129740,129741,129742,129743,129744,129745,129746,129747,129748,129749,129750,129751,129752,129753,129754,129755,129756,129757,129758,129759,129760,129761,129762,129763,129764,129765,129766,129767,129768,129769,129770,129771,129772,129773,129774,129775,129776,129777,129778,129779,129780,129781,129782,129783,129784,129785,129786,129787,129788,129789,129790,129791,130048,130049,130050,130051,130052,130053,130054,130055,130056,130057,130058,130059,130060,130061,130062,130063,130064,130065,130066,130067,130068,130069,130070,130071,130072,130073,130074,130075,130076,130077,130078,130079,130080,130081,130082,130083,130084,130085,130086,130087,130088,130089,130090,130091,130092,130093,130094,130095,130096,130097,130098,130099,130100,130101,130102,130103,130104,130105,130106,130107,130108,130109,130110,130111,130112,130113,130114,130115,130116,130117,130118,130119,130120,130121,130122,130123,130124,130125,130126,130127,130128,130129,130130,130131,130132,130133,130134,130135,130136,130137,130138,130139,130140,130141,130142,130143,130144,130145,130146,130147,130148,130149,130150,130151,130152,130153,130154,130155,130156,130157,130158,130159,130160,130161,130162,130163,130164,130165,130166,130167,130168,130169,130170,130171,130172,130173,130174,130175,130176,130177,130178,130179,130180,130181,130182,130183,130184,130185,130186,130187,130188,130189,130190,130191,130192,130193,130194,130195,130196,130197,130198,130199,130200,130201,130202,130203,130204,130205,130206,130207,130208,130209,130210,130211,130212,130213,130214,130215,130216,130217,130218,130219,130220,130221,130222,130223,130224,130225,130226,130227,130228,130229,130230,130231,130232,130233,130234,130235,130236,130237,130238,130239,130240,130241,130242,130243,130244,130245,130246,130247,130248,130249,130250,130251,130252,130253,130254,130255,130256,130257,130258,130259,130260,130261,130262,130263,130264,130265,130266,130267,130268,130269,130270,130271,130272,130273,130274,130275,130276,130277,130278,130279,130280,130281,130282,130283,130284,130285,130286,130287,130288,130289,130290,130291,130292,130293,130294,130295,130296,130297,130298,130299,130300,130301,130302,130303,130304,130305,130306,130307,130308,130309,130310,130311,130312,130313,130314,130315,130316,130317,130318,130319,130320,130321,130322,130323,130324,130325,130326,130327,130328,130329,130330,130331,130332,130333,130334,130335,130336,130337,130338,130339,130340,130341,130342,130343,130344,130345,130346,130347,130348,130349,130350,130351,130352,130353,130354,130355,130356,130357,130358,130359,130360,130361,130362,130363,130364,130365,130366,130367,130368,130369,130370,130371,130372,130373,130374,130375,130376,130377,130378,130379,130380,130381,130382,130383,130384,130385,130386,130387,130388,130389,130390,130391,130392,130393,130394,130395,130396,130397,130398,130399,130400,130401,130402,130403,130404,130405,130406,130407,130408,130409,130410,130411,130412,130413,130414,130415,130416,130417,130418,130419,130420,130421,130422,130423,130424,130425,130426,130427,130428,130429,130430,130431,130432,130433,130434,130435,130436,130437,130438,130439,130440,130441,130442,130443,130444,130445,130446,130447,130448,130449,130450,130451,130452,130453,130454,130455,130456,130457,130458,130459,130460,130461,130462,130463,130464,130465,130466,130467,130468,130469,130470,130471,130472,130473,130474,130475,130476,130477,130478,130479,130480,130481,130482,130483,130484,130485,130486,130487,130488,130489,130490,130491,130492,130493,130494,130495,130496,130497,130498,130499,130500,130501,130502,130503,130504,130505,130506,130507,130508,130509,130510,130511,130512,130513,130514,130515,130516,130517,130518,130519,130520,130521,130522,130523,130524,130525,130526,130527,130528,130529,130530,130531,130532,130533,130534,130535,130536,130537,130538,130539,130540,130541,130542,130543,130544,130545,130546,130547,130548,130549,130550,130551,130552,130553,130554,130555,130556,130557,130558,130559,130560,130561,130562,130563,130564,130565,130566,130567,130568,130569,130570,130571,130572,130573,130574,130575,130576,130577,130578,130579,130580,130581,130582,130583,130584,130585,130586,130587,130588,130589,130590,130591,130592,130593,130594,130595,130596,130597,130598,130599,130600,130601,130602,130603,130604,130605,130606,130607,130608,130609,130610,130611,130612,130613,130614,130615,130616,130617,130618,130619,130620,130621,130622,130623,130624,130625,130626,130627,130628,130629,130630,130631,130632,130633,130634,130635,130636,130637,130638,130639,130640,130641,130642,130643,130644,130645,130646,130647,130648,130649,130650,130651,130652,130653,130654,130655,130656,130657,130658,130659,130660,130661,130662,130663,130664,130665,130666,130667,130668,130669,130670,130671,130672,130673,130674,130675,130676,130677,130678,130679,130680,130681,130682,130683,130684,130685,130686,130687,130688,130689,130690,130691,130692,130693,130694,130695,130696,130697,130698,130699,130700,130701,130702,130703,130704,130705,130706,130707,130708,130709,130710,130711,130712,130713,130714,130715,130716,130717,130718,130719,130720,130721,130722,130723,130724,130725,130726,130727,130728,130729,130730,130731,130732,130733,130734,130735,130736,130737,130738,130739,130740,130741,130742,130743,130744,130745,130746,130747,130748,130749,130750,130751,130752,130753,130754,130755,130756,130757,130758,130759,130760,130761,130762,130763,130764,130765,130766,130767,130768,130769,130770,130771,130772,130773,130774,130775,130776,130777,130778,130779,130780,130781,130782,130783,130784,130785,130786,130787,130788,130789,130790,130791,130792,130793,130794,130795,130796,130797,130798,130799,130800,130801,130802,130803,130804,130805,130806,130807,130808,130809,130810,130811,130812,130813,130814,130815,130816,130817,130818,130819,130820,130821,130822,130823,130824,130825,130826,130827,130828,130829,130830,130831,130832,130833,130834,130835,130836,130837,130838,130839,130840,130841,130842,130843,130844,130845,130846,130847,130848,130849,130850,130851,130852,130853,130854,130855,130856,130857,130858,130859,130860,130861,130862,130863,130864,130865,130866,130867,130868,130869,130870,130871,130872,130873,130874,130875,130876,130877,130878,130879,130880,130881,130882,130883,130884,130885,130886,130887,130888,130889,130890,130891,130892,130893,130894,130895,130896,130897,130898,130899,130900,130901,130902,130903,130904,130905,130906,130907,130908,130909,130910,130911,130912,130913,130914,130915,130916,130917,130918,130919,130920,130921,130922,130923,130924,130925,130926,130927,130928,130929,130930,130931,130932,130933,130934,130935,130936,130937,130938,130939,130940,130941,130942,130943,130944,130945,130946,130947,130948,130949,130950,130951,130952,130953,130954,130955,130956,130957,130958,130959,130960,130961,130962,130963,130964,130965,130966,130967,130968,130969,130970,130971,130972,130973,130974,130975,130976,130977,130978,130979,130980,130981,130982,130983,130984,130985,130986,130987,130988,130989,130990,130991,130992,130993,130994,130995,130996,130997,130998,130999,131000,131001,131002,131003,131004,131005,131006,131007,131008,131009,131010,131011,131012,131013,131014,131015,131016,131017,131018,131019,131020,131021,131022,131023,131024,131025,131026,131027,131028,131029,131030,131031,131032,131033,131034,131035,131036,131037,131038,131039,131040,131041,131042,131043,131044,131045,131046,131047,131048,131049,131050,131051,131052,131053,131054,131055,131056,131057,131058,131059,131060,131061,131062,131063,131064,131065,131066,131067,131068,131069]} \ No newline at end of file diff --git a/cli/src/generate/prepare_grammar/unicode-property-aliases.json b/cli/src/generate/prepare_grammar/unicode-property-aliases.json new file mode 100644 index 00000000..505c497d --- /dev/null +++ b/cli/src/generate/prepare_grammar/unicode-property-aliases.json @@ -0,0 +1 @@ +{"cjkAccountingNumeric":"kAccountingNumeric","cjkOtherNumeric":"kOtherNumeric","cjkPrimaryNumeric":"kPrimaryNumeric","nv":"Numeric_Value","bmg":"Bidi_Mirroring_Glyph","bpb":"Bidi_Paired_Bracket","cf":"Case_Folding","cjkCompatibilityVariant":"kCompatibilityVariant","dm":"Decomposition_Mapping","EqUIdeo":"Equivalent_Unified_Ideograph","FC_NFKC":"FC_NFKC_Closure","lc":"Lowercase_Mapping","NFKC_CF":"NFKC_Casefold","NFKC_SCF":"NFKC_Simple_Casefold","scf":"Simple_Case_Folding","sfc":"Simple_Case_Folding","slc":"Simple_Lowercase_Mapping","stc":"Simple_Titlecase_Mapping","suc":"Simple_Uppercase_Mapping","tc":"Titlecase_Mapping","uc":"Uppercase_Mapping","cjkIICore":"kIICore","cjkIRG_GSource":"kIRG_GSource","cjkIRG_HSource":"kIRG_HSource","cjkIRG_JSource":"kIRG_JSource","cjkIRG_KPSource":"kIRG_KPSource","cjkIRG_KSource":"kIRG_KSource","cjkIRG_MSource":"kIRG_MSource","cjkIRG_SSource":"kIRG_SSource","cjkIRG_TSource":"kIRG_TSource","cjkIRG_UKSource":"kIRG_UKSource","cjkIRG_USource":"kIRG_USource","cjkIRG_VSource":"kIRG_VSource","cjkRSUnicode":"kRSUnicode","Unicode_Radical_Stroke":"kRSUnicode","URS":"kRSUnicode","isc":"ISO_Comment","JSN":"Jamo_Short_Name","na":"Name","na1":"Unicode_1_Name","Name_Alias":"Name_Alias","scx":"Script_Extensions","age":"Age","blk":"Block","sc":"Script","bc":"Bidi_Class","bpt":"Bidi_Paired_Bracket_Type","ccc":"Canonical_Combining_Class","dt":"Decomposition_Type","ea":"East_Asian_Width","gc":"General_Category","GCB":"Grapheme_Cluster_Break","hst":"Hangul_Syllable_Type","InCB":"Indic_Conjunct_Break","InPC":"Indic_Positional_Category","InSC":"Indic_Syllabic_Category","jg":"Joining_Group","jt":"Joining_Type","lb":"Line_Break","NFC_QC":"NFC_Quick_Check","NFD_QC":"NFD_Quick_Check","NFKC_QC":"NFKC_Quick_Check","NFKD_QC":"NFKD_Quick_Check","nt":"Numeric_Type","SB":"Sentence_Break","vo":"Vertical_Orientation","WB":"Word_Break","AHex":"ASCII_Hex_Digit","Alpha":"Alphabetic","Bidi_C":"Bidi_Control","Bidi_M":"Bidi_Mirrored","Cased":"Cased","CE":"Composition_Exclusion","CI":"Case_Ignorable","Comp_Ex":"Full_Composition_Exclusion","CWCF":"Changes_When_Casefolded","CWCM":"Changes_When_Casemapped","CWKCF":"Changes_When_NFKC_Casefolded","CWL":"Changes_When_Lowercased","CWT":"Changes_When_Titlecased","CWU":"Changes_When_Uppercased","Dash":"Dash","Dep":"Deprecated","DI":"Default_Ignorable_Code_Point","Dia":"Diacritic","EBase":"Emoji_Modifier_Base","EComp":"Emoji_Component","EMod":"Emoji_Modifier","Emoji":"Emoji","EPres":"Emoji_Presentation","Ext":"Extender","ExtPict":"Extended_Pictographic","Gr_Base":"Grapheme_Base","Gr_Ext":"Grapheme_Extend","Gr_Link":"Grapheme_Link","Hex":"Hex_Digit","Hyphen":"Hyphen","ID_Compat_Math_Continue":"ID_Compat_Math_Continue","ID_Compat_Math_Start":"ID_Compat_Math_Start","IDC":"ID_Continue","Ideo":"Ideographic","IDS":"ID_Start","IDSB":"IDS_Binary_Operator","IDST":"IDS_Trinary_Operator","IDSU":"IDS_Unary_Operator","Join_C":"Join_Control","LOE":"Logical_Order_Exception","Lower":"Lowercase","Math":"Math","NChar":"Noncharacter_Code_Point","OAlpha":"Other_Alphabetic","ODI":"Other_Default_Ignorable_Code_Point","OGr_Ext":"Other_Grapheme_Extend","OIDC":"Other_ID_Continue","OIDS":"Other_ID_Start","OLower":"Other_Lowercase","OMath":"Other_Math","OUpper":"Other_Uppercase","Pat_Syn":"Pattern_Syntax","Pat_WS":"Pattern_White_Space","PCM":"Prepended_Concatenation_Mark","QMark":"Quotation_Mark","Radical":"Radical","RI":"Regional_Indicator","SD":"Soft_Dotted","STerm":"Sentence_Terminal","Term":"Terminal_Punctuation","UIdeo":"Unified_Ideograph","Upper":"Uppercase","VS":"Variation_Selector","WSpace":"White_Space","space":"White_Space","XIDC":"XID_Continue","XIDS":"XID_Start","XO_NFC":"Expands_On_NFC","XO_NFD":"Expands_On_NFD","XO_NFKC":"Expands_On_NFKC","XO_NFKD":"Expands_On_NFKD"} \ No newline at end of file diff --git a/crates/generate/src/render.rs b/cli/src/generate/render.rs similarity index 82% rename from crates/generate/src/render.rs rename to cli/src/generate/render.rs index bcfc832e..d70b23b6 100644 --- a/crates/generate/src/render.rs +++ b/cli/src/generate/render.rs @@ -1,19 +1,15 @@ use std::{ cmp, - collections::{BTreeMap, BTreeSet, HashMap, HashSet}, + collections::{HashMap, HashSet}, fmt::Write, mem::swap, }; -use crate::LANGUAGE_VERSION; -use indoc::indoc; - use super::{ build_tables::Tables, grammars::{ExternalToken, LexicalGrammar, SyntaxGrammar, VariableType}, nfa::CharacterSet, - node_types::ChildType, - rules::{Alias, AliasMap, Symbol, SymbolType, TokenSet}, + rules::{Alias, AliasMap, Symbol, SymbolType}, tables::{ AdvanceAction, FieldLocation, GotoAction, LexState, LexTable, ParseAction, ParseTable, ParseTableEntry, @@ -21,11 +17,10 @@ use super::{ }; const SMALL_STATE_THRESHOLD: usize = 64; -pub const ABI_VERSION_MIN: usize = 14; -pub const ABI_VERSION_MAX: usize = LANGUAGE_VERSION; -const ABI_VERSION_WITH_RESERVED_WORDS: usize = 15; +const ABI_VERSION_MIN: usize = 13; +const ABI_VERSION_MAX: usize = tree_sitter::LANGUAGE_VERSION; +const ABI_VERSION_WITH_PRIMARY_STATES: usize = 14; -#[clippy::format_args] macro_rules! add { ($this: tt, $($arg: tt)*) => {{ $this.buffer.write_fmt(format_args!($($arg)*)).unwrap(); @@ -34,15 +29,12 @@ macro_rules! add { macro_rules! add_whitespace { ($this:tt) => {{ - // 4 bytes per char, 2 spaces per indent level - $this.buffer.reserve(4 * 2 * $this.indent_level); for _ in 0..$this.indent_level { write!(&mut $this.buffer, " ").unwrap(); } }}; } -#[clippy::format_args] macro_rules! add_line { ($this: tt, $($arg: tt)*) => { add_whitespace!($this); @@ -64,7 +56,6 @@ macro_rules! dedent { }; } -#[derive(Default)] struct Generator { buffer: String, indent_level: usize, @@ -75,6 +66,7 @@ struct Generator { large_character_sets: Vec<(Option, CharacterSet)>, large_character_set_info: Vec, large_state_count: usize, + keyword_capture_token: Option, syntax_grammar: SyntaxGrammar, lexical_grammar: LexicalGrammar, default_aliases: AliasMap, @@ -83,13 +75,10 @@ struct Generator { alias_ids: HashMap, unique_aliases: Vec, symbol_map: HashMap, - reserved_word_sets: Vec, - reserved_word_set_ids_by_parse_state: Vec, field_names: Vec, - supertype_symbol_map: BTreeMap>, - supertype_map: BTreeMap>, + + #[allow(unused)] abi_version: usize, - metadata: Option, } struct LargeCharacterSetInfo { @@ -97,16 +86,9 @@ struct LargeCharacterSetInfo { is_used: bool, } -struct Metadata { - major_version: u8, - minor_version: u8, - patch_version: u8, -} - impl Generator { fn generate(mut self) -> String { self.init(); - self.add_header(); self.add_includes(); self.add_pragmas(); self.add_stats(); @@ -126,10 +108,9 @@ impl Generator { } self.add_non_terminal_alias_map(); - self.add_primary_state_id_list(); - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS && !self.supertype_map.is_empty() { - self.add_supertype_map(); + if self.abi_version >= ABI_VERSION_WITH_PRIMARY_STATES { + self.add_primary_state_id_list(); } let buffer_offset_before_lex_functions = self.buffer.len(); @@ -138,7 +119,7 @@ impl Generator { swap(&mut main_lex_table, &mut self.main_lex_table); self.add_lex_function("ts_lex", main_lex_table); - if self.syntax_grammar.word_token.is_some() { + if self.keyword_capture_token.is_some() { let mut keyword_lex_table = LexTable::default(); swap(&mut keyword_lex_table, &mut self.keyword_lex_table); self.add_lex_function("ts_lex_keywords", keyword_lex_table); @@ -154,13 +135,7 @@ impl Generator { } self.buffer.push_str(&lex_functions); - self.add_lex_modes(); - - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS && self.reserved_word_sets.len() > 1 - { - self.add_reserved_word_sets(); - } - + self.add_lex_modes_list(); self.add_parse_table(); if !self.syntax_grammar.external_tokens.is_empty() { @@ -241,24 +216,33 @@ impl Generator { for alias in &production_info.alias_sequence { // Generate a mapping from aliases to C identifiers. if let Some(alias) = &alias { - // Some aliases match an existing symbol in the grammar. - let alias_id = - if let Some(existing_symbol) = self.symbols_for_alias(alias).first() { - self.symbol_ids[&self.symbol_map[existing_symbol]].clone() - } - // Other aliases don't match any existing symbol, and need their own - // identifiers. - else { - if let Err(i) = self.unique_aliases.binary_search(alias) { - self.unique_aliases.insert(i, alias.clone()); - } + let existing_symbol = self.parse_table.symbols.iter().copied().find(|symbol| { + self.default_aliases.get(symbol).map_or_else( + || { + let (name, kind) = self.metadata_for_symbol(*symbol); + name == alias.value && kind == alias.kind() + }, + |default_alias| default_alias == alias, + ) + }); - if alias.is_named { - format!("alias_sym_{}", self.sanitize_identifier(&alias.value)) - } else { - format!("anon_alias_sym_{}", self.sanitize_identifier(&alias.value)) - } - }; + // Some aliases match an existing symbol in the grammar. + let alias_id = if let Some(existing_symbol) = existing_symbol { + self.symbol_ids[&self.symbol_map[&existing_symbol]].clone() + } + // Other aliases don't match any existing symbol, and need their own + // identifiers. + else { + if let Err(i) = self.unique_aliases.binary_search(alias) { + self.unique_aliases.insert(i, alias.clone()); + } + + if alias.is_named { + format!("alias_sym_{}", self.sanitize_identifier(&alias.value)) + } else { + format!("anon_alias_sym_{}", self.sanitize_identifier(&alias.value)) + } + }; self.alias_ids.entry(alias.clone()).or_insert(alias_id); } @@ -282,34 +266,6 @@ impl Generator { }); } - // Assign an id to each unique reserved word set - self.reserved_word_sets.push(TokenSet::new()); - for state in &self.parse_table.states { - let id = if let Some(ix) = self - .reserved_word_sets - .iter() - .position(|set| *set == state.reserved_words) - { - ix - } else { - self.reserved_word_sets.push(state.reserved_words.clone()); - self.reserved_word_sets.len() - 1 - }; - self.reserved_word_set_ids_by_parse_state.push(id); - } - - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS { - for (supertype, subtypes) in &self.supertype_symbol_map { - if let Some(supertype) = self.symbol_ids.get(supertype) { - self.supertype_map - .entry(supertype.clone()) - .or_insert_with(|| subtypes.clone()); - } - } - - self.supertype_symbol_map.clear(); - } - // Determine which states should use the "small state" representation, and which should // use the normal array representation. let threshold = cmp::min(SMALL_STATE_THRESHOLD, self.parse_table.symbols.len() / 2); @@ -324,11 +280,6 @@ impl Generator { .count(); } - fn add_header(&mut self) { - add_line!(self, "/* Automatically @generated by tree-sitter */",); - add_line!(self, ""); - } - fn add_includes(&mut self) { add_line!(self, "#include \"tree_sitter/parser.h\""); add_line!(self, ""); @@ -390,7 +341,7 @@ impl Generator { self.parse_table.symbols.len() ); add_line!(self, "#define ALIAS_COUNT {}", self.unique_aliases.len()); - add_line!(self, "#define TOKEN_COUNT {token_count}"); + add_line!(self, "#define TOKEN_COUNT {}", token_count); add_line!( self, "#define EXTERNAL_TOKEN_COUNT {}", @@ -402,22 +353,11 @@ impl Generator { "#define MAX_ALIAS_SEQUENCE_LENGTH {}", self.parse_table.max_aliased_production_length ); - add_line!( - self, - "#define MAX_RESERVED_WORD_SET_SIZE {}", - self.reserved_word_sets - .iter() - .map(TokenSet::len) - .max() - .unwrap() - ); - add_line!( self, "#define PRODUCTION_ID_COUNT {}", self.parse_table.production_infos.len() ); - add_line!(self, "#define SUPERTYPE_COUNT {}", self.supertype_map.len()); add_line!(self, ""); } @@ -679,32 +619,31 @@ impl Generator { &mut next_flat_field_map_index, ); - let mut field_map_ids = Vec::with_capacity(self.parse_table.production_infos.len()); + let mut field_map_ids = Vec::new(); for production_info in &self.parse_table.production_infos { if production_info.field_map.is_empty() { field_map_ids.push((0, 0)); } else { - let mut flat_field_map = Vec::with_capacity(production_info.field_map.len()); + let mut flat_field_map = Vec::new(); for (field_name, locations) in &production_info.field_map { for location in locations { flat_field_map.push((field_name.clone(), *location)); } } - let field_map_len = flat_field_map.len(); field_map_ids.push(( self.get_field_map_id( - flat_field_map, + flat_field_map.clone(), &mut flat_field_maps, &mut next_flat_field_map_index, ), - field_map_len, + flat_field_map.len(), )); } } add_line!( self, - "static const TSMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = {{", + "static const TSFieldMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = {{", ); indent!(self); for (production_id, (row_id, length)) in field_map_ids.into_iter().enumerate() { @@ -743,83 +682,6 @@ impl Generator { add_line!(self, ""); } - fn add_supertype_map(&mut self) { - add_line!( - self, - "static const TSSymbol ts_supertype_symbols[SUPERTYPE_COUNT] = {{" - ); - indent!(self); - for supertype in self.supertype_map.keys() { - add_line!(self, "{supertype},"); - } - dedent!(self); - add_line!(self, "}};\n"); - - add_line!( - self, - "static const TSMapSlice ts_supertype_map_slices[] = {{", - ); - indent!(self); - let mut row_id = 0; - let mut supertype_ids = vec![0]; - let mut supertype_string_map = BTreeMap::new(); - for (supertype, subtypes) in &self.supertype_map { - supertype_string_map.insert( - supertype, - subtypes - .iter() - .flat_map(|s| match s { - ChildType::Normal(symbol) => vec![self.symbol_ids.get(symbol).cloned()], - ChildType::Aliased(alias) => { - self.alias_ids.get(alias).cloned().map_or_else( - || { - self.symbols_for_alias(alias) - .into_iter() - .map(|s| self.symbol_ids.get(&s).cloned()) - .collect() - }, - |a| vec![Some(a)], - ) - } - }) - .flatten() - .collect::>(), - ); - } - for (supertype, subtypes) in &supertype_string_map { - let length = subtypes.len(); - add_line!( - self, - "[{supertype}] = {{.index = {row_id}, .length = {length}}},", - ); - row_id += length; - supertype_ids.push(row_id); - } - dedent!(self); - add_line!(self, "}};"); - add_line!(self, ""); - - add_line!( - self, - "static const TSSymbol ts_supertype_map_entries[] = {{", - ); - indent!(self); - for (i, (_, subtypes)) in supertype_string_map.iter().enumerate() { - let row_index = supertype_ids[i]; - add_line!(self, "[{row_index}] ="); - indent!(self); - for subtype in subtypes { - add_whitespace!(self); - add!(self, "{subtype},\n"); - } - dedent!(self); - } - - dedent!(self); - add_line!(self, "}};"); - add_line!(self, ""); - } - fn add_lex_function(&mut self, name: &str, lex_table: LexTable) { add_line!( self, @@ -877,7 +739,7 @@ impl Generator { && chars.ranges().all(|r| { let start = *r.start() as u32; let end = *r.end() as u32; - end <= start + 1 && u16::try_from(end).is_ok() + end <= start + 1 && end <= u16::MAX as u32 }) { leading_simple_transition_count += 1; @@ -965,7 +827,10 @@ impl Generator { large_char_set_ix = Some(char_set_ix); } - let line_break = format!("\n{}", " ".repeat(self.indent_level + 2)); + let mut line_break = "\n".to_string(); + for _ in 0..self.indent_level + 2 { + line_break.push_str(" "); + } let has_positive_condition = large_char_set_ix.is_some() || !asserted_chars.is_empty(); let has_negative_condition = !negated_chars.is_empty(); @@ -992,7 +857,7 @@ impl Generator { add!( self, "set_contains({}, {}, lookahead)", - char_set_info.constant_name, + &char_set_info.constant_name, large_set.range_count(), ); if check_eof { @@ -1057,6 +922,7 @@ impl Generator { } self.add_character(end); add!(self, ")"); + continue; } else if end == start { add!(self, "lookahead == "); self.add_character(start); @@ -1107,7 +973,7 @@ impl Generator { add_line!( self, - "static const TSCharacterRange {}[] = {{", + "static TSCharacterRange {}[] = {{", info.constant_name ); @@ -1142,66 +1008,25 @@ impl Generator { } } - fn add_lex_modes(&mut self) { + fn add_lex_modes_list(&mut self) { add_line!( self, - "static const {} ts_lex_modes[STATE_COUNT] = {{", - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS { - "TSLexerMode" - } else { - "TSLexMode" - } + "static const TSLexMode ts_lex_modes[STATE_COUNT] = {{" ); indent!(self); for (i, state) in self.parse_table.states.iter().enumerate() { - add_whitespace!(self); - add!(self, "[{i}] = {{"); if state.is_end_of_non_terminal_extra() { - add!(self, "(TSStateId)(-1),"); + add_line!(self, "[{i}] = {{(TSStateId)(-1)}},"); + } else if state.external_lex_state_id > 0 { + add_line!( + self, + "[{i}] = {{.lex_state = {}, .external_lex_state = {}}},", + state.lex_state_id, + state.external_lex_state_id + ); } else { - add!(self, ".lex_state = {}", state.lex_state_id); - - if state.external_lex_state_id > 0 { - add!( - self, - ", .external_lex_state = {}", - state.external_lex_state_id - ); - } - - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS { - let reserved_word_set_id = self.reserved_word_set_ids_by_parse_state[i]; - if reserved_word_set_id != 0 { - add!(self, ", .reserved_word_set_id = {reserved_word_set_id}"); - } - } + add_line!(self, "[{i}] = {{.lex_state = {}}},", state.lex_state_id); } - - add!(self, "}},\n"); - } - dedent!(self); - add_line!(self, "}};"); - add_line!(self, ""); - } - - fn add_reserved_word_sets(&mut self) { - add_line!( - self, - "static const TSSymbol ts_reserved_words[{}][MAX_RESERVED_WORD_SET_SIZE] = {{", - self.reserved_word_sets.len(), - ); - indent!(self); - for (id, set) in self.reserved_word_sets.iter().enumerate() { - if id == 0 { - continue; - } - add_line!(self, "[{id}] = {{"); - indent!(self); - for token in set.iter() { - add_line!(self, "{},", self.symbol_ids[&token]); - } - dedent!(self); - add_line!(self, "}},"); } dedent!(self); add_line!(self, "}};"); @@ -1255,7 +1080,7 @@ impl Generator { indent!(self); for i in 0..self.parse_table.external_lex_states.len() { if !self.parse_table.external_lex_states[i].is_empty() { - add_line!(self, "[{i}] = {{"); + add_line!(self, "[{}] = {{", i); indent!(self); for token in self.parse_table.external_lex_states[i].iter() { add_line!( @@ -1277,7 +1102,6 @@ impl Generator { let mut parse_table_entries = HashMap::new(); let mut next_parse_action_list_index = 0; - // Parse action lists zero is for the default value, when a symbol is not valid. self.get_parse_action_list_id( &ParseTableEntry { actions: Vec::new(), @@ -1303,7 +1127,7 @@ impl Generator { .enumerate() .take(self.large_state_count) { - add_line!(self, "[STATE({i})] = {{"); + add_line!(self, "[{i}] = {{"); indent!(self); // Ensure the entries are in a deterministic order, since they are @@ -1335,11 +1159,9 @@ impl Generator { ); add_line!(self, "[{}] = ACTIONS({entry_id}),", self.symbol_ids[symbol]); } - dedent!(self); add_line!(self, "}},"); } - dedent!(self); add_line!(self, "}};"); add_line!(self, ""); @@ -1348,16 +1170,11 @@ impl Generator { add_line!(self, "static const uint16_t ts_small_parse_table[] = {{"); indent!(self); - let mut next_table_index = 0; - let mut small_state_indices = Vec::with_capacity( - self.parse_table - .states - .len() - .saturating_sub(self.large_state_count), - ); + let mut index = 0; + let mut small_state_indices = Vec::new(); let mut symbols_by_value = HashMap::<(usize, SymbolType), Vec>::new(); for state in self.parse_table.states.iter().skip(self.large_state_count) { - small_state_indices.push(next_table_index); + small_state_indices.push(index); symbols_by_value.clear(); terminal_entries.clear(); @@ -1396,16 +1213,10 @@ impl Generator { (symbols.len(), *kind, *value, symbols[0]) }); - add_line!( - self, - "[{next_table_index}] = {},", - values_with_symbols.len() - ); + add_line!(self, "[{index}] = {},", values_with_symbols.len()); indent!(self); - next_table_index += 1; for ((value, kind), symbols) in &mut values_with_symbols { - next_table_index += 2 + symbols.len(); if *kind == SymbolType::NonTerminal { add_line!(self, "STATE({value}), {},", symbols.len()); } else { @@ -1421,6 +1232,11 @@ impl Generator { } dedent!(self); + + index += 1 + values_with_symbols + .iter() + .map(|(_, symbols)| 2 + symbols.len()) + .sum::(); } dedent!(self); @@ -1549,7 +1365,7 @@ impl Generator { indent!(self); add_line!(self, "static const TSLanguage language = {{"); indent!(self); - add_line!(self, ".abi_version = LANGUAGE_VERSION,"); + add_line!(self, ".version = LANGUAGE_VERSION,"); // Quantities add_line!(self, ".symbol_count = SYMBOL_COUNT,"); @@ -1559,9 +1375,6 @@ impl Generator { add_line!(self, ".state_count = STATE_COUNT,"); add_line!(self, ".large_state_count = LARGE_STATE_COUNT,"); add_line!(self, ".production_id_count = PRODUCTION_ID_COUNT,"); - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS { - add_line!(self, ".supertype_count = SUPERTYPE_COUNT,"); - } add_line!(self, ".field_count = FIELD_COUNT,"); add_line!( self, @@ -1583,11 +1396,6 @@ impl Generator { add_line!(self, ".field_map_slices = ts_field_map_slices,"); add_line!(self, ".field_map_entries = ts_field_map_entries,"); } - if !self.supertype_map.is_empty() && self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS { - add_line!(self, ".supertype_map_slices = ts_supertype_map_slices,"); - add_line!(self, ".supertype_map_entries = ts_supertype_map_entries,"); - add_line!(self, ".supertype_symbols = ts_supertype_symbols,"); - } add_line!(self, ".symbol_metadata = ts_symbol_metadata,"); add_line!(self, ".public_symbol_map = ts_symbol_map,"); add_line!(self, ".alias_map = ts_non_terminal_alias_map,"); @@ -1596,9 +1404,9 @@ impl Generator { } // Lexing - add_line!(self, ".lex_modes = (const void*)ts_lex_modes,"); + add_line!(self, ".lex_modes = ts_lex_modes,"); add_line!(self, ".lex_fn = ts_lex,"); - if let Some(keyword_capture_token) = self.syntax_grammar.word_token { + if let Some(keyword_capture_token) = self.keyword_capture_token { add_line!(self, ".keyword_lex_fn = ts_lex_keywords,"); add_line!( self, @@ -1621,42 +1429,8 @@ impl Generator { add_line!(self, "}},"); } - add_line!(self, ".primary_state_ids = ts_primary_state_ids,"); - - if self.abi_version >= ABI_VERSION_WITH_RESERVED_WORDS { - add_line!(self, ".name = \"{}\",", self.language_name); - - if self.reserved_word_sets.len() > 1 { - add_line!(self, ".reserved_words = &ts_reserved_words[0][0],"); - } - - add_line!( - self, - ".max_reserved_word_set_size = {},", - self.reserved_word_sets - .iter() - .map(TokenSet::len) - .max() - .unwrap() - ); - - let Some(metadata) = &self.metadata else { - panic!( - indoc! {" - Metadata is required to generate ABI version {}. - This means that your grammar doesn't have a tree-sitter.json config file with an appropriate version field in the metadata table. - "}, - self.abi_version - ); - }; - - add_line!(self, ".metadata = {{"); - indent!(self); - add_line!(self, ".major_version = {},", metadata.major_version); - add_line!(self, ".minor_version = {},", metadata.minor_version); - add_line!(self, ".patch_version = {},", metadata.patch_version); - dedent!(self); - add_line!(self, "}},"); + if self.abi_version >= ABI_VERSION_WITH_PRIMARY_STATES { + add_line!(self, ".primary_state_ids = ts_primary_state_ids,"); } dedent!(self); @@ -1758,23 +1532,6 @@ impl Generator { } } - fn symbols_for_alias(&self, alias: &Alias) -> Vec { - self.parse_table - .symbols - .iter() - .copied() - .filter(move |symbol| { - self.default_aliases.get(symbol).map_or_else( - || { - let (name, kind) = self.metadata_for_symbol(*symbol); - name == alias.value && kind == alias.kind() - }, - |default_alias| default_alias == alias, - ) - }) - .collect() - } - fn sanitize_identifier(&self, name: &str) -> String { let mut result = String::with_capacity(name.len()); for c in name.chars() { @@ -1850,11 +1607,11 @@ impl Generator { '\u{007F}' => "DEL", '\u{FEFF}' => "BOM", '\u{0080}'..='\u{FFFF}' => { - write!(result, "u{:04x}", c as u32).unwrap(); + result.push_str(&format!("u{:04x}", c as u32)); break 'special_chars; } '\u{10000}'..='\u{10FFFF}' => { - write!(result, "U{:08x}", c as u32).unwrap(); + result.push_str(&format!("U{:08x}", c as u32)); break 'special_chars; } '0'..='9' | 'a'..='z' | 'A'..='Z' | '_' => unreachable!(), @@ -1885,9 +1642,11 @@ impl Generator { '\r' => result += "\\r", '\t' => result += "\\t", '\0' => result += "\\0", - '\u{0001}'..='\u{001f}' => write!(result, "\\x{:02x}", c as u32).unwrap(), - '\u{007F}'..='\u{FFFF}' => write!(result, "\\u{:04x}", c as u32).unwrap(), - '\u{10000}'..='\u{10FFFF}' => write!(result, "\\U{:08x}", c as u32).unwrap(), + '\u{0001}'..='\u{001f}' => result += &format!("\\x{:02x}", c as u32), + '\u{007F}'..='\u{FFFF}' => result += &format!("\\u{:04x}", c as u32), + '\u{10000}'..='\u{10FFFF}' => { + result.push_str(&format!("\\U{:08x}", c as u32)); + } _ => result.push(c), } } @@ -1940,8 +1699,6 @@ pub fn render_c_code( lexical_grammar: LexicalGrammar, default_aliases: AliasMap, abi_version: usize, - semantic_version: Option<(u8, u8, u8)>, - supertype_symbol_map: BTreeMap>, ) -> String { assert!( (ABI_VERSION_MIN..=ABI_VERSION_MAX).contains(&abi_version), @@ -1949,23 +1706,26 @@ pub fn render_c_code( ); Generator { + buffer: String::new(), + indent_level: 0, language_name: name.to_string(), + large_state_count: 0, parse_table: tables.parse_table, main_lex_table: tables.main_lex_table, keyword_lex_table: tables.keyword_lex_table, + keyword_capture_token: tables.word_token, large_character_sets: tables.large_character_sets, large_character_set_info: Vec::new(), syntax_grammar, lexical_grammar, default_aliases, + symbol_ids: HashMap::new(), + symbol_order: HashMap::new(), + alias_ids: HashMap::new(), + symbol_map: HashMap::new(), + unique_aliases: Vec::new(), + field_names: Vec::new(), abi_version, - metadata: semantic_version.map(|(major_version, minor_version, patch_version)| Metadata { - major_version, - minor_version, - patch_version, - }), - supertype_symbol_map, - ..Default::default() } .generate() } diff --git a/crates/generate/src/rules.rs b/cli/src/generate/rules.rs similarity index 85% rename from crates/generate/src/rules.rs rename to cli/src/generate/rules.rs index 05a0c426..d8124ef4 100644 --- a/crates/generate/src/rules.rs +++ b/cli/src/generate/rules.rs @@ -1,11 +1,10 @@ -use std::{collections::BTreeMap, fmt}; +use std::{collections::HashMap, fmt}; -use serde::Serialize; use smallbitvec::SmallBitVec; use super::grammars::VariableType; -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum SymbolType { External, End, @@ -14,19 +13,19 @@ pub enum SymbolType { NonTerminal, } -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub enum Associativity { Left, Right, } -#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct Alias { pub value: String, pub is_named: bool, } -#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Default)] pub enum Precedence { #[default] None, @@ -34,50 +33,48 @@ pub enum Precedence { Name(String), } -pub type AliasMap = BTreeMap; +pub type AliasMap = HashMap; -#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, Serialize)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] pub struct MetadataParams { pub precedence: Precedence, pub dynamic_precedence: i32, pub associativity: Option, pub is_token: bool, + pub is_string: bool, + pub is_active: bool, pub is_main_token: bool, pub alias: Option, pub field_name: Option, } -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct Symbol { pub kind: SymbolType, pub index: usize, } -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub enum Rule { Blank, String(String), Pattern(String, String), NamedSymbol(String), Symbol(Symbol), - Choice(Vec), + Choice(Vec), Metadata { params: MetadataParams, - rule: Box, - }, - Repeat(Box), - Seq(Vec), - Reserved { - rule: Box, - context_name: String, + rule: Box, }, + Repeat(Box), + Seq(Vec), } // Because tokens are represented as small (~400 max) unsigned integers, // sets of tokens can be efficiently represented as bit vectors with each // index corresponding to a token, and each value representing whether or not // the token is present in the set. -#[derive(Default, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct TokenSet { terminal_bits: SmallBitVec, external_bits: SmallBitVec, @@ -85,32 +82,6 @@ pub struct TokenSet { end_of_nonterminal_extra: bool, } -impl fmt::Debug for TokenSet { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.iter()).finish() - } -} - -impl PartialOrd for TokenSet { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for TokenSet { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.terminal_bits - .iter() - .cmp(other.terminal_bits.iter()) - .then_with(|| self.external_bits.iter().cmp(other.external_bits.iter())) - .then_with(|| self.eof.cmp(&other.eof)) - .then_with(|| { - self.end_of_nonterminal_extra - .cmp(&other.end_of_nonterminal_extra) - }) - } -} - impl Rule { pub fn field(name: String, content: Self) -> Self { add_metadata(content, move |params| { @@ -178,18 +149,6 @@ impl Rule { pub const fn seq(rules: Vec) -> Self { Self::Seq(rules) } - - pub fn is_empty(&self) -> bool { - match self { - Self::Blank | Self::Pattern(..) | Self::NamedSymbol(_) | Self::Symbol(_) => false, - Self::String(string) => string.is_empty(), - Self::Metadata { rule, .. } | Self::Repeat(rule) | Self::Reserved { rule, .. } => { - rule.is_empty() - } - Self::Choice(rules) => rules.iter().any(Self::is_empty), - Self::Seq(rules) => rules.iter().all(Self::is_empty), - } - } } impl Alias { @@ -306,13 +265,13 @@ impl Symbol { } impl From for Rule { + #[must_use] fn from(symbol: Symbol) -> Self { Self::Symbol(symbol) } } impl TokenSet { - #[must_use] pub const fn new() -> Self { Self { terminal_bits: SmallBitVec::new(), @@ -424,9 +383,6 @@ impl TokenSet { }; if other.index < vec.len() && vec[other.index] { vec.set(other.index, false); - while vec.last() == Some(false) { - vec.pop(); - } return true; } false @@ -439,13 +395,6 @@ impl TokenSet { && !self.external_bits.iter().any(|a| a) } - pub fn len(&self) -> usize { - self.eof as usize - + self.end_of_nonterminal_extra as usize - + self.terminal_bits.iter().filter(|b| *b).count() - + self.external_bits.iter().filter(|b| *b).count() - } - pub fn insert_all_terminals(&mut self, other: &Self) -> bool { let mut result = false; if other.terminal_bits.len() > self.terminal_bits.len() { diff --git a/crates/generate/src/tables.rs b/cli/src/generate/tables.rs similarity index 98% rename from crates/generate/src/tables.rs rename to cli/src/generate/tables.rs index ef403dc0..541a301c 100644 --- a/crates/generate/src/tables.rs +++ b/cli/src/generate/tables.rs @@ -47,7 +47,6 @@ pub struct ParseState { pub id: ParseStateId, pub terminal_entries: IndexMap>, pub nonterminal_entries: IndexMap>, - pub reserved_words: TokenSet, pub lex_state_id: usize, pub external_lex_state_id: usize, pub core_id: usize, @@ -65,7 +64,7 @@ pub struct ProductionInfo { pub field_map: BTreeMap>, } -#[derive(Debug, Default, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq)] pub struct ParseTable { pub states: Vec, pub symbols: Vec, @@ -93,7 +92,6 @@ pub struct LexTable { } impl ParseTableEntry { - #[must_use] pub const fn new() -> Self { Self { reusable: true, diff --git a/crates/cli/src/templates/.editorconfig b/cli/src/generate/templates/.editorconfig similarity index 70% rename from crates/cli/src/templates/.editorconfig rename to cli/src/generate/templates/.editorconfig index ff17b12f..f363cc55 100644 --- a/crates/cli/src/templates/.editorconfig +++ b/cli/src/generate/templates/.editorconfig @@ -3,15 +3,11 @@ root = true [*] charset = utf-8 -[*.{json,toml,yml,gyp,xml}] +[*.{json,toml,yml,gyp}] indent_style = space indent_size = 2 -[*.{js,ts}] -indent_style = space -indent_size = 2 - -[*.scm] +[*.js] indent_style = space indent_size = 2 @@ -31,10 +27,6 @@ indent_size = 4 indent_style = space indent_size = 4 -[*.java] -indent_style = space -indent_size = 4 - [*.go] indent_style = tab indent_size = 8 @@ -45,6 +37,3 @@ indent_size = 8 [parser.c] indent_size = 2 - -[{alloc,array,parser}.h] -indent_size = 2 diff --git a/crates/cli/src/templates/PARSER_NAME.h b/cli/src/generate/templates/PARSER_NAME.h similarity index 100% rename from crates/cli/src/templates/PARSER_NAME.h rename to cli/src/generate/templates/PARSER_NAME.h diff --git a/cli/src/generate/templates/PARSER_NAME.pc.in b/cli/src/generate/templates/PARSER_NAME.pc.in new file mode 100644 index 00000000..deed9fa4 --- /dev/null +++ b/cli/src/generate/templates/PARSER_NAME.pc.in @@ -0,0 +1,11 @@ +prefix=@PREFIX@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: tree-sitter-PARSER_NAME +Description: CAMEL_PARSER_NAME grammar for tree-sitter +URL: @URL@ +Version: @VERSION@ +Requires: @REQUIRES@ +Libs: -L${libdir} @ADDITIONAL_LIBS@ -ltree-sitter-PARSER_NAME +Cflags: -I${includedir} diff --git a/cli/src/generate/templates/__init__.py b/cli/src/generate/templates/__init__.py new file mode 100644 index 00000000..738534a7 --- /dev/null +++ b/cli/src/generate/templates/__init__.py @@ -0,0 +1,42 @@ +"""CAMEL_PARSER_NAME grammar for tree-sitter""" + +from importlib.resources import files as _files + +from ._binding import language + + +def _get_query(name, file): + query = _files(f"{__package__}.queries") / file + globals()[name] = query.read_text() + return globals()[name] + + +def __getattr__(name): + # NOTE: uncomment these to include any queries that this grammar contains: + + # if name == "HIGHLIGHTS_QUERY": + # return _get_query("HIGHLIGHTS_QUERY", "highlights.scm") + # if name == "INJECTIONS_QUERY": + # return _get_query("INJECTIONS_QUERY", "injections.scm") + # if name == "LOCALS_QUERY": + # return _get_query("LOCALS_QUERY", "locals.scm") + # if name == "TAGS_QUERY": + # return _get_query("TAGS_QUERY", "tags.scm") + + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +__all__ = [ + "language", + # "HIGHLIGHTS_QUERY", + # "INJECTIONS_QUERY", + # "LOCALS_QUERY", + # "TAGS_QUERY", +] + + +def __dir__(): + return sorted(__all__ + [ + "__all__", "__builtins__", "__cached__", "__doc__", "__file__", + "__loader__", "__name__", "__package__", "__path__", "__spec__", + ]) diff --git a/cli/src/generate/templates/__init__.pyi b/cli/src/generate/templates/__init__.pyi new file mode 100644 index 00000000..abf6633f --- /dev/null +++ b/cli/src/generate/templates/__init__.pyi @@ -0,0 +1,10 @@ +from typing import Final + +# NOTE: uncomment these to include any queries that this grammar contains: + +# HIGHLIGHTS_QUERY: Final[str] +# INJECTIONS_QUERY: Final[str] +# LOCALS_QUERY: Final[str] +# TAGS_QUERY: Final[str] + +def language() -> object: ... diff --git a/cli/src/generate/templates/_cargo.toml b/cli/src/generate/templates/_cargo.toml new file mode 100644 index 00000000..eea4eb4f --- /dev/null +++ b/cli/src/generate/templates/_cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "tree-sitter-PARSER_NAME" +description = "CAMEL_PARSER_NAME grammar for tree-sitter" +version = "0.0.1" +license = "MIT" +readme = "README.md" +keywords = ["incremental", "parsing", "tree-sitter", "PARSER_NAME"] +categories = ["parsing", "text-editors"] +repository = "https://github.com/tree-sitter/tree-sitter-PARSER_NAME" +edition = "2021" +autoexamples = false + +build = "bindings/rust/build.rs" +include = ["bindings/rust/*", "grammar.js", "queries/*", "src/*"] + +[lib] +path = "bindings/rust/lib.rs" + +[dependencies] +tree-sitter-language = "0.1" + +[build-dependencies] +cc = "1.0.87" + +[dev-dependencies] +tree-sitter = "0.23" diff --git a/crates/generate/src/templates/alloc.h b/cli/src/generate/templates/alloc.h similarity index 78% rename from crates/generate/src/templates/alloc.h rename to cli/src/generate/templates/alloc.h index 1abdd120..1f4466d7 100644 --- a/crates/generate/src/templates/alloc.h +++ b/cli/src/generate/templates/alloc.h @@ -12,10 +12,10 @@ extern "C" { // Allow clients to override allocation functions #ifdef TREE_SITTER_REUSE_ALLOCATOR -extern void *(*ts_current_malloc)(size_t size); -extern void *(*ts_current_calloc)(size_t count, size_t size); -extern void *(*ts_current_realloc)(void *ptr, size_t size); -extern void (*ts_current_free)(void *ptr); +extern void *(*ts_current_malloc)(size_t); +extern void *(*ts_current_calloc)(size_t, size_t); +extern void *(*ts_current_realloc)(void *, size_t); +extern void (*ts_current_free)(void *); #ifndef ts_malloc #define ts_malloc ts_current_malloc diff --git a/crates/cli/src/templates/binding.go b/cli/src/generate/templates/binding.go similarity index 75% rename from crates/cli/src/templates/binding.go rename to cli/src/generate/templates/binding.go index 9351f480..243a1160 100644 --- a/crates/cli/src/templates/binding.go +++ b/cli/src/generate/templates/binding.go @@ -2,9 +2,7 @@ package tree_sitter_LOWER_PARSER_NAME // #cgo CFLAGS: -std=c11 -fPIC // #include "../../src/parser.c" -// #if __has_include("../../src/scanner.c") -// #include "../../src/scanner.c" -// #endif +// // NOTE: if your language has an external scanner, add it here. import "C" import "unsafe" diff --git a/crates/cli/src/templates/binding.gyp b/cli/src/generate/templates/binding.gyp similarity index 75% rename from crates/cli/src/templates/binding.gyp rename to cli/src/generate/templates/binding.gyp index fb0cdc88..9b7feebb 100644 --- a/crates/cli/src/templates/binding.gyp +++ b/cli/src/generate/templates/binding.gyp @@ -11,14 +11,9 @@ "sources": [ "bindings/node/binding.cc", "src/parser.c", + # NOTE: if your language has an external scanner, add it here. ], - "variables": { - "has_scanner": " + +const assert = require("node:assert"); +const { test } = require("node:test"); + +test("can load grammar", () => { + const parser = new (require("tree-sitter"))(); + assert.doesNotThrow(() => parser.setLanguage(require("."))); +}); diff --git a/cli/src/generate/templates/build.rs b/cli/src/generate/templates/build.rs new file mode 100644 index 00000000..99985b40 --- /dev/null +++ b/cli/src/generate/templates/build.rs @@ -0,0 +1,22 @@ +fn main() { + let src_dir = std::path::Path::new("src"); + + let mut c_config = cc::Build::new(); + c_config.std("c11").include(src_dir); + + #[cfg(target_env = "msvc")] + c_config.flag("-utf-8"); + + let parser_path = src_dir.join("parser.c"); + c_config.file(&parser_path); + println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); + + // NOTE: if your language uses an external scanner, uncomment this block: + /* + let scanner_path = src_dir.join("scanner.c"); + c_config.file(&scanner_path); + println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); + */ + + c_config.compile("tree-sitter-PARSER_NAME"); +} diff --git a/cli/src/generate/templates/gitattributes b/cli/src/generate/templates/gitattributes new file mode 100644 index 00000000..4cb10583 --- /dev/null +++ b/cli/src/generate/templates/gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +src/*.json linguist-generated +src/parser.c linguist-generated +src/tree_sitter/* linguist-generated + +bindings/** linguist-generated +binding.gyp linguist-generated +setup.py linguist-generated +Makefile linguist-generated +Package.swift linguist-generated diff --git a/crates/cli/src/templates/gitignore b/cli/src/generate/templates/gitignore similarity index 75% rename from crates/cli/src/templates/gitignore rename to cli/src/generate/templates/gitignore index 7c0cb7f5..2fd9daca 100644 --- a/crates/cli/src/templates/gitignore +++ b/cli/src/generate/templates/gitignore @@ -5,9 +5,11 @@ target/ build/ prebuilds/ node_modules/ +*.tgz # Swift artifacts .build/ +Package.resolved # Go artifacts _obj/ @@ -25,13 +27,6 @@ dist/ *.dylib *.dll *.pc -*.exp -*.lib - -# Zig artifacts -.zig-cache/ -zig-cache/ -zig-out/ # Example dirs /examples/*/ @@ -40,9 +35,3 @@ zig-out/ *.wasm *.obj *.o - -# Archives -*.tar.gz -*.tgz -*.zip -*.jar diff --git a/cli/src/generate/templates/go.mod b/cli/src/generate/templates/go.mod new file mode 100644 index 00000000..26d2dbf1 --- /dev/null +++ b/cli/src/generate/templates/go.mod @@ -0,0 +1,5 @@ +module github.com/tree-sitter/tree-sitter-LOWER_PARSER_NAME + +go 1.23 + +require github.com/tree-sitter/go-tree-sitter v0.23.1 diff --git a/crates/cli/src/templates/grammar.js b/cli/src/generate/templates/grammar.js similarity index 56% rename from crates/cli/src/templates/grammar.js rename to cli/src/generate/templates/grammar.js index edee3cbc..62b7cf3b 100644 --- a/crates/cli/src/templates/grammar.js +++ b/cli/src/generate/templates/grammar.js @@ -1,13 +1,7 @@ -/** - * @file PARSER_DESCRIPTION - * @author PARSER_AUTHOR_NAME PARSER_AUTHOR_EMAIL - * @license PARSER_LICENSE - */ - /// // @ts-check -export default grammar({ +module.exports = grammar({ name: "LOWER_PARSER_NAME", rules: { diff --git a/cli/src/generate/templates/index.d.ts b/cli/src/generate/templates/index.d.ts new file mode 100644 index 00000000..efe259ee --- /dev/null +++ b/cli/src/generate/templates/index.d.ts @@ -0,0 +1,28 @@ +type BaseNode = { + type: string; + named: boolean; +}; + +type ChildNode = { + multiple: boolean; + required: boolean; + types: BaseNode[]; +}; + +type NodeInfo = + | (BaseNode & { + subtypes: BaseNode[]; + }) + | (BaseNode & { + fields: { [name: string]: ChildNode }; + children: ChildNode[]; + }); + +type Language = { + name: string; + language: unknown; + nodeTypeInfo: NodeInfo[]; +}; + +declare const language: Language; +export = language; diff --git a/cli/src/generate/templates/index.js b/cli/src/generate/templates/index.js new file mode 100644 index 00000000..6657bcf4 --- /dev/null +++ b/cli/src/generate/templates/index.js @@ -0,0 +1,7 @@ +const root = require("path").join(__dirname, "..", ".."); + +module.exports = require("node-gyp-build")(root); + +try { + module.exports.nodeTypeInfo = require("../../src/node-types.json"); +} catch (_) {} diff --git a/crates/cli/src/templates/js-binding.cc b/cli/src/generate/templates/js-binding.cc similarity index 89% rename from crates/cli/src/templates/js-binding.cc rename to cli/src/generate/templates/js-binding.cc index 26e78043..3d44d690 100644 --- a/crates/cli/src/templates/js-binding.cc +++ b/cli/src/generate/templates/js-binding.cc @@ -10,6 +10,7 @@ const napi_type_tag LANGUAGE_TYPE_TAG = { }; Napi::Object Init(Napi::Env env, Napi::Object exports) { + exports["name"] = Napi::String::New(env, "PARSER_NAME"); auto language = Napi::External::New(env, tree_sitter_PARSER_NAME()); language.TypeTag(&LANGUAGE_TYPE_TAG); exports["language"] = language; diff --git a/cli/src/generate/templates/lib.rs b/cli/src/generate/templates/lib.rs new file mode 100644 index 00000000..4e3522ae --- /dev/null +++ b/cli/src/generate/templates/lib.rs @@ -0,0 +1,53 @@ +//! This crate provides CAMEL_PARSER_NAME language support for the [tree-sitter][] parsing library. +//! +//! Typically, you will use the [LANGUAGE][] constant to add this language to a +//! tree-sitter [Parser][], and then use the parser to parse some code: +//! +//! ``` +//! let code = r#" +//! "#; +//! let mut parser = tree_sitter::Parser::new(); +//! let language = tree_sitter_PARSER_NAME::LANGUAGE; +//! parser +//! .set_language(&language.into()) +//! .expect("Error loading CAMEL_PARSER_NAME parser"); +//! let tree = parser.parse(code, None).unwrap(); +//! assert!(!tree.root_node().has_error()); +//! ``` +//! +//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html +//! [tree-sitter]: https://tree-sitter.github.io/ + +use tree_sitter_language::LanguageFn; + +extern "C" { + fn tree_sitter_PARSER_NAME() -> *const (); +} + +/// The tree-sitter [`LanguageFn`][LanguageFn] for this grammar. +/// +/// [LanguageFn]: https://docs.rs/tree-sitter-language/*/tree_sitter_language/struct.LanguageFn.html +pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_PARSER_NAME) }; + +/// The content of the [`node-types.json`][] file for this grammar. +/// +/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types +pub const NODE_TYPES: &str = include_str!("../../src/node-types.json"); + +// NOTE: uncomment these to include any queries that this grammar contains: + +// pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); +// pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); +// pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); +// pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); + +#[cfg(test)] +mod tests { + #[test] + fn test_can_load_grammar() { + let mut parser = tree_sitter::Parser::new(); + parser + .set_language(&super::LANGUAGE.into()) + .expect("Error loading CAMEL_PARSER_NAME parser"); + } +} diff --git a/cli/src/generate/templates/makefile b/cli/src/generate/templates/makefile new file mode 100644 index 00000000..aca7d6c1 --- /dev/null +++ b/cli/src/generate/templates/makefile @@ -0,0 +1,114 @@ +ifeq ($(OS),Windows_NT) +$(error Windows is not supported) +endif + +VERSION := 0.0.1 + +LANGUAGE_NAME := tree-sitter-PARSER_NAME + +# repository +SRC_DIR := src + +PARSER_REPO_URL := $(shell git -C $(SRC_DIR) remote get-url origin 2>/dev/null) + +ifeq ($(PARSER_URL),) + PARSER_URL := $(subst .git,,$(PARSER_REPO_URL)) +ifeq ($(shell echo $(PARSER_URL) | grep '^[a-z][-+.0-9a-z]*://'),) + PARSER_URL := $(subst :,/,$(PARSER_URL)) + PARSER_URL := $(subst git@,https://,$(PARSER_URL)) +endif +endif + +TS ?= tree-sitter + +# install directory layout +PREFIX ?= /usr/local +INCLUDEDIR ?= $(PREFIX)/include +LIBDIR ?= $(PREFIX)/lib +PCLIBDIR ?= $(LIBDIR)/pkgconfig + +# source/object files +PARSER := $(SRC_DIR)/parser.c +EXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c)) +OBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS)) + +# flags +ARFLAGS ?= rcs +override CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC + +# ABI versioning +SONAME_MAJOR := $(word 1,$(subst ., ,$(VERSION))) +SONAME_MINOR := $(shell sed -n 's/#define LANGUAGE_VERSION //p' $(PARSER)) + +# OS-specific bits +ifeq ($(shell uname),Darwin) + SOEXT = dylib + SOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT) + SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT) + LINKSHARED := $(LINKSHARED)-dynamiclib -Wl, + ifneq ($(ADDITIONAL_LIBS),) + LINKSHARED := $(LINKSHARED)$(ADDITIONAL_LIBS), + endif + LINKSHARED := $(LINKSHARED)-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks +else + SOEXT = so + SOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR) + SOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR) + LINKSHARED := $(LINKSHARED)-shared -Wl, + ifneq ($(ADDITIONAL_LIBS),) + LINKSHARED := $(LINKSHARED)$(ADDITIONAL_LIBS) + endif + LINKSHARED := $(LINKSHARED)-soname,lib$(LANGUAGE_NAME).$(SOEXTVER) +endif +ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),) + PCLIBDIR := $(PREFIX)/libdata/pkgconfig +endif + +all: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc + +lib$(LANGUAGE_NAME).a: $(OBJS) + $(AR) $(ARFLAGS) $@ $^ + +lib$(LANGUAGE_NAME).$(SOEXT): $(OBJS) + $(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@ +ifneq ($(STRIP),) + $(STRIP) $@ +endif + +$(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in + sed -e 's|@URL@|$(PARSER_URL)|' \ + -e 's|@VERSION@|$(VERSION)|' \ + -e 's|@LIBDIR@|$(LIBDIR)|' \ + -e 's|@INCLUDEDIR@|$(INCLUDEDIR)|' \ + -e 's|@REQUIRES@|$(REQUIRES)|' \ + -e 's|@ADDITIONAL_LIBS@|$(ADDITIONAL_LIBS)|' \ + -e 's|=$(PREFIX)|=$${prefix}|' \ + -e 's|@PREFIX@|$(PREFIX)|' $< > $@ + +$(PARSER): $(SRC_DIR)/grammar.json + $(TS) generate --no-bindings $^ + +install: all + install -d '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' + install -m644 bindings/c/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h + install -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc + install -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a + install -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) + ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) + ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) + +uninstall: + $(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \ + '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \ + '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \ + '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \ + '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \ + '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc + +clean: + $(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) + +test: + $(TS) test + +.PHONY: all install uninstall clean test diff --git a/crates/cli/src/templates/package.json b/cli/src/generate/templates/package.json similarity index 60% rename from crates/cli/src/templates/package.json rename to cli/src/generate/templates/package.json index d9dbbd33..b615cc48 100644 --- a/crates/cli/src/templates/package.json +++ b/cli/src/generate/templates/package.json @@ -1,19 +1,9 @@ { "name": "tree-sitter-PARSER_NAME", - "version": "PARSER_VERSION", - "description": "PARSER_DESCRIPTION", - "type": "module", - "repository": { - "type": "git", - "url": "git+PARSER_URL.git" - }, - "funding": "FUNDING_URL", - "license": "PARSER_LICENSE", - "author": { - "name": "PARSER_AUTHOR_NAME", - "email": "PARSER_AUTHOR_EMAIL", - "url": "PARSER_AUTHOR_URL" - }, + "version": "0.0.1", + "description": "CAMEL_PARSER_NAME grammar for tree-sitter", + "repository": "github:tree-sitter/tree-sitter-PARSER_NAME", + "license": "MIT", "main": "bindings/node", "types": "bindings/node", "keywords": [ @@ -24,7 +14,6 @@ ], "files": [ "grammar.js", - "tree-sitter.json", "binding.gyp", "prebuilds/**", "bindings/node/*", @@ -33,16 +22,15 @@ "*.wasm" ], "dependencies": { - "node-addon-api": "^8.5.0", - "node-gyp-build": "^4.8.4" + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" }, "devDependencies": { "prebuildify": "^6.0.1", - "tree-sitter": "^0.25.0", "tree-sitter-cli": "^CLI_VERSION" }, "peerDependencies": { - "tree-sitter": "^0.25.0" + "tree-sitter": "^0.21.1" }, "peerDependenciesMeta": { "tree-sitter": { @@ -54,5 +42,11 @@ "prestart": "tree-sitter build --wasm", "start": "tree-sitter playground", "test": "node --test bindings/node/*_test.js" - } + }, + "tree-sitter": [ + { + "scope": "source.LOWER_PARSER_NAME", + "injection-regex": "^LOWER_PARSER_NAME$" + } + ] } diff --git a/cli/src/generate/templates/package.swift b/cli/src/generate/templates/package.swift new file mode 100644 index 00000000..d1053b46 --- /dev/null +++ b/cli/src/generate/templates/package.swift @@ -0,0 +1,37 @@ +// swift-tools-version:5.3 +import PackageDescription + +let package = Package( + name: "TreeSitterCAMEL_PARSER_NAME", + products: [ + .library(name: "TreeSitterCAMEL_PARSER_NAME", targets: ["TreeSitterCAMEL_PARSER_NAME"]), + ], + dependencies: [ + .package(url: "https://github.com/ChimeHQ/SwiftTreeSitter", from: "0.8.0"), + ], + targets: [ + .target( + name: "TreeSitterCAMEL_PARSER_NAME", + dependencies: [], + path: ".", + sources: [ + "src/parser.c", + // NOTE: if your language has an external scanner, add it here. + ], + resources: [ + .copy("queries") + ], + publicHeadersPath: "bindings/swift", + cSettings: [.headerSearchPath("src")] + ), + .testTarget( + name: "TreeSitterCAMEL_PARSER_NAMETests", + dependencies: [ + "SwiftTreeSitter", + "TreeSitterCAMEL_PARSER_NAME", + ], + path: "bindings/swift/TreeSitterCAMEL_PARSER_NAMETests" + ) + ], + cLanguageStandard: .c11 +) diff --git a/crates/cli/src/templates/py-binding.c b/cli/src/generate/templates/py-binding.c similarity index 72% rename from crates/cli/src/templates/py-binding.c rename to cli/src/generate/templates/py-binding.c index c74db112..74309fa8 100644 --- a/crates/cli/src/templates/py-binding.c +++ b/cli/src/generate/templates/py-binding.c @@ -8,13 +8,6 @@ static PyObject* _binding_language(PyObject *Py_UNUSED(self), PyObject *Py_UNUSE return PyCapsule_New(tree_sitter_LOWER_PARSER_NAME(), "tree_sitter.Language", NULL); } -static struct PyModuleDef_Slot slots[] = { -#ifdef Py_GIL_DISABLED - {Py_mod_gil, Py_MOD_GIL_NOT_USED}, -#endif - {0, NULL} -}; - static PyMethodDef methods[] = { {"language", _binding_language, METH_NOARGS, "Get the tree-sitter language for this grammar."}, @@ -25,11 +18,10 @@ static struct PyModuleDef module = { .m_base = PyModuleDef_HEAD_INIT, .m_name = "_binding", .m_doc = NULL, - .m_size = 0, - .m_methods = methods, - .m_slots = slots, + .m_size = -1, + .m_methods = methods }; PyMODINIT_FUNC PyInit__binding(void) { - return PyModuleDef_Init(&module); + return PyModule_Create(&module); } diff --git a/crates/cli/src/templates/pyproject.toml b/cli/src/generate/templates/pyproject.toml similarity index 54% rename from crates/cli/src/templates/pyproject.toml rename to cli/src/generate/templates/pyproject.toml index 0f47e0f4..d545ebfb 100644 --- a/crates/cli/src/templates/pyproject.toml +++ b/cli/src/generate/templates/pyproject.toml @@ -1,30 +1,29 @@ [build-system] -requires = ["setuptools>=62.4.0", "wheel"] +requires = ["setuptools>=42", "wheel"] build-backend = "setuptools.build_meta" [project] name = "tree-sitter-PARSER_NAME" -description = "PARSER_DESCRIPTION" -version = "PARSER_VERSION" +description = "CAMEL_PARSER_NAME grammar for tree-sitter" +version = "0.0.1" keywords = ["incremental", "parsing", "tree-sitter", "PARSER_NAME"] classifiers = [ "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Compilers", "Topic :: Text Processing :: Linguistic", - "Typing :: Typed", + "Typing :: Typed" ] -authors = [{ name = "PARSER_AUTHOR_NAME", email = "PARSER_AUTHOR_EMAIL" }] -requires-python = ">=3.10" -license.text = "PARSER_LICENSE" +requires-python = ">=3.9" +license.text = "MIT" readme = "README.md" [project.urls] -Homepage = "PARSER_URL" -Funding = "FUNDING_URL" +Homepage = "https://github.com/tree-sitter/tree-sitter-PARSER_NAME" [project.optional-dependencies] -core = ["tree-sitter~=0.24"] +core = ["tree-sitter~=0.22"] [tool.cibuildwheel] -build = "cp310-*" +build = "cp39-*" build-frontend = "build" diff --git a/cli/src/generate/templates/setup.py b/cli/src/generate/templates/setup.py new file mode 100644 index 00000000..eaac845c --- /dev/null +++ b/cli/src/generate/templates/setup.py @@ -0,0 +1,62 @@ +from os.path import isdir, join +from platform import system + +from setuptools import Extension, find_packages, setup +from setuptools.command.build import build +from wheel.bdist_wheel import bdist_wheel + + +class Build(build): + def run(self): + if isdir("queries"): + dest = join(self.build_lib, "tree_sitter_PARSER_NAME", "queries") + self.copy_tree("queries", dest) + super().run() + + +class BdistWheel(bdist_wheel): + def get_tag(self): + python, abi, platform = super().get_tag() + if python.startswith("cp"): + python, abi = "cp39", "abi3" + return python, abi, platform + + +setup( + packages=find_packages("bindings/python"), + package_dir={"": "bindings/python"}, + package_data={ + "tree_sitter_LOWER_PARSER_NAME": ["*.pyi", "py.typed"], + "tree_sitter_LOWER_PARSER_NAME.queries": ["*.scm"], + }, + ext_package="tree_sitter_LOWER_PARSER_NAME", + ext_modules=[ + Extension( + name="_binding", + sources=[ + "bindings/python/tree_sitter_LOWER_PARSER_NAME/binding.c", + "src/parser.c", + # NOTE: if your language uses an external scanner, add it here. + ], + extra_compile_args=[ + "-std=c11", + "-fvisibility=hidden", + ] if system() != "Windows" else [ + "/std:c11", + "/utf-8", + ], + define_macros=[ + ("Py_LIMITED_API", "0x03090000"), + ("PY_SSIZE_T_CLEAN", None), + ("TREE_SITTER_HIDE_SYMBOLS", None), + ], + include_dirs=["src"], + py_limited_api=True, + ) + ], + cmdclass={ + "build": Build, + "bdist_wheel": BdistWheel + }, + zip_safe=False +) diff --git a/cli/src/generate/templates/test_binding.py b/cli/src/generate/templates/test_binding.py new file mode 100644 index 00000000..6be6cf4b --- /dev/null +++ b/cli/src/generate/templates/test_binding.py @@ -0,0 +1,11 @@ +from unittest import TestCase + +import tree_sitter, tree_sitter_LOWER_PARSER_NAME + + +class TestLanguage(TestCase): + def test_can_load_grammar(self): + try: + tree_sitter.Language(tree_sitter_LOWER_PARSER_NAME.language()) + except Exception: + self.fail("Error loading CAMEL_PARSER_NAME grammar") diff --git a/crates/cli/src/templates/tests.swift b/cli/src/generate/templates/tests.swift similarity index 61% rename from crates/cli/src/templates/tests.swift rename to cli/src/generate/templates/tests.swift index 8b3c071b..3d0b8ce0 100644 --- a/crates/cli/src/templates/tests.swift +++ b/cli/src/generate/templates/tests.swift @@ -1,12 +1,12 @@ import XCTest import SwiftTreeSitter -import PARSER_CLASS_NAME +import TreeSitterCAMEL_PARSER_NAME -final class PARSER_CLASS_NAMETests: XCTestCase { +final class TreeSitterCAMEL_PARSER_NAMETests: XCTestCase { func testCanLoadGrammar() throws { let parser = Parser() let language = Language(language: tree_sitter_LOWER_PARSER_NAME()) XCTAssertNoThrow(try parser.setLanguage(language), - "Error loading TITLE_PARSER_NAME grammar") + "Error loading CAMEL_PARSER_NAME grammar") } } diff --git a/crates/cli/src/highlight.rs b/cli/src/highlight.rs similarity index 60% rename from crates/cli/src/highlight.rs rename to cli/src/highlight.rs index a2cb01cf..dc7216a9 100644 --- a/crates/cli/src/highlight.rs +++ b/cli/src/highlight.rs @@ -1,24 +1,22 @@ use std::{ - collections::{BTreeMap, HashSet}, + collections::HashMap, fmt::Write, fs, io::{self, Write as _}, - path::{self, Path, PathBuf}, - str, - sync::{atomic::AtomicUsize, Arc}, + path, str, + sync::atomic::AtomicUsize, time::Instant, }; -use ansi_colours::{ansi256_from_rgb, rgb_from_ansi256}; use anstyle::{Ansi256Color, AnsiColor, Color, Effects, RgbColor}; use anyhow::Result; -use log::{info, warn}; +use lazy_static::lazy_static; use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer}; use serde_json::{json, Value}; use tree_sitter_highlight::{HighlightConfiguration, HighlightEvent, Highlighter, HtmlRenderer}; use tree_sitter_loader::Loader; -pub const HTML_HEAD_HEADER: &str = " +pub const HTML_HEADER: &str = " Tree-sitter Highlighting @@ -35,9 +33,7 @@ pub const HTML_HEAD_HEADER: &str = " .line { white-space: pre; } - "; - -pub const HTML_BODY_HEADER: &str = " + "; @@ -46,6 +42,11 @@ pub const HTML_FOOTER: &str = " "; +lazy_static! { + static ref CSS_STYLES_BY_COLOR_ID: Vec = + serde_json::from_str(include_str!("../vendor/xterm-colors.json")).unwrap(); +} + #[derive(Debug, Default)] pub struct Style { pub ansi: anstyle::Style, @@ -83,9 +84,9 @@ impl<'de> Deserialize<'de> for Theme { { let mut styles = Vec::new(); let mut highlight_names = Vec::new(); - if let Ok(colors) = BTreeMap::::deserialize(deserializer) { - styles.reserve(colors.len()); + if let Ok(colors) = HashMap::::deserialize(deserializer) { highlight_names.reserve(colors.len()); + styles.reserve(colors.len()); for (name, style_value) in colors { let mut style = Style::default(); parse_style(&mut style, style_value); @@ -128,7 +129,7 @@ impl Serialize for Theme { || effects.contains(Effects::ITALIC) || effects.contains(Effects::UNDERLINE) { - let mut style_json = BTreeMap::new(); + let mut style_json = HashMap::new(); if let Some(color) = color { style_json.insert("color", color); } @@ -155,32 +156,28 @@ impl Serialize for Theme { impl Default for Theme { fn default() -> Self { serde_json::from_value(json!({ - "attribute": {"color": 124, "italic": true}, - "comment": {"color": 245, "italic": true}, - "constant": 94, - "constant.builtin": {"color": 94, "bold": true}, - "constructor": 136, - "embedded": null, - "function": 26, - "function.builtin": {"color": 26, "bold": true}, - "keyword": 56, - "module": 136, - "number": {"color": 94, "bold": true}, - "operator": {"color": 239, "bold": true}, - "property": 124, - "property.builtin": {"color": 124, "bold": true}, - "punctuation": 239, - "punctuation.bracket": 239, - "punctuation.delimiter": 239, - "punctuation.special": 239, - "string": 28, - "string.special": 30, - "tag": 18, - "type": 23, - "type.builtin": {"color": 23, "bold": true}, - "variable": 252, - "variable.builtin": {"color": 252, "bold": true}, - "variable.parameter": {"color": 252, "underline": true} + "attribute": {"color": 124, "italic": true}, + "comment": {"color": 245, "italic": true}, + "constant.builtin": {"color": 94, "bold": true}, + "constant": 94, + "constructor": 136, + "embedded": null, + "function.builtin": {"color": 26, "bold": true}, + "function": 26, + "keyword": 56, + "number": {"color": 94, "bold": true}, + "module": 136, + "property": 124, + "operator": {"color": 239, "bold": true}, + "punctuation.bracket": 239, + "punctuation.delimiter": 239, + "string.special": 30, + "string": 28, + "tag": 18, + "type": 23, + "type.builtin": {"color": 23, "bold": true}, + "variable.builtin": {"bold": true}, + "variable.parameter": {"underline": true} })) .unwrap() } @@ -223,8 +220,9 @@ fn parse_style(style: &mut Style, json: Value) { if let Some(Color::Rgb(RgbColor(red, green, blue))) = style.ansi.get_fg_color() { if !terminal_supports_truecolor() { - let ansi256 = Color::Ansi256(Ansi256Color(ansi256_from_rgb((red, green, blue)))); - style.ansi = style.ansi.fg_color(Some(ansi256)); + style.ansi = style + .ansi + .fg_color(Some(closest_xterm_color(red, green, blue))); } } } @@ -270,7 +268,7 @@ fn hex_string_to_rgb(s: &str) -> Option<(u8, u8, u8)> { } fn style_to_css(style: anstyle::Style) -> String { - let mut result = String::new(); + let mut result = "style='".to_string(); let effects = style.get_effects(); if effects.contains(Effects::UNDERLINE) { write!(&mut result, "text-decoration: underline;").unwrap(); @@ -284,6 +282,7 @@ fn style_to_css(style: anstyle::Style) -> String { if let Some(color) = style.get_fg_color() { write_color(&mut result, color); } + result.push('\''); result } @@ -301,156 +300,127 @@ fn write_color(buffer: &mut String, color: Color) { _ => unreachable!(), }, Color::Ansi256(Ansi256Color(n)) => { - let (r, g, b) = rgb_from_ansi256(n); - write!(buffer, "color: #{r:02x}{g:02x}{b:02x}").unwrap(); + write!(buffer, "color: {}", CSS_STYLES_BY_COLOR_ID[n as usize]).unwrap() } Color::Rgb(RgbColor(r, g, b)) => write!(buffer, "color: #{r:02x}{g:02x}{b:02x}").unwrap(), } } fn terminal_supports_truecolor() -> bool { - std::env::var("COLORTERM") - .is_ok_and(|truecolor| truecolor == "truecolor" || truecolor == "24bit") + std::env::var("COLORTERM").map_or(false, |truecolor| { + truecolor == "truecolor" || truecolor == "24bit" + }) } -pub struct HighlightOptions { - pub theme: Theme, - pub check: bool, - pub captures_path: Option, - pub inline_styles: bool, - pub html: bool, - pub quiet: bool, - pub print_time: bool, - pub cancellation_flag: Arc, +fn closest_xterm_color(red: u8, green: u8, blue: u8) -> Color { + use std::cmp::{max, min}; + + let colors = CSS_STYLES_BY_COLOR_ID + .iter() + .enumerate() + .map(|(color_id, hex)| (color_id as u8, hex_string_to_rgb(hex).unwrap())); + + // Get the xterm color with the minimum Euclidean distance to the target color + // i.e. distance = √ (r2 - r1)² + (g2 - g1)² + (b2 - b1)² + let distances = colors.map(|(color_id, (r, g, b))| { + let r_delta = (max(r, red) - min(r, red)) as u32; + let g_delta = (max(g, green) - min(g, green)) as u32; + let b_delta = (max(b, blue) - min(b, blue)) as u32; + let distance = r_delta.pow(2) + g_delta.pow(2) + b_delta.pow(2); + // don't need to actually take the square root for the sake of comparison + (color_id, distance) + }); + + Color::Ansi256(Ansi256Color( + distances.min_by(|(_, d1), (_, d2)| d1.cmp(d2)).unwrap().0, + )) } -pub fn highlight( +pub fn ansi( loader: &Loader, - path: &Path, - name: &str, + theme: &Theme, + source: &[u8], config: &HighlightConfiguration, - print_name: bool, - opts: &HighlightOptions, + print_time: bool, + cancellation_flag: Option<&AtomicUsize>, ) -> Result<()> { - if opts.check { - let names = if let Some(path) = opts.captures_path.as_deref() { - let file = fs::read_to_string(path)?; - let capture_names = file - .lines() - .filter_map(|line| { - if line.trim().is_empty() || line.trim().starts_with(';') { - return None; - } - line.split(';').next().map(|s| s.trim().trim_matches('"')) - }) - .collect::>(); - config.nonconformant_capture_names(&capture_names) - } else { - config.nonconformant_capture_names(&HashSet::new()) - }; - if names.is_empty() { - info!("All highlight captures conform to standards."); - } else { - warn!( - "Non-standard highlight {} detected:\n* {}", - if names.len() > 1 { - "captures" - } else { - "capture" - }, - names.join("\n* ") - ); - } - } - - let source = fs::read(path)?; let stdout = io::stdout(); let mut stdout = stdout.lock(); let time = Instant::now(); let mut highlighter = Highlighter::new(); - let events = - highlighter.highlight(config, &source, Some(&opts.cancellation_flag), |string| { - loader.highlight_config_for_injection_string(string) - })?; - let theme = &opts.theme; - if !opts.quiet && print_name { - writeln!(&mut stdout, "{name}")?; - } + let events = highlighter.highlight(config, source, cancellation_flag, |string| { + loader.highlight_config_for_injection_string(string) + })?; - if opts.html { - if !opts.quiet { - writeln!(&mut stdout, "{HTML_HEAD_HEADER}")?; - writeln!(&mut stdout, " ")?; - writeln!(&mut stdout, "{HTML_BODY_HEADER}")?; - } - - let mut renderer = HtmlRenderer::new(); - renderer.render(events, &source, &move |highlight, output| { - if opts.inline_styles { - output.extend(b"style='"); - output.extend( - theme.styles[highlight.0] - .css - .as_ref() - .map_or_else(|| "".as_bytes(), |css_style| css_style.as_bytes()), - ); - output.extend(b"'"); - } else { - output.extend(b"class='"); - let mut parts = theme.highlight_names[highlight.0].split('.').peekable(); - while let Some(part) = parts.next() { - output.extend(part.as_bytes()); - if parts.peek().is_some() { - output.extend(b" "); - } - } - output.extend(b"'"); + HighlightEvent::HighlightEnd => { + style_stack.pop(); } - })?; - - if !opts.quiet { - writeln!(&mut stdout, "")?; - for (i, line) in renderer.lines().enumerate() { - writeln!( - &mut stdout, - "", - i + 1, - )?; - } - writeln!(&mut stdout, "
{}{line}
")?; - writeln!(&mut stdout, "{HTML_FOOTER}")?; - } - } else { - let mut style_stack = vec![theme.default_style().ansi]; - for event in events { - match event? { - HighlightEvent::HighlightStart(highlight) => { - style_stack.push(theme.styles[highlight.0].ansi); - } - HighlightEvent::HighlightEnd => { - style_stack.pop(); - } - HighlightEvent::Source { start, end } => { - let style = style_stack.last().unwrap(); - write!(&mut stdout, "{style}").unwrap(); - stdout.write_all(&source[start..end])?; - write!(&mut stdout, "{style:#}").unwrap(); - } + HighlightEvent::Source { start, end } => { + let style = style_stack.last().unwrap(); + write!(&mut stdout, "{style}").unwrap(); + stdout.write_all(&source[start..end])?; + write!(&mut stdout, "{style:#}").unwrap(); } } } - if opts.print_time { - info!("Time: {}ms", time.elapsed().as_millis()); + if print_time { + eprintln!("Time: {}ms", time.elapsed().as_millis()); + } + + Ok(()) +} + +pub fn html( + loader: &Loader, + theme: &Theme, + source: &[u8], + config: &HighlightConfiguration, + quiet: bool, + print_time: bool, + cancellation_flag: Option<&AtomicUsize>, +) -> Result<()> { + use std::io::Write; + + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + let time = Instant::now(); + let mut highlighter = Highlighter::new(); + + let events = highlighter.highlight(config, source, cancellation_flag, |string| { + loader.highlight_config_for_injection_string(string) + })?; + + let mut renderer = HtmlRenderer::new(); + renderer.render(events, source, &move |highlight| { + theme.styles[highlight.0] + .css + .as_ref() + .map_or_else(|| "".as_bytes(), |css_style| css_style.as_bytes()) + })?; + + if !quiet { + writeln!(&mut stdout, "")?; + for (i, line) in renderer.lines().enumerate() { + writeln!( + &mut stdout, + "", + i + 1, + )?; + } + + writeln!(&mut stdout, "
{}{line}
")?; + } + + if print_time { + eprintln!("Time: {}ms", time.elapsed().as_millis()); } Ok(()) @@ -480,7 +450,7 @@ mod tests { style.ansi.get_fg_color(), Some(Color::Ansi256(Ansi256Color(36))) ); - assert_eq!(style.css, Some("color: #00af87".to_string())); + assert_eq!(style.css, Some("style=\'color: #00af87\'".to_string())); // junglegreen is not an ANSI color and is preserved when the terminal supports it env::set_var("COLORTERM", "truecolor"); @@ -489,16 +459,16 @@ mod tests { style.ansi.get_fg_color(), Some(Color::Rgb(RgbColor(38, 166, 154))) ); - assert_eq!(style.css, Some("color: #26a69a".to_string())); + assert_eq!(style.css, Some("style=\'color: #26a69a\'".to_string())); - // junglegreen gets approximated as cadetblue when the terminal does not support it + // junglegreen gets approximated as darkcyan when the terminal does not support it env::set_var("COLORTERM", ""); parse_style(&mut style, Value::String(JUNGLE_GREEN.to_string())); assert_eq!( style.ansi.get_fg_color(), - Some(Color::Ansi256(Ansi256Color(72))) + Some(Color::Ansi256(Ansi256Color(36))) ); - assert_eq!(style.css, Some("color: #26a69a".to_string())); + assert_eq!(style.css, Some("style=\'color: #26a69a\'".to_string())); if let Ok(environment_variable) = original_environment_variable { env::set_var("COLORTERM", environment_variable); diff --git a/crates/cli/src/tree_sitter_cli.rs b/cli/src/lib.rs similarity index 69% rename from crates/cli/src/tree_sitter_cli.rs rename to cli/src/lib.rs index 3960d961..79f6a34f 100644 --- a/crates/cli/src/tree_sitter_cli.rs +++ b/cli/src/lib.rs @@ -1,9 +1,8 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] +#![doc = include_str!("../README.md")] pub mod fuzz; +pub mod generate; pub mod highlight; -pub mod init; -pub mod input; pub mod logger; pub mod parse; pub mod playground; @@ -14,11 +13,11 @@ pub mod test; pub mod test_highlight; pub mod test_tags; pub mod util; -pub mod version; pub mod wasm; #[cfg(test)] mod tests; +// To run compile fail tests #[cfg(doctest)] mod tests; diff --git a/cli/src/logger.rs b/cli/src/logger.rs new file mode 100644 index 00000000..ce4f74a3 --- /dev/null +++ b/cli/src/logger.rs @@ -0,0 +1,30 @@ +use log::{LevelFilter, Log, Metadata, Record}; + +#[allow(dead_code)] +struct Logger { + pub filter: Option, +} + +impl Log for Logger { + fn enabled(&self, _: &Metadata) -> bool { + true + } + + fn log(&self, record: &Record) { + eprintln!( + "[{}] {}", + record + .module_path() + .unwrap_or_default() + .trim_start_matches("rust_tree_sitter_cli::"), + record.args() + ); + } + + fn flush(&self) {} +} + +pub fn init() { + log::set_boxed_logger(Box::new(Logger { filter: None })).unwrap(); + log::set_max_level(LevelFilter::Info); +} diff --git a/cli/src/main.rs b/cli/src/main.rs new file mode 100644 index 00000000..afd9b8c1 --- /dev/null +++ b/cli/src/main.rs @@ -0,0 +1,1151 @@ +use std::{ + collections::HashSet, + env, fs, + path::{Path, PathBuf}, +}; + +use anstyle::{AnsiColor, Color, Style}; +use anyhow::{anyhow, Context, Result}; +use clap::{crate_authors, Args, Command, FromArgMatches as _, Subcommand}; +use clap_complete::{generate, Shell}; +use glob::glob; +use regex::Regex; +use tree_sitter::{ffi, Parser, Point}; +use tree_sitter_cli::{ + fuzz::{ + fuzz_language_corpus, FuzzOptions, EDIT_COUNT, ITERATION_COUNT, LOG_ENABLED, + LOG_GRAPH_ENABLED, START_SEED, + }, + generate::{self, lookup_package_json_for_path}, + highlight, logger, + parse::{self, ParseFileOptions, ParseOutput}, + playground, query, tags, + test::{self, TestOptions}, + test_highlight, test_tags, util, wasm, +}; +use tree_sitter_config::Config; +use tree_sitter_highlight::Highlighter; +use tree_sitter_loader as loader; +use tree_sitter_tags::TagsContext; + +const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); +const BUILD_SHA: Option<&'static str> = option_env!("BUILD_SHA"); +const DEFAULT_GENERATE_ABI_VERSION: usize = 14; + +#[derive(Subcommand)] +#[command(about="Generates and tests parsers", author=crate_authors!("\n"), styles=get_styles())] +enum Commands { + InitConfig(InitConfig), + Generate(Generate), + Build(Build), + Parse(Parse), + Test(Test), + Fuzz(Fuzz), + Query(Query), + Highlight(Highlight), + Tags(Tags), + Playground(Playground), + DumpLanguages(DumpLanguages), + Complete(Complete), +} + +#[derive(Args)] +#[command(about = "Generate a default config file")] +struct InitConfig; + +#[derive(Args)] +#[command(about = "Generate a parser", alias = "gen", alias = "g")] +struct Generate { + #[arg(index = 1, help = "The path to the grammar file")] + pub grammar_path: Option, + #[arg(long, short, help = "Show debug log during generation")] + pub log: bool, + #[arg( + long = "abi", + value_name = "VERSION", + help = format!(concat!( + "Select the language ABI version to generate (default {}).\n", + "Use --abi=latest to generate the newest supported version ({}).", + ), + DEFAULT_GENERATE_ABI_VERSION, + tree_sitter::LANGUAGE_VERSION, + ) + )] + pub abi_version: Option, + #[arg(long, help = "Don't generate language bindings")] + pub no_bindings: bool, + #[arg( + long, + short = 'b', + help = "Compile all defined languages in the current dir" + )] + pub build: bool, + #[arg(long, short = '0', help = "Compile a parser in debug mode")] + pub debug_build: bool, + #[arg( + long, + value_name = "PATH", + help = "The path to the directory containing the parser library" + )] + pub libdir: Option, + #[arg( + long, + help = "Produce a report of the states for the given rule, use `-` to report every rule" + )] + pub report_states_for_rule: Option, + + #[arg( + long, + value_name = "EXECUTABLE", + env = "TREE_SITTER_JS_RUNTIME", + default_value = "node", + help = "The name or path of the JavaScript runtime to use for generating parsers" + )] + pub js_runtime: Option, +} + +#[derive(Args)] +#[command(about = "Compile a parser", alias = "b")] +struct Build { + #[arg(short, long, help = "Build a WASM module instead of a dynamic library")] + pub wasm: bool, + #[arg( + short, + long, + help = "Run emscripten via docker even if it is installed locally (only if building a WASM module with --wasm)" + )] + pub docker: bool, + #[arg(short, long, help = "The path to output the compiled file")] + pub output: Option, + #[arg(index = 1, num_args = 1, help = "The path to the grammar directory")] + pub path: Option, + #[arg(long, help = "Make the parser reuse the same allocator as the library")] + pub reuse_allocator: bool, + #[arg(long, short = '0', help = "Compile a parser in debug mode")] + pub debug: bool, +} + +#[derive(Args)] +#[command(about = "Parse files", alias = "p")] +struct Parse { + #[arg( + long = "paths", + help = "The path to a file with paths to source file(s)" + )] + pub paths_file: Option, + #[arg(num_args=1.., help = "The source file(s) to use")] + pub paths: Option>, + #[arg( + long, + help = "Select a language by the scope instead of a file extension" + )] + pub scope: Option, + #[arg(long, short = 'd', help = "Show parsing debug log")] + pub debug: bool, + #[arg(long, short = '0', help = "Compile a parser in debug mode")] + pub debug_build: bool, + #[arg( + long, + short = 'D', + help = "Produce the log.html file with debug graphs" + )] + pub debug_graph: bool, + #[arg( + long, + help = "Compile parsers to wasm instead of native dynamic libraries" + )] + pub wasm: bool, + #[arg(long = "dot", help = "Output the parse data with graphviz dot")] + pub output_dot: bool, + #[arg( + long = "xml", + short = 'x', + help = "Output the parse data in XML format" + )] + pub output_xml: bool, + #[arg(long, short, help = "Show parsing statistic")] + pub stat: bool, + #[arg(long, help = "Interrupt the parsing process by timeout (µs)")] + pub timeout: Option, + #[arg(long, short, help = "Measure execution time")] + pub time: bool, + #[arg(long, short, help = "Suppress main output")] + pub quiet: bool, + #[arg( + long, + num_args = 1.., + help = "Apply edits in the format: \"row, col delcount insert_text\"" + )] + pub edits: Option>, + #[arg(long, help = "The encoding of the input files")] + pub encoding: Option, + #[arg( + long, + help = "Open `log.html` in the default browser, if `--debug-graph` is supplied" + )] + pub open_log: bool, + #[arg(long, help = "The path to an alternative config.json file")] + pub config_path: Option, + #[arg(long, short = 'n', help = "Parse the contents of a specific test")] + #[clap(conflicts_with = "paths", conflicts_with = "paths_file")] + pub test_number: Option, + #[arg(short, long, help = "Force rebuild the parser")] + pub rebuild: bool, +} + +#[derive(Args)] +#[command(about = "Run a parser's tests", alias = "t")] +struct Test { + #[arg( + long, + short, + help = "Only run corpus test cases whose name matches the given regex" + )] + pub include: Option, + #[arg( + long, + short, + help = "Only run corpus test cases whose name does not match the given regex" + )] + pub exclude: Option, + #[arg( + long, + short, + help = "Update all syntax trees in corpus files with current parser output" + )] + pub update: bool, + #[arg(long, short = 'd', help = "Show parsing debug log")] + pub debug: bool, + #[arg(long, short = '0', help = "Compile a parser in debug mode")] + pub debug_build: bool, + #[arg( + long, + short = 'D', + help = "Produce the log.html file with debug graphs" + )] + pub debug_graph: bool, + #[arg( + long, + help = "Compile parsers to wasm instead of native dynamic libraries" + )] + pub wasm: bool, + #[arg( + long, + help = "Open `log.html` in the default browser, if `--debug-graph` is supplied" + )] + pub open_log: bool, + #[arg(long, help = "The path to an alternative config.json file")] + pub config_path: Option, + #[arg(long, help = "Force showing fields in test diffs")] + pub show_fields: bool, + #[arg(short, long, help = "Force rebuild the parser")] + pub rebuild: bool, +} + +#[derive(Args)] +#[command(about = "Fuzz a parser", alias = "f")] +struct Fuzz { + #[arg(long, short, help = "List of test names to skip")] + pub skip: Option>, + #[arg(long, help = "Subdirectory to the language")] + pub subdir: Option, + #[arg(long, help = "Maximum number of edits to perform per fuzz test")] + pub edits: Option, + #[arg(long, help = "Number of fuzzing iterations to run per test")] + pub iterations: Option, + #[arg( + long, + short, + help = "Only fuzz corpus test cases whose name matches the given regex" + )] + pub include: Option, + #[arg( + long, + short, + help = "Only fuzz corpus test cases whose name does not match the given regex" + )] + pub exclude: Option, + #[arg(long, help = "Enable logging of graphs and input")] + pub log_graphs: bool, + #[arg(long, short, help = "Enable parser logging")] + pub log: bool, + #[arg(short, long, help = "Force rebuild the parser")] + pub rebuild: bool, +} + +#[derive(Args)] +#[command(about = "Search files using a syntax tree query", alias = "q")] +struct Query { + #[arg(help = "Path to a file with queries", index = 1, required = true)] + query_path: String, + #[arg(long, short, help = "Measure execution time")] + pub time: bool, + #[arg(long, short, help = "Suppress main output")] + pub quiet: bool, + #[arg( + long = "paths", + help = "The path to a file with paths to source file(s)" + )] + pub paths_file: Option, + #[arg(index = 2, num_args=1.., help = "The source file(s) to use")] + pub paths: Option>, + #[arg( + long, + help = "The range of byte offsets in which the query will be executed" + )] + pub byte_range: Option, + #[arg(long, help = "The range of rows in which the query will be executed")] + pub row_range: Option, + #[arg( + long, + help = "Select a language by the scope instead of a file extension" + )] + pub scope: Option, + #[arg(long, short, help = "Order by captures instead of matches")] + pub captures: bool, + #[arg(long, help = "Whether to run query tests or not")] + pub test: bool, + #[arg(long, help = "The path to an alternative config.json file")] + pub config_path: Option, +} + +#[derive(Args)] +#[command(about = "Highlight a file", alias = "hi")] +struct Highlight { + #[arg(long, short = 'H', help = "Generate highlighting as an HTML document")] + pub html: bool, + #[arg( + long, + help = "Check that highlighting captures conform strictly to standards" + )] + pub check: bool, + #[arg(long, help = "The path to a file with captures")] + pub captures_path: Option, + #[arg(long, num_args = 1.., help = "The paths to files with queries")] + pub query_paths: Option>, + #[arg( + long, + help = "Select a language by the scope instead of a file extension" + )] + pub scope: Option, + #[arg(long, short, help = "Measure execution time")] + pub time: bool, + #[arg(long, short, help = "Suppress main output")] + pub quiet: bool, + #[arg( + long = "paths", + help = "The path to a file with paths to source file(s)" + )] + pub paths_file: Option, + #[arg(num_args = 1.., help = "The source file(s) to use")] + pub paths: Option>, + #[arg(long, help = "The path to an alternative config.json file")] + pub config_path: Option, +} + +#[derive(Args)] +#[command(about = "Generate a list of tags")] +struct Tags { + #[arg( + long, + help = "Select a language by the scope instead of a file extension" + )] + pub scope: Option, + #[arg(long, short, help = "Measure execution time")] + pub time: bool, + #[arg(long, short, help = "Suppress main output")] + pub quiet: bool, + #[arg( + long = "paths", + help = "The path to a file with paths to source file(s)" + )] + pub paths_file: Option, + #[arg(num_args = 1.., help = "The source file(s) to use")] + pub paths: Option>, + #[arg(long, help = "The path to an alternative config.json file")] + pub config_path: Option, +} + +#[derive(Args)] +#[command( + about = "Start local playground for a parser in the browser", + alias = "play", + alias = "pg", + alias = "web-ui" +)] +struct Playground { + #[arg(long, short, help = "Don't open in default browser")] + pub quiet: bool, + #[arg( + long, + help = "Path to the directory containing the grammar and wasm files" + )] + pub grammar_path: Option, +} + +#[derive(Args)] +#[command(about = "Print info about all known language parsers", alias = "langs")] +struct DumpLanguages { + #[arg(long, help = "The path to an alternative config.json file")] + pub config_path: Option, +} + +#[derive(Args)] +#[command(about = "Generate shell completions", alias = "comp")] +struct Complete { + #[arg( + long, + short, + value_enum, + help = "The shell to generate completions for" + )] + pub shell: Shell, +} + +impl InitConfig { + fn run(self) -> Result<()> { + if let Ok(Some(config_path)) = Config::find_config_file() { + return Err(anyhow!( + "Remove your existing config file first: {}", + config_path.to_string_lossy() + )); + } + let mut config = Config::initial()?; + config.add(tree_sitter_loader::Config::initial())?; + config.add(tree_sitter_cli::highlight::ThemeConfig::default())?; + config.save()?; + println!( + "Saved initial configuration to {}", + config.location.display() + ); + Ok(()) + } +} + +impl Generate { + fn run(self, mut loader: loader::Loader, current_dir: PathBuf) -> Result<()> { + if self.log { + logger::init(); + } + let abi_version = + self.abi_version + .as_ref() + .map_or(DEFAULT_GENERATE_ABI_VERSION, |version| { + if version == "latest" { + tree_sitter::LANGUAGE_VERSION + } else { + version.parse().expect("invalid abi version flag") + } + }); + generate::generate_parser_in_directory( + ¤t_dir, + self.grammar_path.as_deref(), + abi_version, + !self.no_bindings, + self.report_states_for_rule.as_deref(), + self.js_runtime.as_deref(), + )?; + if self.build { + if let Some(path) = self.libdir { + loader = loader::Loader::with_parser_lib_path(PathBuf::from(path)); + } + loader.debug_build(self.debug_build); + loader.languages_at_path(¤t_dir)?; + } + Ok(()) + } +} + +impl Build { + fn run(self, mut loader: loader::Loader, current_dir: PathBuf) -> Result<()> { + let grammar_path = current_dir.join(self.path.as_deref().unwrap_or_default()); + + if self.wasm { + let output_path = self.output.map(|path| current_dir.join(path)); + let root_path = lookup_package_json_for_path(&grammar_path.join("package.json")) + .map(|(p, _)| p.parent().unwrap().to_path_buf())?; + wasm::compile_language_to_wasm( + &loader, + Some(&root_path), + &grammar_path, + ¤t_dir, + output_path, + self.docker, + )?; + } else { + let output_path = if let Some(ref path) = self.output { + let path = Path::new(path); + if path.is_absolute() { + path.to_path_buf() + } else { + current_dir.join(path) + } + } else { + let file_name = grammar_path + .file_stem() + .unwrap() + .to_str() + .unwrap() + .strip_prefix("tree-sitter-") + .unwrap_or("parser"); + current_dir + .join(file_name) + .with_extension(env::consts::DLL_EXTENSION) + }; + + let flags: &[&str] = match (self.reuse_allocator, self.debug) { + (true, true) => &["TREE_SITTER_REUSE_ALLOCATOR", "TREE_SITTER_DEBUG"], + (true, false) => &["TREE_SITTER_REUSE_ALLOCATOR"], + (false, true) => &["TREE_SITTER_DEBUG"], + (false, false) => &[], + }; + + loader.debug_build(self.debug); + + let config = Config::load(None)?; + let loader_config = config.get()?; + loader.find_all_languages(&loader_config).unwrap(); + loader + .compile_parser_at_path(&grammar_path, output_path, flags) + .unwrap(); + } + Ok(()) + } +} + +impl Parse { + fn run(self, mut loader: loader::Loader, current_dir: PathBuf) -> Result<()> { + let config = Config::load(self.config_path)?; + let color = env::var("NO_COLOR").map_or(true, |v| v != "1"); + let output = if self.output_dot { + ParseOutput::Dot + } else if self.output_xml { + ParseOutput::Xml + } else if self.quiet { + ParseOutput::Quiet + } else { + ParseOutput::Normal + }; + + let encoding = if let Some(encoding) = self.encoding { + match encoding.as_str() { + "utf16" => Some(ffi::TSInputEncodingUTF16), + "utf8" => Some(ffi::TSInputEncodingUTF8), + _ => return Err(anyhow!("Invalid encoding. Expected one of: utf8, utf16")), + } + } else { + None + }; + + let time = self.time; + let edits = self.edits.unwrap_or_default(); + let cancellation_flag = util::cancel_on_signal(); + let mut parser = Parser::new(); + + loader.debug_build(self.debug_build); + loader.force_rebuild(self.rebuild); + + #[cfg(feature = "wasm")] + if self.wasm { + let engine = tree_sitter::wasmtime::Engine::default(); + parser + .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) + .unwrap(); + loader.use_wasm(&engine); + } + + let timeout = self.timeout.unwrap_or_default(); + + let (paths, language) = if let Some(target_test) = self.test_number { + let (test_path, language_names) = test::get_tmp_test_file(target_test, color)?; + let languages = loader.languages_at_path(¤t_dir)?; + let language = languages + .iter() + .find(|(_, n)| language_names.contains(&Box::from(n.as_str()))) + .map(|(l, _)| l.clone()); + let paths = collect_paths(None, Some(vec![test_path.to_str().unwrap().to_owned()]))?; + (paths, language) + } else { + (collect_paths(self.paths_file.as_deref(), self.paths)?, None) + }; + + let max_path_length = paths.iter().map(|p| p.chars().count()).max().unwrap_or(0); + let mut has_error = false; + let loader_config = config.get()?; + loader.find_all_languages(&loader_config)?; + + let should_track_stats = self.stat; + let mut stats = parse::Stats::default(); + + for path in &paths { + let path = Path::new(&path); + + let language = if let Some(ref language) = language { + language.clone() + } else { + loader.select_language(path, ¤t_dir, self.scope.as_deref())? + }; + parser + .set_language(&language) + .context("incompatible language")?; + + let opts = ParseFileOptions { + language: language.clone(), + path, + edits: &edits + .iter() + .map(std::string::String::as_str) + .collect::>(), + max_path_length, + output, + print_time: time, + timeout, + debug: self.debug, + debug_graph: self.debug_graph, + cancellation_flag: Some(&cancellation_flag), + encoding, + open_log: self.open_log, + }; + + let parse_result = parse::parse_file_at_path(&mut parser, &opts)?; + + if should_track_stats { + stats.total_parses += 1; + if parse_result.successful { + stats.successful_parses += 1; + } + if let Some(duration) = parse_result.duration { + stats.total_bytes += parse_result.bytes; + stats.total_duration += duration; + } + } + + has_error |= !parse_result.successful; + } + + if should_track_stats { + println!("\n{stats}"); + } + + if has_error { + return Err(anyhow!("")); + } + + Ok(()) + } +} + +impl Test { + fn run(self, mut loader: loader::Loader, current_dir: PathBuf) -> Result<()> { + let config = Config::load(self.config_path)?; + let color = env::var("NO_COLOR").map_or(true, |v| v != "1"); + + loader.debug_build(self.debug_build); + loader.force_rebuild(self.rebuild); + + let mut parser = Parser::new(); + + #[cfg(feature = "wasm")] + if self.wasm { + let engine = tree_sitter::wasmtime::Engine::default(); + parser + .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) + .unwrap(); + loader.use_wasm(&engine); + } + + let languages = loader.languages_at_path(¤t_dir)?; + let language = &languages + .first() + .ok_or_else(|| anyhow!("No language found"))? + .0; + parser.set_language(language)?; + + let test_dir = current_dir.join("test"); + + // Run the corpus tests. Look for them in `test/corpus`. + let test_corpus_dir = test_dir.join("corpus"); + if test_corpus_dir.is_dir() { + let mut opts = TestOptions { + path: test_corpus_dir, + debug: self.debug, + debug_graph: self.debug_graph, + include: self.include, + exclude: self.exclude, + update: self.update, + open_log: self.open_log, + languages: languages.iter().map(|(l, n)| (n.as_str(), l)).collect(), + color, + test_num: 1, + show_fields: self.show_fields, + }; + + test::run_tests_at_path(&mut parser, &mut opts)?; + } + + // Check that all of the queries are valid. + test::check_queries_at_path(language, ¤t_dir.join("queries"))?; + + // Run the syntax highlighting tests. + let test_highlight_dir = test_dir.join("highlight"); + if test_highlight_dir.is_dir() { + let mut highlighter = Highlighter::new(); + highlighter.parser = parser; + test_highlight::test_highlights( + &loader, + &config.get()?, + &mut highlighter, + &test_highlight_dir, + color, + )?; + parser = highlighter.parser; + } + + let test_tag_dir = test_dir.join("tags"); + if test_tag_dir.is_dir() { + let mut tags_context = TagsContext::new(); + tags_context.parser = parser; + test_tags::test_tags( + &loader, + &config.get()?, + &mut tags_context, + &test_tag_dir, + color, + )?; + } + + // For the rest of the queries, find their tests and run them + for entry in walkdir::WalkDir::new(current_dir.join("queries")) + .into_iter() + .filter_map(|e| e.ok()) + .filter(|e| e.file_type().is_file()) + { + let stem = entry + .path() + .file_stem() + .map(|s| s.to_str().unwrap_or_default()) + .unwrap_or_default(); + if stem != "highlights" && stem != "tags" { + let paths = walkdir::WalkDir::new(test_dir.join(stem)) + .into_iter() + .filter_map(|e| { + let entry = e.ok()?; + if entry.file_type().is_file() { + Some(String::from(entry.path().to_string_lossy())) + } else { + None + } + }) + .collect::>(); + if !paths.is_empty() { + println!("{stem}:"); + } + query::query_files_at_paths( + language, + paths, + entry.path(), + false, + None, + None, + true, + false, + false, + )?; + } + } + Ok(()) + } +} + +impl Fuzz { + fn run(self, mut loader: loader::Loader, current_dir: PathBuf) -> Result<()> { + loader.sanitize_build(true); + loader.force_rebuild(self.rebuild); + + let languages = loader.languages_at_path(¤t_dir)?; + let (language, language_name) = &languages + .first() + .ok_or_else(|| anyhow!("No language found"))?; + + let mut fuzz_options = FuzzOptions { + skipped: self.skip, + subdir: self.subdir, + edits: self.edits.unwrap_or(*EDIT_COUNT), + iterations: self.iterations.unwrap_or(*ITERATION_COUNT), + include: self.include, + exclude: self.exclude, + log_graphs: self.log_graphs || *LOG_GRAPH_ENABLED, + log: self.log || *LOG_ENABLED, + }; + + fuzz_language_corpus( + language, + language_name, + *START_SEED, + ¤t_dir, + &mut fuzz_options, + ); + Ok(()) + } +} + +impl Query { + fn run(self, mut loader: loader::Loader, current_dir: PathBuf) -> Result<()> { + let config = Config::load(self.config_path)?; + let paths = collect_paths(self.paths_file.as_deref(), self.paths)?; + let loader_config = config.get()?; + loader.find_all_languages(&loader_config)?; + let language = + loader.select_language(Path::new(&paths[0]), ¤t_dir, self.scope.as_deref())?; + let query_path = Path::new(&self.query_path); + + let byte_range = self.byte_range.as_ref().and_then(|range| { + let mut parts = range.split(':'); + let start = parts.next()?.parse().ok()?; + let end = parts.next().unwrap().parse().ok()?; + Some(start..end) + }); + let point_range = self.row_range.as_ref().and_then(|range| { + let mut parts = range.split(':'); + let start = parts.next()?.parse().ok()?; + let end = parts.next().unwrap().parse().ok()?; + Some(Point::new(start, 0)..Point::new(end, 0)) + }); + + query::query_files_at_paths( + &language, + paths, + query_path, + self.captures, + byte_range, + point_range, + self.test, + self.quiet, + self.time, + )?; + Ok(()) + } +} + +impl Highlight { + fn run(self, mut loader: loader::Loader) -> Result<()> { + let config = Config::load(self.config_path)?; + let theme_config: tree_sitter_cli::highlight::ThemeConfig = config.get()?; + loader.configure_highlights(&theme_config.theme.highlight_names); + let loader_config = config.get()?; + loader.find_all_languages(&loader_config)?; + + let quiet = self.quiet; + let html_mode = quiet || self.html; + let paths = collect_paths(self.paths_file.as_deref(), self.paths)?; + + if html_mode && !quiet { + println!("{}", highlight::HTML_HEADER); + } + + let cancellation_flag = util::cancel_on_signal(); + + let mut language = None; + if let Some(scope) = self.scope.as_deref() { + language = loader.language_configuration_for_scope(scope)?; + if language.is_none() { + return Err(anyhow!("Unknown scope '{scope}'")); + } + } + + for path in paths { + let path = Path::new(&path); + let (language, language_config) = match language.clone() { + Some(v) => v, + None => { + if let Some(v) = loader.language_configuration_for_file_name(path)? { + v + } else { + eprintln!("{}", util::lang_not_found_for_path(path, &loader_config)); + continue; + } + } + }; + + if let Some(highlight_config) = + language_config.highlight_config(language, self.query_paths.as_deref())? + { + if self.check { + let names = if let Some(path) = self.captures_path.as_deref() { + let path = Path::new(path); + let file = fs::read_to_string(path)?; + let capture_names = file + .lines() + .filter_map(|line| { + if line.trim().is_empty() || line.trim().starts_with(';') { + return None; + } + line.split(';').next().map(|s| s.trim().trim_matches('"')) + }) + .collect::>(); + highlight_config.nonconformant_capture_names(&capture_names) + } else { + highlight_config.nonconformant_capture_names(&HashSet::new()) + }; + if names.is_empty() { + eprintln!("All highlight captures conform to standards."); + } else { + eprintln!( + "Non-standard highlight {} detected:", + if names.len() > 1 { + "captures" + } else { + "capture" + } + ); + for name in names { + eprintln!("* {name}"); + } + } + } + + let source = fs::read(path)?; + if html_mode { + highlight::html( + &loader, + &theme_config.theme, + &source, + highlight_config, + quiet, + self.time, + Some(&cancellation_flag), + )?; + } else { + highlight::ansi( + &loader, + &theme_config.theme, + &source, + highlight_config, + self.time, + Some(&cancellation_flag), + )?; + } + } else { + eprintln!("No syntax highlighting config found for path {path:?}"); + } + } + + if html_mode && !quiet { + println!("{}", highlight::HTML_FOOTER); + } + Ok(()) + } +} + +impl Tags { + fn run(self, mut loader: loader::Loader) -> Result<()> { + let config = Config::load(self.config_path)?; + let loader_config = config.get()?; + loader.find_all_languages(&loader_config)?; + let paths = collect_paths(self.paths_file.as_deref(), self.paths)?; + tags::generate_tags( + &loader, + &config.get()?, + self.scope.as_deref(), + &paths, + self.quiet, + self.time, + )?; + Ok(()) + } +} + +impl Playground { + fn run(self, current_dir: PathBuf) -> Result<()> { + let open_in_browser = !self.quiet; + let grammar_path = self.grammar_path.map_or(current_dir, PathBuf::from); + playground::serve(&grammar_path, open_in_browser)?; + Ok(()) + } +} + +impl DumpLanguages { + fn run(self, mut loader: loader::Loader) -> Result<()> { + let config = Config::load(self.config_path)?; + let loader_config = config.get()?; + loader.find_all_languages(&loader_config)?; + for (configuration, language_path) in loader.get_all_language_configurations() { + println!( + concat!( + "scope: {}\n", + "parser: {:?}\n", + "highlights: {:?}\n", + "file_types: {:?}\n", + "content_regex: {:?}\n", + "injection_regex: {:?}\n", + ), + configuration.scope.as_ref().unwrap_or(&String::new()), + language_path, + configuration.highlights_filenames, + configuration.file_types, + configuration.content_regex, + configuration.injection_regex, + ); + } + Ok(()) + } +} + +impl Complete { + fn run(self, cli: &mut Command) { + generate( + self.shell, + cli, + cli.get_name().to_string(), + &mut std::io::stdout(), + ); + } +} + +fn main() { + let result = run(); + if let Err(err) = &result { + // Ignore BrokenPipe errors + if let Some(error) = err.downcast_ref::() { + if error.kind() == std::io::ErrorKind::BrokenPipe { + return; + } + } + if !err.to_string().is_empty() { + eprintln!("{err:?}"); + } + std::process::exit(1); + } +} + +fn run() -> Result<()> { + let version = BUILD_SHA.map_or_else( + || BUILD_VERSION.to_string(), + |build_sha| format!("{BUILD_VERSION} ({build_sha})"), + ); + let version: &'static str = Box::leak(version.into_boxed_str()); + + let cli = Command::new("tree-sitter") + .help_template( + "\ +{before-help}{name} {version} +{author-with-newline}{about-with-newline} +{usage-heading} {usage} + +{all-args}{after-help} +", + ) + .version(version) + .subcommand_required(true) + .arg_required_else_help(true) + .disable_help_subcommand(true) + .disable_colored_help(false); + let mut cli = Commands::augment_subcommands(cli); + + let command = Commands::from_arg_matches(&cli.clone().get_matches())?; + + let current_dir = env::current_dir().unwrap(); + let loader = loader::Loader::new()?; + + match command { + Commands::InitConfig(init_config) => init_config.run()?, + Commands::Generate(generate_options) => generate_options.run(loader, current_dir)?, + Commands::Build(build_options) => build_options.run(loader, current_dir)?, + Commands::Parse(parse_options) => parse_options.run(loader, current_dir)?, + Commands::Test(test_options) => test_options.run(loader, current_dir)?, + Commands::Fuzz(fuzz_options) => fuzz_options.run(loader, current_dir)?, + Commands::Query(query_options) => query_options.run(loader, current_dir)?, + Commands::Highlight(highlight_options) => highlight_options.run(loader)?, + Commands::Tags(tags_options) => tags_options.run(loader)?, + Commands::Playground(playground_options) => playground_options.run(current_dir)?, + Commands::DumpLanguages(dump_options) => dump_options.run(loader)?, + Commands::Complete(complete_options) => complete_options.run(&mut cli), + } + + Ok(()) +} + +#[must_use] +const fn get_styles() -> clap::builder::Styles { + clap::builder::Styles::styled() + .usage( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Yellow))), + ) + .header( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Yellow))), + ) + .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green)))) + .invalid( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Red))), + ) + .error( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Red))), + ) + .valid( + Style::new() + .bold() + .fg_color(Some(Color::Ansi(AnsiColor::Green))), + ) + .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White)))) +} + +fn collect_paths(paths_file: Option<&str>, paths: Option>) -> Result> { + if let Some(paths_file) = paths_file { + return Ok(fs::read_to_string(paths_file) + .with_context(|| format!("Failed to read paths file {paths_file}"))? + .trim() + .lines() + .map(String::from) + .collect::>()); + } + + if let Some(paths) = paths { + let mut result = Vec::new(); + + let mut incorporate_path = |path: &str, positive| { + if positive { + result.push(path.to_string()); + } else if let Some(index) = result.iter().position(|p| p == path) { + result.remove(index); + } + }; + + for mut path in paths { + let mut positive = true; + if path.starts_with('!') { + positive = false; + path = path.trim_start_matches('!').to_string(); + } + + if Path::new(&path).exists() { + incorporate_path(&path, positive); + } else { + let paths = + glob(&path).with_context(|| format!("Invalid glob pattern {path:?}"))?; + for path in paths { + if let Some(path) = path?.to_str() { + incorporate_path(path, positive); + } + } + } + } + + if result.is_empty() { + return Err(anyhow!( + "No files were found at or matched by the provided pathname/glob" + )); + } + + return Ok(result); + } + + Err(anyhow!("Must provide one or more paths")) +} diff --git a/cli/src/parse.rs b/cli/src/parse.rs new file mode 100644 index 00000000..7c1dfc90 --- /dev/null +++ b/cli/src/parse.rs @@ -0,0 +1,482 @@ +use std::{ + fmt, fs, + io::{self, Write}, + path::Path, + sync::atomic::AtomicUsize, + time::{Duration, Instant}, +}; + +use anyhow::{anyhow, Context, Result}; +use tree_sitter::{ffi, InputEdit, Language, LogType, Parser, Point, Tree}; + +use super::util; +use crate::fuzz::edits::Edit; + +#[derive(Debug, Default)] +pub struct Stats { + pub successful_parses: usize, + pub total_parses: usize, + pub total_bytes: usize, + pub total_duration: Duration, +} + +impl fmt::Display for Stats { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let duration_us = self.total_duration.as_micros(); + writeln!( + f, + "Total parses: {}; successful parses: {}; failed parses: {}; success percentage: {:.2}%; average speed: {} bytes/ms", + self.total_parses, + self.successful_parses, + self.total_parses - self.successful_parses, + ((self.successful_parses as f64) / (self.total_parses as f64)) * 100.0, + if duration_us != 0 { + ((self.total_bytes as u128) * 1_000) / duration_us + } else { + 0 + } + ) + } +} + +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum ParseOutput { + Normal, + Quiet, + Xml, + Dot, +} + +pub struct ParseFileOptions<'a> { + pub language: Language, + pub path: &'a Path, + pub edits: &'a [&'a str], + pub max_path_length: usize, + pub output: ParseOutput, + pub print_time: bool, + pub timeout: u64, + pub debug: bool, + pub debug_graph: bool, + pub cancellation_flag: Option<&'a AtomicUsize>, + pub encoding: Option, + pub open_log: bool, +} + +#[derive(Copy, Clone)] +pub struct ParseResult { + pub successful: bool, + pub bytes: usize, + pub duration: Option, +} + +pub fn parse_file_at_path(parser: &mut Parser, opts: &ParseFileOptions) -> Result { + let mut _log_session = None; + parser.set_language(&opts.language)?; + let mut source_code = fs::read(opts.path) + .with_context(|| format!("Error reading source file {:?}", opts.path))?; + + // If the `--cancel` flag was passed, then cancel the parse + // when the user types a newline. + unsafe { parser.set_cancellation_flag(opts.cancellation_flag) }; + + // Set a timeout based on the `--time` flag. + parser.set_timeout_micros(opts.timeout); + + // Render an HTML graph if `--debug-graph` was passed + if opts.debug_graph { + _log_session = Some(util::log_graphs(parser, "log.html", opts.open_log)?); + } + // Log to stderr if `--debug` was passed + else if opts.debug { + parser.set_logger(Some(Box::new(|log_type, message| { + if log_type == LogType::Lex { + io::stderr().write_all(b" ").unwrap(); + } + writeln!(&mut io::stderr(), "{message}").unwrap(); + }))); + } + + let time = Instant::now(); + + #[inline(always)] + fn is_utf16_bom(bom_bytes: &[u8]) -> bool { + bom_bytes == [0xFF, 0xFE] || bom_bytes == [0xFE, 0xFF] + } + + let tree = match opts.encoding { + Some(encoding) if encoding == ffi::TSInputEncodingUTF16 => { + let source_code_utf16 = source_code + .chunks_exact(2) + .map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]])) + .collect::>(); + parser.parse_utf16(&source_code_utf16, None) + } + None if source_code.len() >= 2 && is_utf16_bom(&source_code[0..2]) => { + let source_code_utf16 = source_code + .chunks_exact(2) + .map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]])) + .collect::>(); + parser.parse_utf16(&source_code_utf16, None) + } + _ => parser.parse(&source_code, None), + }; + + parser.stop_printing_dot_graphs(); + + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + + if let Some(mut tree) = tree { + if opts.debug_graph && !opts.edits.is_empty() { + println!("BEFORE:\n{}", String::from_utf8_lossy(&source_code)); + } + + for (i, edit) in opts.edits.iter().enumerate() { + let edit = parse_edit_flag(&source_code, edit)?; + perform_edit(&mut tree, &mut source_code, &edit)?; + tree = parser.parse(&source_code, Some(&tree)).unwrap(); + + if opts.debug_graph { + println!("AFTER {i}:\n{}", String::from_utf8_lossy(&source_code)); + } + } + + let duration = time.elapsed(); + let duration_ms = duration.as_micros() as f64 / 1e3; + let mut cursor = tree.walk(); + + if opts.output == ParseOutput::Normal { + let mut needs_newline = false; + let mut indent_level = 0; + let mut did_visit_children = false; + loop { + let node = cursor.node(); + let is_named = node.is_named(); + if did_visit_children { + if is_named { + stdout.write_all(b")")?; + needs_newline = true; + } + if cursor.goto_next_sibling() { + did_visit_children = false; + } else if cursor.goto_parent() { + did_visit_children = true; + indent_level -= 1; + } else { + break; + } + } else { + if is_named { + if needs_newline { + stdout.write_all(b"\n")?; + } + for _ in 0..indent_level { + stdout.write_all(b" ")?; + } + let start = node.start_position(); + let end = node.end_position(); + if let Some(field_name) = cursor.field_name() { + write!(&mut stdout, "{field_name}: ")?; + } + write!( + &mut stdout, + "({} [{}, {}] - [{}, {}]", + node.kind(), + start.row, + start.column, + end.row, + end.column + )?; + needs_newline = true; + } + if cursor.goto_first_child() { + did_visit_children = false; + indent_level += 1; + } else { + did_visit_children = true; + } + } + } + cursor.reset(tree.root_node()); + println!(); + } + + if opts.output == ParseOutput::Xml { + let mut needs_newline = false; + let mut indent_level = 0; + let mut did_visit_children = false; + let mut had_named_children = false; + let mut tags = Vec::<&str>::new(); + writeln!(&mut stdout, "")?; + loop { + let node = cursor.node(); + let is_named = node.is_named(); + if did_visit_children { + if is_named { + let tag = tags.pop(); + if had_named_children { + for _ in 0..indent_level { + stdout.write_all(b" ")?; + } + } + write!(&mut stdout, "", tag.expect("there is a tag"))?; + // we only write a line in the case where it's the last sibling + if let Some(parent) = node.parent() { + if parent.child(parent.child_count() - 1).unwrap() == node { + stdout.write_all(b"\n")?; + } + } + needs_newline = true; + } + if cursor.goto_next_sibling() { + did_visit_children = false; + had_named_children = false; + } else if cursor.goto_parent() { + did_visit_children = true; + had_named_children = is_named; + indent_level -= 1; + if !is_named && needs_newline { + stdout.write_all(b"\n")?; + for _ in 0..indent_level { + stdout.write_all(b" ")?; + } + } + } else { + break; + } + } else { + if is_named { + if needs_newline { + stdout.write_all(b"\n")?; + } + for _ in 0..indent_level { + stdout.write_all(b" ")?; + } + write!(&mut stdout, "<{}", node.kind())?; + if let Some(field_name) = cursor.field_name() { + write!(&mut stdout, " field=\"{field_name}\"")?; + } + let start = node.start_position(); + let end = node.end_position(); + write!(&mut stdout, " srow=\"{}\"", start.row)?; + write!(&mut stdout, " scol=\"{}\"", start.column)?; + write!(&mut stdout, " erow=\"{}\"", end.row)?; + write!(&mut stdout, " ecol=\"{}\"", end.column)?; + write!(&mut stdout, ">")?; + tags.push(node.kind()); + needs_newline = true; + } + if cursor.goto_first_child() { + did_visit_children = false; + had_named_children = false; + indent_level += 1; + } else { + did_visit_children = true; + let start = node.start_byte(); + let end = node.end_byte(); + let value = + std::str::from_utf8(&source_code[start..end]).expect("has a string"); + // if !is_named { + // for _ in 0..indent_level { + // stdout.write_all(b" ")?; + // } + // } + if !is_named && needs_newline { + stdout.write_all(b"\n")?; + for _ in 0..indent_level { + stdout.write_all(b" ")?; + } + } + write!(&mut stdout, "{}", html_escape::encode_text(value))?; + } + } + } + cursor.reset(tree.root_node()); + println!(); + } + + if opts.output == ParseOutput::Dot { + util::print_tree_graph(&tree, "log.html", opts.open_log).unwrap(); + } + + let mut first_error = None; + loop { + let node = cursor.node(); + if node.has_error() { + if node.is_error() || node.is_missing() { + first_error = Some(node); + break; + } + if !cursor.goto_first_child() { + break; + } + } else if !cursor.goto_next_sibling() { + break; + } + } + + if first_error.is_some() || opts.print_time { + write!( + &mut stdout, + "{:width$}\t{duration_ms:>7.2} ms\t{:>6} bytes/ms", + opts.path.to_str().unwrap(), + (source_code.len() as u128 * 1_000_000) / duration.as_nanos(), + width = opts.max_path_length + )?; + if let Some(node) = first_error { + let start = node.start_position(); + let end = node.end_position(); + write!(&mut stdout, "\t(")?; + if node.is_missing() { + if node.is_named() { + write!(&mut stdout, "MISSING {}", node.kind())?; + } else { + write!( + &mut stdout, + "MISSING \"{}\"", + node.kind().replace('\n', "\\n") + )?; + } + } else { + write!(&mut stdout, "{}", node.kind())?; + } + write!( + &mut stdout, + " [{}, {}] - [{}, {}])", + start.row, start.column, end.row, end.column + )?; + } + writeln!(&mut stdout)?; + } + + return Ok(ParseResult { + successful: first_error.is_none(), + bytes: source_code.len(), + duration: Some(duration), + }); + } + + if opts.print_time { + let duration = time.elapsed(); + let duration_ms = duration.as_micros() as f64 / 1e3; + writeln!( + &mut stdout, + "{:width$}\t{duration_ms:>7.2} ms\t(timed out)", + opts.path.to_str().unwrap(), + width = opts.max_path_length + )?; + } + + Ok(ParseResult { + successful: false, + bytes: source_code.len(), + duration: None, + }) +} + +pub fn perform_edit(tree: &mut Tree, input: &mut Vec, edit: &Edit) -> Result { + let start_byte = edit.position; + let old_end_byte = edit.position + edit.deleted_length; + let new_end_byte = edit.position + edit.inserted_text.len(); + let start_position = position_for_offset(input, start_byte)?; + let old_end_position = position_for_offset(input, old_end_byte)?; + input.splice(start_byte..old_end_byte, edit.inserted_text.iter().copied()); + let new_end_position = position_for_offset(input, new_end_byte)?; + let edit = InputEdit { + start_byte, + old_end_byte, + new_end_byte, + start_position, + old_end_position, + new_end_position, + }; + tree.edit(&edit); + Ok(edit) +} + +fn parse_edit_flag(source_code: &[u8], flag: &str) -> Result { + let error = || { + anyhow!(concat!( + "Invalid edit string '{}'. ", + "Edit strings must match the pattern ' '" + ), flag) + }; + + // Three whitespace-separated parts: + // * edit position + // * deleted length + // * inserted text + let mut parts = flag.split(' '); + let position = parts.next().ok_or_else(error)?; + let deleted_length = parts.next().ok_or_else(error)?; + let inserted_text = parts.collect::>().join(" ").into_bytes(); + + // Position can either be a byte_offset or row,column pair, separated by a comma + let position = if position == "$" { + source_code.len() + } else if position.contains(',') { + let mut parts = position.split(','); + let row = parts.next().ok_or_else(error)?; + let row = row.parse::().map_err(|_| error())?; + let column = parts.next().ok_or_else(error)?; + let column = column.parse::().map_err(|_| error())?; + offset_for_position(source_code, Point { row, column })? + } else { + position.parse::().map_err(|_| error())? + }; + + // Deleted length must be a byte count. + let deleted_length = deleted_length.parse::().map_err(|_| error())?; + + Ok(Edit { + position, + deleted_length, + inserted_text, + }) +} + +pub fn offset_for_position(input: &[u8], position: Point) -> Result { + let mut row = 0; + let mut offset = 0; + let mut iter = memchr::memchr_iter(b'\n', input); + loop { + if let Some(pos) = iter.next() { + if row < position.row { + row += 1; + offset = pos; + continue; + } + } + offset += 1; + break; + } + if position.row - row > 0 { + return Err(anyhow!("Failed to address a row: {}", position.row)); + } + if let Some(pos) = iter.next() { + if (pos - offset < position.column) || (input[offset] == b'\n' && position.column > 0) { + return Err(anyhow!("Failed to address a column: {}", position.column)); + }; + } else if input.len() - offset < position.column { + return Err(anyhow!("Failed to address a column over the end")); + } + Ok(offset + position.column) +} + +pub fn position_for_offset(input: &[u8], offset: usize) -> Result { + if offset > input.len() { + return Err(anyhow!("Failed to address an offset: {offset}")); + } + let mut result = Point { row: 0, column: 0 }; + let mut last = 0; + for pos in memchr::memchr_iter(b'\n', &input[..offset]) { + result.row += 1; + last = pos; + } + result.column = if result.row > 0 { + offset - last - 1 + } else { + offset + }; + Ok(result) +} diff --git a/cli/src/playground.html b/cli/src/playground.html new file mode 100644 index 00000000..420cd28d --- /dev/null +++ b/cli/src/playground.html @@ -0,0 +1,176 @@ + + + tree-sitter THE_LANGUAGE_NAME + + + + + + + +

+ + + + + + + + + + + + diff --git a/crates/cli/src/playground.rs b/cli/src/playground.rs similarity index 59% rename from crates/cli/src/playground.rs rename to cli/src/playground.rs index f2c04fed..12348b40 100644 --- a/crates/cli/src/playground.rs +++ b/cli/src/playground.rs @@ -7,7 +7,6 @@ use std::{ }; use anyhow::{anyhow, Context, Result}; -use log::{error, info}; use tiny_http::{Header, Response, Server}; use super::wasm; @@ -19,7 +18,7 @@ macro_rules! optional_resource { if let Some(tree_sitter_dir) = tree_sitter_dir { Cow::Owned(fs::read(tree_sitter_dir.join($path)).unwrap()) } else { - Cow::Borrowed(include_bytes!(concat!("../../../", $path))) + Cow::Borrowed(include_bytes!(concat!("../../", $path))) } } @@ -34,92 +33,26 @@ macro_rules! optional_resource { }; } -optional_resource!(get_playground_js, "docs/src/assets/js/playground.js"); -optional_resource!(get_lib_js, "lib/binding_web/web-tree-sitter.js"); -optional_resource!(get_lib_wasm, "lib/binding_web/web-tree-sitter.wasm"); +optional_resource!(get_playground_js, "docs/assets/js/playground.js"); +optional_resource!(get_lib_js, "lib/binding_web/tree-sitter.js"); +optional_resource!(get_lib_wasm, "lib/binding_web/tree-sitter.wasm"); fn get_main_html(tree_sitter_dir: Option<&Path>) -> Cow<'static, [u8]> { tree_sitter_dir.map_or( Cow::Borrowed(include_bytes!("playground.html")), |tree_sitter_dir| { - Cow::Owned(fs::read(tree_sitter_dir.join("crates/cli/src/playground.html")).unwrap()) + Cow::Owned(fs::read(tree_sitter_dir.join("cli/src/playground.html")).unwrap()) }, ) } -pub fn export(grammar_path: &Path, export_path: &Path) -> Result<()> { - let (grammar_name, language_wasm) = wasm::load_language_wasm_file(grammar_path)?; - - fs::create_dir_all(export_path).with_context(|| { - format!( - "Failed to create export directory: {}", - export_path.display() - ) - })?; - - let tree_sitter_dir = env::var("TREE_SITTER_BASE_DIR").map(PathBuf::from).ok(); - - let playground_js = get_playground_js(tree_sitter_dir.as_deref()); - let lib_js = get_lib_js(tree_sitter_dir.as_deref()); - let lib_wasm = get_lib_wasm(tree_sitter_dir.as_deref()); - - let has_local_playground_js = !playground_js.is_empty(); - let has_local_lib_js = !lib_js.is_empty(); - let has_local_lib_wasm = !lib_wasm.is_empty(); - - let mut main_html = str::from_utf8(&get_main_html(tree_sitter_dir.as_deref())) - .unwrap() - .replace("THE_LANGUAGE_NAME", &grammar_name); - - if !has_local_playground_js { - main_html = main_html.replace( - r#""#, - r#""# - ); - } - if !has_local_lib_js { - main_html = main_html.replace( - "import * as TreeSitter from './web-tree-sitter.js';", - "import * as TreeSitter from 'https://tree-sitter.github.io/web-tree-sitter.js';", - ); - } - - fs::write(export_path.join("index.html"), main_html.as_bytes()) - .with_context(|| "Failed to write index.html")?; - - fs::write(export_path.join("tree-sitter-parser.wasm"), language_wasm) - .with_context(|| "Failed to write parser wasm file")?; - - if has_local_playground_js { - fs::write(export_path.join("playground.js"), playground_js) - .with_context(|| "Failed to write playground.js")?; - } - - if has_local_lib_js { - fs::write(export_path.join("web-tree-sitter.js"), lib_js) - .with_context(|| "Failed to write web-tree-sitter.js")?; - } - - if has_local_lib_wasm { - fs::write(export_path.join("web-tree-sitter.wasm"), lib_wasm) - .with_context(|| "Failed to write web-tree-sitter.wasm")?; - } - - println!( - "Exported playground to {}", - export_path.canonicalize()?.display() - ); - - Ok(()) -} - pub fn serve(grammar_path: &Path, open_in_browser: bool) -> Result<()> { let server = get_server()?; let (grammar_name, language_wasm) = wasm::load_language_wasm_file(grammar_path)?; let url = format!("http://{}", server.server_addr()); - info!("Started playground on: {url}"); + println!("Started playground on: {url}"); if open_in_browser && webbrowser::open(&url).is_err() { - error!("Failed to open '{url}' in a web browser"); + eprintln!("Failed to open '{url}' in a web browser"); } let tree_sitter_dir = env::var("TREE_SITTER_BASE_DIR").map(PathBuf::from).ok(); @@ -146,16 +79,16 @@ pub fn serve(grammar_path: &Path, open_in_browser: bool) -> Result<()> { response(&playground_js, &js_header) } } - "/web-tree-sitter.js" => { + "/tree-sitter.js" => { if lib_js.is_empty() { - redirect("https://tree-sitter.github.io/web-tree-sitter.js") + redirect("https://tree-sitter.github.io/tree-sitter.js") } else { response(&lib_js, &js_header) } } - "/web-tree-sitter.wasm" => { + "/tree-sitter.wasm" => { if lib_wasm.is_empty() { - redirect("https://tree-sitter.github.io/web-tree-sitter.wasm") + redirect("https://tree-sitter.github.io/tree-sitter.wasm") } else { response(&lib_wasm, &wasm_header) } diff --git a/cli/src/query.rs b/cli/src/query.rs new file mode 100644 index 00000000..085fb967 --- /dev/null +++ b/cli/src/query.rs @@ -0,0 +1,143 @@ +use std::{ + fs, + io::{self, Write}, + ops::Range, + path::Path, + time::Instant, +}; + +use anstyle::AnsiColor; +use anyhow::{Context, Result}; +use tree_sitter::{Language, Parser, Point, Query, QueryCursor}; + +use crate::{ + query_testing::{self, to_utf8_point}, + test::paint, +}; + +#[allow(clippy::too_many_arguments)] +pub fn query_files_at_paths( + language: &Language, + paths: Vec, + query_path: &Path, + ordered_captures: bool, + byte_range: Option>, + point_range: Option>, + should_test: bool, + quiet: bool, + print_time: bool, +) -> Result<()> { + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + + let query_source = fs::read_to_string(query_path) + .with_context(|| format!("Error reading query file {query_path:?}"))?; + let query = Query::new(language, &query_source).with_context(|| "Query compilation failed")?; + + let mut query_cursor = QueryCursor::new(); + if let Some(range) = byte_range { + query_cursor.set_byte_range(range); + } + if let Some(range) = point_range { + query_cursor.set_point_range(range); + } + + let mut parser = Parser::new(); + parser.set_language(language)?; + + for path in paths { + let mut results = Vec::new(); + + if !should_test { + writeln!(&mut stdout, "{path}")?; + } + + let source_code = + fs::read(&path).with_context(|| format!("Error reading source file {path:?}"))?; + let tree = parser.parse(&source_code, None).unwrap(); + + let start = Instant::now(); + if ordered_captures { + for (mat, capture_index) in + query_cursor.captures(&query, tree.root_node(), source_code.as_slice()) + { + let capture = mat.captures[capture_index]; + let capture_name = &query.capture_names()[capture.index as usize]; + if !quiet && !should_test { + writeln!( + &mut stdout, + " pattern: {:>2}, capture: {} - {capture_name}, start: {}, end: {}, text: `{}`", + mat.pattern_index, + capture.index, + capture.node.start_position(), + capture.node.end_position(), + capture.node.utf8_text(&source_code).unwrap_or("") + )?; + } + results.push(query_testing::CaptureInfo { + name: (*capture_name).to_string(), + start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), + end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), + }); + } + } else { + for m in query_cursor.matches(&query, tree.root_node(), source_code.as_slice()) { + if !quiet && !should_test { + writeln!(&mut stdout, " pattern: {}", m.pattern_index)?; + } + for capture in m.captures { + let start = capture.node.start_position(); + let end = capture.node.end_position(); + let capture_name = &query.capture_names()[capture.index as usize]; + if !quiet && !should_test { + if end.row == start.row { + writeln!( + &mut stdout, + " capture: {} - {capture_name}, start: {start}, end: {end}, text: `{}`", + capture.index, + capture.node.utf8_text(&source_code).unwrap_or("") + )?; + } else { + writeln!( + &mut stdout, + " capture: {capture_name}, start: {start}, end: {end}", + )?; + } + } + results.push(query_testing::CaptureInfo { + name: (*capture_name).to_string(), + start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), + end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), + }); + } + } + } + if query_cursor.did_exceed_match_limit() { + writeln!( + &mut stdout, + " WARNING: Query exceeded maximum number of in-progress captures!" + )?; + } + if should_test { + let path_name = Path::new(&path).file_name().unwrap().to_str().unwrap(); + match query_testing::assert_expected_captures(&results, &path, &mut parser, language) { + Ok(assertion_count) => { + println!( + " ✓ {} ({} assertions)", + paint(Some(AnsiColor::Green), path_name), + assertion_count + ); + } + Err(e) => { + println!(" ✗ {}", paint(Some(AnsiColor::Red), path_name)); + return Err(e); + } + } + } + if print_time { + writeln!(&mut stdout, "{:?}", start.elapsed())?; + } + } + + Ok(()) +} diff --git a/crates/cli/src/query_testing.rs b/cli/src/query_testing.rs similarity index 80% rename from crates/cli/src/query_testing.rs rename to cli/src/query_testing.rs index e4923d65..2791d815 100644 --- a/crates/cli/src/query_testing.rs +++ b/cli/src/query_testing.rs @@ -1,11 +1,14 @@ -use std::{fs, path::Path, sync::LazyLock}; +use std::fs; use anyhow::{anyhow, Result}; use bstr::{BStr, ByteSlice}; +use lazy_static::lazy_static; use regex::Regex; use tree_sitter::{Language, Parser, Point}; -static CAPTURE_NAME_REGEX: LazyLock = LazyLock::new(|| Regex::new("[\\w_\\-.]+").unwrap()); +lazy_static! { + static ref CAPTURE_NAME_REGEX: Regex = Regex::new("[\\w_\\-.]+").unwrap(); +} #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct Utf8Point { @@ -20,13 +23,11 @@ impl std::fmt::Display for Utf8Point { } impl Utf8Point { - #[must_use] pub const fn new(row: usize, column: usize) -> Self { Self { row, column } } } -#[must_use] pub fn to_utf8_point(point: Point, source: &[u8]) -> Utf8Point { if point.column == 0 { return Utf8Point::new(point.row, 0); @@ -59,7 +60,6 @@ pub struct CaptureInfo { #[derive(Debug, PartialEq, Eq)] pub struct Assertion { pub position: Utf8Point, - pub length: usize, pub negative: bool, pub expected_capture_name: String, } @@ -69,13 +69,11 @@ impl Assertion { pub const fn new( row: usize, col: usize, - length: usize, negative: bool, expected_capture_name: String, ) -> Self { Self { position: Utf8Point::new(row, col), - length, negative, expected_capture_name, } @@ -117,7 +115,6 @@ pub fn parse_position_comments( let mut has_arrow = false; let mut negative = false; let mut arrow_end = 0; - let mut arrow_count = 1; for (i, c) in text.char_indices() { arrow_end = i + 1; if c == '-' && has_left_caret { @@ -127,14 +124,6 @@ pub fn parse_position_comments( if c == '^' { has_arrow = true; position.column += i; - // Continue counting remaining arrows and update their end column - for (_, c) in text[arrow_end..].char_indices() { - if c != '^' { - arrow_end += arrow_count - 1; - break; - } - arrow_count += 1; - } break; } has_left_caret = c == '<'; @@ -161,7 +150,6 @@ pub fn parse_position_comments( assertion_ranges.push((node.start_position(), node.end_position())); result.push(Assertion { position: to_utf8_point(position, source), - length: arrow_count, negative, expected_capture_name: mat.as_str().to_string(), }); @@ -187,21 +175,13 @@ pub fn parse_position_comments( let mut i = 0; let lines = source.lines_with_terminator().collect::>(); for assertion in &mut result { - let original_position = assertion.position; loop { let on_assertion_line = assertion_ranges[i..] .iter() .any(|(start, _)| start.row == assertion.position.row); let on_empty_line = lines[assertion.position.row].len() <= assertion.position.column; if on_assertion_line || on_empty_line { - if assertion.position.row > 0 { - assertion.position.row -= 1; - } else { - return Err(anyhow!( - "Error: could not find a line that corresponds to the assertion `{}` located at {original_position}", - assertion.expected_capture_name - )); - } + assertion.position.row -= 1; } else { while i < assertion_ranges.len() && assertion_ranges[i].0.row < assertion.position.row @@ -221,32 +201,30 @@ pub fn parse_position_comments( pub fn assert_expected_captures( infos: &[CaptureInfo], - path: &Path, + path: &str, parser: &mut Parser, language: &Language, ) -> Result { let contents = fs::read_to_string(path)?; let pairs = parse_position_comments(parser, language, contents.as_bytes())?; for assertion in &pairs { - if let Some(found) = &infos.iter().find(|p| { - assertion.position >= p.start - && (assertion.position.row < p.end.row - || assertion.position.column + assertion.length - 1 < p.end.column) - }) { + if let Some(found) = &infos + .iter() + .find(|p| assertion.position >= p.start && assertion.position < p.end) + { if assertion.expected_capture_name != found.name && found.name != "name" { return Err(anyhow!( "Assertion failed: at {}, found {}, expected {}", found.start, - found.name, assertion.expected_capture_name, + found.name )); } } else { return Err(anyhow!( - "Assertion failed: could not match {} at row {}, column {}", + "Assertion failed: could not match {} at {}", assertion.expected_capture_name, - assertion.position.row, - assertion.position.column + assertion.length - 1, + assertion.position )); } } diff --git a/cli/src/tags.rs b/cli/src/tags.rs new file mode 100644 index 00000000..4e2058c7 --- /dev/null +++ b/cli/src/tags.rs @@ -0,0 +1,98 @@ +use std::{ + fs, + io::{self, Write}, + path::Path, + str, + time::Instant, +}; + +use anyhow::{anyhow, Result}; +use tree_sitter_loader::{Config, Loader}; +use tree_sitter_tags::TagsContext; + +use super::util; + +pub fn generate_tags( + loader: &Loader, + loader_config: &Config, + scope: Option<&str>, + paths: &[String], + quiet: bool, + time: bool, +) -> Result<()> { + let mut lang = None; + if let Some(scope) = scope { + lang = loader.language_configuration_for_scope(scope)?; + if lang.is_none() { + return Err(anyhow!("Unknown scope '{scope}'")); + } + } + + let mut context = TagsContext::new(); + let cancellation_flag = util::cancel_on_signal(); + let stdout = io::stdout(); + let mut stdout = stdout.lock(); + + for path in paths { + let path = Path::new(&path); + let (language, language_config) = match lang.clone() { + Some(v) => v, + None => { + if let Some(v) = loader.language_configuration_for_file_name(path)? { + v + } else { + eprintln!("{}", util::lang_not_found_for_path(path, loader_config)); + continue; + } + } + }; + + if let Some(tags_config) = language_config.tags_config(language)? { + let indent = if paths.len() > 1 { + if !quiet { + writeln!(&mut stdout, "{}", path.to_string_lossy())?; + } + "\t" + } else { + "" + }; + + let source = fs::read(path)?; + let t0 = Instant::now(); + for tag in context + .generate_tags(tags_config, &source, Some(&cancellation_flag))? + .0 + { + let tag = tag?; + if !quiet { + write!( + &mut stdout, + "{indent}{:<10}\t | {:<8}\t{} {} - {} `{}`", + str::from_utf8(&source[tag.name_range]).unwrap_or(""), + &tags_config.syntax_type_name(tag.syntax_type_id), + if tag.is_definition { "def" } else { "ref" }, + tag.span.start, + tag.span.end, + str::from_utf8(&source[tag.line_range]).unwrap_or(""), + )?; + if let Some(docs) = tag.docs { + if docs.len() > 120 { + write!(&mut stdout, "\t{:?}...", docs.get(0..120).unwrap_or(""))?; + } else { + write!(&mut stdout, "\t{:?}", &docs)?; + } + } + writeln!(&mut stdout)?; + } + } + + if time { + writeln!(&mut stdout, "{indent}time: {}ms", t0.elapsed().as_millis(),)?; + } + } else { + eprintln!("No tags config found for path {path:?}"); + } + } + + Ok(()) +} diff --git a/cli/src/test.rs b/cli/src/test.rs new file mode 100644 index 00000000..dbff512e --- /dev/null +++ b/cli/src/test.rs @@ -0,0 +1,1468 @@ +use std::{ + collections::BTreeMap, + ffi::OsStr, + fs, + io::{self, Write}, + path::{Path, PathBuf}, + str, +}; + +use anstyle::{AnsiColor, Color, Style}; +use anyhow::{anyhow, Context, Result}; +use indoc::indoc; +use lazy_static::lazy_static; +use regex::{ + bytes::{Regex as ByteRegex, RegexBuilder as ByteRegexBuilder}, + Regex, +}; +use similar::{ChangeTag, TextDiff}; +use tree_sitter::{format_sexp, Language, LogType, Parser, Query}; +use walkdir::WalkDir; + +use super::util; + +lazy_static! { + static ref HEADER_REGEX: ByteRegex = ByteRegexBuilder::new( + r"^(?x) + (?P(?:=+){3,}) + (?P[^=\r\n][^\r\n]*)? + \r?\n + (?P(?:[^=][^\r\n]*\r?\n)+) + ===+ + (?P[^=\r\n][^\r\n]*)?\r?\n" + ) + .multi_line(true) + .build() + .unwrap(); + static ref DIVIDER_REGEX: ByteRegex = + ByteRegexBuilder::new(r"^(?P(?:-+){3,})(?P[^-\r\n][^\r\n]*)?\r?\n") + .multi_line(true) + .build() + .unwrap(); + static ref COMMENT_REGEX: Regex = Regex::new(r"(?m)^\s*;.*$").unwrap(); + static ref WHITESPACE_REGEX: Regex = Regex::new(r"\s+").unwrap(); + static ref SEXP_FIELD_REGEX: Regex = Regex::new(r" \w+: \(").unwrap(); + static ref POINT_REGEX: Regex = Regex::new(r"\s*\[\s*\d+\s*,\s*\d+\s*\]\s*").unwrap(); +} + +#[derive(Debug, PartialEq, Eq)] +pub enum TestEntry { + Group { + name: String, + children: Vec, + file_path: Option, + }, + Example { + name: String, + input: Vec, + output: String, + header_delim_len: usize, + divider_delim_len: usize, + has_fields: bool, + attributes_str: String, + attributes: TestAttributes, + }, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestAttributes { + pub skip: bool, + pub platform: bool, + pub fail_fast: bool, + pub error: bool, + pub languages: Vec>, +} + +impl Default for TestEntry { + fn default() -> Self { + Self::Group { + name: String::new(), + children: Vec::new(), + file_path: None, + } + } +} + +impl Default for TestAttributes { + fn default() -> Self { + Self { + skip: false, + platform: true, + fail_fast: false, + error: false, + languages: vec!["".into()], + } + } +} + +pub struct TestOptions<'a> { + pub path: PathBuf, + pub debug: bool, + pub debug_graph: bool, + pub include: Option, + pub exclude: Option, + pub update: bool, + pub open_log: bool, + pub languages: BTreeMap<&'a str, &'a Language>, + pub color: bool, + pub test_num: usize, + pub show_fields: bool, +} + +pub fn run_tests_at_path(parser: &mut Parser, opts: &mut TestOptions) -> Result<()> { + let test_entry = parse_tests(&opts.path)?; + let mut _log_session = None; + + if opts.debug_graph { + _log_session = Some(util::log_graphs(parser, "log.html", opts.open_log)?); + } else if opts.debug { + parser.set_logger(Some(Box::new(|log_type, message| { + if log_type == LogType::Lex { + io::stderr().write_all(b" ").unwrap(); + } + writeln!(&mut io::stderr(), "{message}").unwrap(); + }))); + } + + let mut failures = Vec::new(); + let mut corrected_entries = Vec::new(); + let mut has_parse_errors = false; + run_tests( + parser, + test_entry, + opts, + 0, + &mut failures, + &mut corrected_entries, + &mut has_parse_errors, + )?; + + parser.stop_printing_dot_graphs(); + + if failures.is_empty() { + Ok(()) + } else { + println!(); + + if opts.update && !has_parse_errors { + if failures.len() == 1 { + println!("1 update:\n"); + } else { + println!("{} updates:\n", failures.len()); + } + + for (i, (name, ..)) in failures.iter().enumerate() { + println!(" {}. {name}", i + 1); + } + + Ok(()) + } else { + has_parse_errors = opts.update && has_parse_errors; + + if !has_parse_errors { + if failures.len() == 1 { + println!("1 failure:"); + } else { + println!("{} failures:", failures.len()); + } + } + + if opts.color { + print_diff_key(); + } + for (i, (name, actual, expected)) in failures.iter().enumerate() { + if expected == "NO ERROR" { + println!("\n {}. {name}:\n", i + 1); + println!(" Expected an ERROR node, but got:"); + println!( + " {}", + paint( + opts.color.then_some(AnsiColor::Red), + &format_sexp(actual, 2) + ) + ); + } else { + println!("\n {}. {name}:", i + 1); + let actual = format_sexp(actual, 2); + let expected = format_sexp(expected, 2); + print_diff(&actual, &expected, opts.color); + } + } + + if has_parse_errors { + Err(anyhow!(indoc! {" + Some tests failed to parse with unexpected `ERROR` or `MISSING` nodes, as shown above, and cannot be updated automatically. + Either fix the grammar or manually update the tests if this is expected."})) + } else { + Err(anyhow!("")) + } + } + } +} + +#[allow(clippy::type_complexity)] +pub fn get_test_info<'test>( + test_entry: &'test TestEntry, + target_test: u32, + test_num: &mut u32, +) -> Option<(&'test str, &'test [u8], Vec>)> { + match test_entry { + TestEntry::Example { + name, + input, + attributes, + .. + } => { + if *test_num == target_test { + return Some((name, input, attributes.languages.clone())); + } + *test_num += 1; + } + TestEntry::Group { children, .. } => { + for child in children { + if let Some((name, input, languages)) = get_test_info(child, target_test, test_num) + { + return Some((name, input, languages)); + } + } + } + } + + None +} + +/// Writes the input of `target_test` to a temporary file and returns the path +pub fn get_tmp_test_file(target_test: u32, color: bool) -> Result<(PathBuf, Vec>)> { + let current_dir = std::env::current_dir().unwrap(); + let test_dir = current_dir.join("test").join("corpus"); + + // Get the input of the target test + let test_entry = parse_tests(&test_dir)?; + let mut test_num = 0; + let Some((test_name, test_contents, languages)) = + get_test_info(&test_entry, target_test - 1, &mut test_num) + else { + return Err(anyhow!("Failed to fetch contents of test #{target_test}")); + }; + + // Write the test contents to a temporary file + let test_path = std::env::temp_dir().join(".tree-sitter-test"); + let mut test_file = std::fs::File::create(&test_path)?; + test_file.write_all(test_contents)?; + + println!( + "{target_test}. {}\n", + paint(color.then_some(AnsiColor::Green), test_name) + ); + + Ok((test_path, languages)) +} + +pub fn check_queries_at_path(language: &Language, path: &Path) -> Result<()> { + if path.exists() { + for entry in WalkDir::new(path) + .into_iter() + .filter_map(std::result::Result::ok) + .filter(|e| { + e.file_type().is_file() + && e.path().extension().and_then(OsStr::to_str) == Some("scm") + && !e.path().starts_with(".") + }) + { + let filepath = entry.file_name().to_str().unwrap_or(""); + let content = fs::read_to_string(entry.path()) + .with_context(|| format!("Error reading query file {filepath:?}"))?; + Query::new(language, &content) + .with_context(|| format!("Error in query file {filepath:?}"))?; + } + } + Ok(()) +} + +pub fn print_diff_key() { + println!( + "\ncorrect / {} / {}", + paint(Some(AnsiColor::Green), "expected"), + paint(Some(AnsiColor::Red), "unexpected") + ); +} + +pub fn print_diff(actual: &str, expected: &str, use_color: bool) { + let diff = TextDiff::from_lines(actual, expected); + for diff in diff.iter_all_changes() { + match diff.tag() { + ChangeTag::Equal => { + if use_color { + print!("{diff}"); + } else { + print!(" {diff}"); + } + } + ChangeTag::Insert => { + if use_color { + print!("{}", paint(Some(AnsiColor::Green), diff.as_str().unwrap())); + } else { + print!("+{diff}"); + } + if diff.missing_newline() { + println!(); + } + } + ChangeTag::Delete => { + if use_color { + print!("{}", paint(Some(AnsiColor::Red), diff.as_str().unwrap())); + } else { + print!("-{diff}"); + } + if diff.missing_newline() { + println!(); + } + } + } + } + + println!(); +} + +pub fn paint(color: Option, text: &str) -> String { + let style = Style::new().fg_color(color.map(Color::Ansi)); + format!("{style}{text}{style:#}") +} + +/// This will return false if we want to "fail fast". It will bail and not parse any more tests. +#[allow(clippy::too_many_arguments)] +fn run_tests( + parser: &mut Parser, + test_entry: TestEntry, + opts: &mut TestOptions, + mut indent_level: i32, + failures: &mut Vec<(String, String, String)>, + corrected_entries: &mut Vec<(String, String, String, String, usize, usize)>, + has_parse_errors: &mut bool, +) -> Result { + match test_entry { + TestEntry::Example { + name, + input, + output, + header_delim_len, + divider_delim_len, + has_fields, + attributes_str, + attributes, + } => { + print!("{}", " ".repeat(indent_level as usize)); + + if attributes.skip { + println!( + "{:>3}.  {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Yellow), &name), + ); + return Ok(true); + } + + if !attributes.platform { + println!( + "{:>3}.  {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Magenta), &name), + ); + return Ok(true); + } + + for (i, language_name) in attributes.languages.iter().enumerate() { + if !language_name.is_empty() { + let language = opts + .languages + .get(language_name.as_ref()) + .ok_or_else(|| anyhow!("Language not found: {language_name}"))?; + parser.set_language(language)?; + } + let tree = parser.parse(&input, None).unwrap(); + + if attributes.error { + if tree.root_node().has_error() { + println!( + "{:>3}.  {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Green), &name) + ); + if opts.update { + let input = String::from_utf8(input.clone()).unwrap(); + let output = format_sexp(&output, 0); + corrected_entries.push(( + name.clone(), + input, + output, + attributes_str.clone(), + header_delim_len, + divider_delim_len, + )); + } + } else { + if opts.update { + let input = String::from_utf8(input.clone()).unwrap(); + // Keep the original `expected` output if the actual output has no error + let output = format_sexp(&output, 0); + corrected_entries.push(( + name.clone(), + input, + output, + attributes_str.clone(), + header_delim_len, + divider_delim_len, + )); + } + println!( + "{:>3}.  {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Red), &name) + ); + failures.push(( + name.clone(), + tree.root_node().to_sexp(), + "NO ERROR".to_string(), + )); + } + + if attributes.fail_fast { + return Ok(false); + } + } else { + let mut actual = tree.root_node().to_sexp(); + if !(opts.show_fields || has_fields) { + actual = strip_sexp_fields(&actual); + } + + if actual == output { + println!( + "{:>3}. ✓ {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Green), &name) + ); + if opts.update { + let input = String::from_utf8(input.clone()).unwrap(); + let output = format_sexp(&output, 0); + corrected_entries.push(( + name.clone(), + input, + output, + attributes_str.clone(), + header_delim_len, + divider_delim_len, + )); + } + } else { + if opts.update { + let input = String::from_utf8(input.clone()).unwrap(); + let expected_output = format_sexp(&output, 0); + let actual_output = format_sexp(&actual, 0); + + // Only bail early before updating if the actual is not the output, + // sometimes users want to test cases that + // are intended to have errors, hence why this + // check isn't shown above + if actual.contains("ERROR") || actual.contains("MISSING") { + *has_parse_errors = true; + + // keep the original `expected` output if the actual output has an + // error + corrected_entries.push(( + name.clone(), + input, + expected_output, + attributes_str.clone(), + header_delim_len, + divider_delim_len, + )); + } else { + corrected_entries.push(( + name.clone(), + input, + actual_output, + attributes_str.clone(), + header_delim_len, + divider_delim_len, + )); + println!( + "{:>3}. ✓ {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Blue), &name), + ); + } + } else { + println!( + "{:>3}. ✗ {}", + opts.test_num, + paint(opts.color.then_some(AnsiColor::Red), &name), + ); + } + failures.push((name.clone(), actual, output.clone())); + + if attributes.fail_fast { + return Ok(false); + } + } + } + + if i == attributes.languages.len() - 1 { + // reset to the first language + parser.set_language(opts.languages.values().next().unwrap())?; + } + } + opts.test_num += 1; + } + TestEntry::Group { + name, + children, + file_path, + } => { + if children.is_empty() { + return Ok(true); + } + + indent_level += 1; + let mut advance_counter = opts.test_num; + let failure_count = failures.len(); + let mut has_printed = false; + let mut skipped_tests = 0; + + let matches_filter = |name: &str, opts: &TestOptions| { + if let Some(include) = &opts.include { + include.is_match(name) + } else if let Some(exclude) = &opts.exclude { + !exclude.is_match(name) + } else { + true + } + }; + + let mut should_skip = |entry: &TestEntry, opts: &TestOptions| match entry { + TestEntry::Example { name, .. } => { + advance_counter += 1; + !matches_filter(name, opts) + } + TestEntry::Group { .. } => { + advance_counter += count_subtests(entry); + false + } + }; + + for child in children { + if let TestEntry::Example { + ref name, + ref input, + ref output, + ref attributes_str, + header_delim_len, + divider_delim_len, + .. + } = child + { + if should_skip(&child, opts) { + let input = String::from_utf8(input.clone()).unwrap(); + let output = format_sexp(output, 0); + corrected_entries.push(( + name.clone(), + input, + output, + attributes_str.clone(), + header_delim_len, + divider_delim_len, + )); + + opts.test_num += 1; + skipped_tests += 1; + + continue; + } + } + if !has_printed && indent_level > 1 { + has_printed = true; + print!("{}", " ".repeat((indent_level - 1) as usize)); + println!("{name}:"); + } + if !run_tests( + parser, + child, + opts, + indent_level, + failures, + corrected_entries, + has_parse_errors, + )? { + // fail fast + return Ok(false); + } + } + + opts.test_num += skipped_tests; + + if let Some(file_path) = file_path { + if opts.update && failures.len() - failure_count > 0 { + write_tests(&file_path, corrected_entries)?; + } + corrected_entries.clear(); + } + } + } + Ok(true) +} + +fn count_subtests(test_entry: &TestEntry) -> usize { + match test_entry { + TestEntry::Example { .. } => 1, + TestEntry::Group { children, .. } => children + .iter() + .fold(0, |count, child| count + count_subtests(child)), + } +} + +fn write_tests( + file_path: &Path, + corrected_entries: &[(String, String, String, String, usize, usize)], +) -> Result<()> { + let mut buffer = fs::File::create(file_path)?; + write_tests_to_buffer(&mut buffer, corrected_entries) +} + +fn write_tests_to_buffer( + buffer: &mut impl Write, + corrected_entries: &[(String, String, String, String, usize, usize)], +) -> Result<()> { + for (i, (name, input, output, attributes_str, header_delim_len, divider_delim_len)) in + corrected_entries.iter().enumerate() + { + if i > 0 { + writeln!(buffer)?; + } + writeln!( + buffer, + "{}\n{name}\n{}{}\n{input}\n{}\n\n{}", + "=".repeat(*header_delim_len), + if attributes_str.is_empty() { + attributes_str.clone() + } else { + format!("{attributes_str}\n") + }, + "=".repeat(*header_delim_len), + "-".repeat(*divider_delim_len), + output.trim() + )?; + } + Ok(()) +} + +pub fn parse_tests(path: &Path) -> io::Result { + let name = path + .file_stem() + .and_then(|s| s.to_str()) + .unwrap_or("") + .to_string(); + if path.is_dir() { + let mut children = Vec::new(); + for entry in fs::read_dir(path)? { + let entry = entry?; + let hidden = entry.file_name().to_str().unwrap_or("").starts_with('.'); + if !hidden { + children.push(entry.path()); + } + } + children.sort_by(|a, b| { + a.file_name() + .unwrap_or_default() + .cmp(b.file_name().unwrap_or_default()) + }); + let children = children + .iter() + .map(|path| parse_tests(path)) + .collect::>>()?; + Ok(TestEntry::Group { + name, + children, + file_path: None, + }) + } else { + let content = fs::read_to_string(path)?; + Ok(parse_test_content(name, &content, Some(path.to_path_buf()))) + } +} + +#[must_use] +pub fn strip_sexp_fields(sexp: &str) -> String { + SEXP_FIELD_REGEX.replace_all(sexp, " (").to_string() +} + +#[must_use] +pub fn strip_points(sexp: &str) -> String { + POINT_REGEX.replace_all(sexp, "").to_string() +} + +fn parse_test_content(name: String, content: &str, file_path: Option) -> TestEntry { + let mut children = Vec::new(); + let bytes = content.as_bytes(); + let mut prev_name = String::new(); + let mut prev_attributes_str = String::new(); + let mut prev_header_end = 0; + + // Find the first test header in the file, and determine if it has a + // custom suffix. If so, then this suffix will be used to identify + // all subsequent headers and divider lines in the file. + let first_suffix = HEADER_REGEX + .captures(bytes) + .and_then(|c| c.name("suffix1")) + .map(|m| String::from_utf8_lossy(m.as_bytes())); + + // Find all of the `===` test headers, which contain the test names. + // Ignore any matches whose suffix does not match the first header + // suffix in the file. + let header_matches = HEADER_REGEX.captures_iter(bytes).filter_map(|c| { + let header_delim_len = c.name("equals").map_or(80, |m| m.as_bytes().len()); + let suffix1 = c + .name("suffix1") + .map(|m| String::from_utf8_lossy(m.as_bytes())); + let suffix2 = c + .name("suffix2") + .map(|m| String::from_utf8_lossy(m.as_bytes())); + + let (mut skip, mut platform, mut fail_fast, mut error, mut languages) = + (false, None, false, false, vec![]); + + let test_name_and_markers = c + .name("test_name_and_markers") + .map_or("".as_bytes(), |m| m.as_bytes()); + + let mut test_name = String::new(); + let mut attributes_str = String::new(); + + let mut seen_marker = false; + + let test_name_and_markers = str::from_utf8(test_name_and_markers).unwrap(); + for line in test_name_and_markers + .split_inclusive('\n') + .filter(|s| !s.is_empty()) + { + let trimmed_line = line.trim(); + match trimmed_line.split('(').next().unwrap() { + ":skip" => (seen_marker, skip) = (true, true), + ":platform" => { + if let Some(platforms) = trimmed_line.strip_prefix(':').and_then(|s| { + s.strip_prefix("platform(") + .and_then(|s| s.strip_suffix(')')) + }) { + seen_marker = true; + platform = Some( + platform.unwrap_or(false) || platforms.trim() == std::env::consts::OS, + ); + } + } + ":fail-fast" => (seen_marker, fail_fast) = (true, true), + ":error" => (seen_marker, error) = (true, true), + ":language" => { + if let Some(lang) = trimmed_line.strip_prefix(':').and_then(|s| { + s.strip_prefix("language(") + .and_then(|s| s.strip_suffix(')')) + }) { + seen_marker = true; + languages.push(lang.into()); + } + } + _ if !seen_marker => { + test_name.push_str(line); + } + _ => {} + } + } + attributes_str.push_str(test_name_and_markers.strip_prefix(&test_name).unwrap()); + + // prefer skip over error, both shouldn't be set + if skip { + error = false; + } + + // add a default language if none are specified, will defer to the first language + if languages.is_empty() { + languages.push("".into()); + } + + if suffix1 == first_suffix && suffix2 == first_suffix { + let header_range = c.get(0).unwrap().range(); + let test_name = if test_name.is_empty() { + None + } else { + Some(test_name.trim_end().to_string()) + }; + let attributes_str = if attributes_str.is_empty() { + None + } else { + Some(attributes_str.trim_end().to_string()) + }; + Some(( + header_delim_len, + header_range, + test_name, + attributes_str, + TestAttributes { + skip, + platform: platform.unwrap_or(true), + fail_fast, + error, + languages, + }, + )) + } else { + None + } + }); + + let (mut prev_header_len, mut prev_attributes) = (80, TestAttributes::default()); + for (header_delim_len, header_range, test_name, attributes_str, attributes) in header_matches + .chain(Some(( + 80, + bytes.len()..bytes.len(), + None, + None, + TestAttributes::default(), + ))) + { + // Find the longest line of dashes following each test description. That line + // separates the input from the expected output. Ignore any matches whose suffix + // does not match the first suffix in the file. + if prev_header_end > 0 { + let divider_range = DIVIDER_REGEX + .captures_iter(&bytes[prev_header_end..header_range.start]) + .filter_map(|m| { + let divider_delim_len = m.name("hyphens").map_or(80, |m| m.as_bytes().len()); + let suffix = m + .name("suffix") + .map(|m| String::from_utf8_lossy(m.as_bytes())); + if suffix == first_suffix { + let range = m.get(0).unwrap().range(); + Some(( + divider_delim_len, + (prev_header_end + range.start)..(prev_header_end + range.end), + )) + } else { + None + } + }) + .max_by_key(|(_, range)| range.len()); + + if let Some((divider_delim_len, divider_range)) = divider_range { + if let Ok(output) = str::from_utf8(&bytes[divider_range.end..header_range.start]) { + let mut input = bytes[prev_header_end..divider_range.start].to_vec(); + + // Remove trailing newline from the input. + input.pop(); + if input.last() == Some(&b'\r') { + input.pop(); + } + + // Remove all comments + let output = COMMENT_REGEX.replace_all(output, "").to_string(); + + // Normalize the whitespace in the expected output. + let output = WHITESPACE_REGEX.replace_all(output.trim(), " "); + let output = output.replace(" )", ")"); + + // Identify if the expected output has fields indicated. If not, then + // fields will not be checked. + let has_fields = SEXP_FIELD_REGEX.is_match(&output); + + let t = TestEntry::Example { + name: prev_name, + input, + output, + header_delim_len: prev_header_len, + divider_delim_len, + has_fields, + attributes_str: prev_attributes_str, + attributes: prev_attributes, + }; + + children.push(t); + } + } + } + prev_attributes = attributes; + prev_name = test_name.unwrap_or_default(); + prev_attributes_str = attributes_str.unwrap_or_default(); + prev_header_len = header_delim_len; + prev_header_end = header_range.end; + } + TestEntry::Group { + name, + children, + file_path, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_test_content_simple() { + let entry = parse_test_content( + "the-filename".to_string(), + r" +=============== +The first test +=============== + +a b c + +--- + +(a + (b c)) + +================ +The second test +================ +d +--- +(d) + " + .trim(), + None, + ); + + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + children: vec![ + TestEntry::Example { + name: "The first test".to_string(), + input: b"\na b c\n".to_vec(), + output: "(a (b c))".to_string(), + header_delim_len: 15, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "The second test".to_string(), + input: b"d".to_vec(), + output: "(d)".to_string(), + header_delim_len: 16, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + ], + file_path: None, + } + ); + } + + #[test] + fn test_parse_test_content_with_dashes_in_source_code() { + let entry = parse_test_content( + "the-filename".to_string(), + r" +================== +Code with dashes +================== +abc +--- +defg +---- +hijkl +------- + +(a (b)) + +========================= +Code ending with dashes +========================= +abc +----------- +------------------- + +(c (d)) + " + .trim(), + None, + ); + + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + children: vec![ + TestEntry::Example { + name: "Code with dashes".to_string(), + input: b"abc\n---\ndefg\n----\nhijkl".to_vec(), + output: "(a (b))".to_string(), + header_delim_len: 18, + divider_delim_len: 7, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "Code ending with dashes".to_string(), + input: b"abc\n-----------".to_vec(), + output: "(c (d))".to_string(), + header_delim_len: 25, + divider_delim_len: 19, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + ], + file_path: None, + } + ); + } + + #[test] + fn test_format_sexp() { + assert_eq!(format_sexp("", 0), ""); + assert_eq!( + format_sexp("(a b: (c) (d) e: (f (g (h (MISSING i)))))", 0), + r" +(a + b: (c) + (d) + e: (f + (g + (h + (MISSING i))))) +" + .trim() + ); + assert_eq!( + format_sexp("(program (ERROR (UNEXPECTED ' ')) (identifier))", 0), + r" +(program + (ERROR + (UNEXPECTED ' ')) + (identifier)) +" + .trim() + ); + assert_eq!( + format_sexp(r#"(source_file (MISSING ")"))"#, 0), + r#" +(source_file + (MISSING ")")) + "# + .trim() + ); + assert_eq!( + format_sexp( + r"(source_file (ERROR (UNEXPECTED 'f') (UNEXPECTED '+')))", + 0 + ), + r#" +(source_file + (ERROR + (UNEXPECTED 'f') + (UNEXPECTED '+'))) +"# + .trim() + ); + } + + #[test] + fn test_write_tests_to_buffer() { + let mut buffer = Vec::new(); + let corrected_entries = vec![ + ( + "title 1".to_string(), + "input 1".to_string(), + "output 1".to_string(), + String::new(), + 80, + 80, + ), + ( + "title 2".to_string(), + "input 2".to_string(), + "output 2".to_string(), + String::new(), + 80, + 80, + ), + ]; + write_tests_to_buffer(&mut buffer, &corrected_entries).unwrap(); + assert_eq!( + String::from_utf8(buffer).unwrap(), + r" +================================================================================ +title 1 +================================================================================ +input 1 +-------------------------------------------------------------------------------- + +output 1 + +================================================================================ +title 2 +================================================================================ +input 2 +-------------------------------------------------------------------------------- + +output 2 +" + .trim_start() + .to_string() + ); + } + + #[test] + fn test_parse_test_content_with_comments_in_sexp() { + let entry = parse_test_content( + "the-filename".to_string(), + r#" +================== +sexp with comment +================== +code +--- + +; Line start comment +(a (b)) + +================== +sexp with comment between +================== +code +--- + +; Line start comment +(a +; ignore this + (b) + ; also ignore this +) + +========================= +sexp with ';' +========================= +code +--- + +(MISSING ";") + "# + .trim(), + None, + ); + + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + children: vec![ + TestEntry::Example { + name: "sexp with comment".to_string(), + input: b"code".to_vec(), + output: "(a (b))".to_string(), + header_delim_len: 18, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "sexp with comment between".to_string(), + input: b"code".to_vec(), + output: "(a (b))".to_string(), + header_delim_len: 18, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "sexp with ';'".to_string(), + input: b"code".to_vec(), + output: "(MISSING \";\")".to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + } + ], + file_path: None, + } + ); + } + + #[test] + fn test_parse_test_content_with_suffixes() { + let entry = parse_test_content( + "the-filename".to_string(), + r" +==================asdf\()[]|{}*+?^$.- +First test +==================asdf\()[]|{}*+?^$.- + +========================= +NOT A TEST HEADER +========================= +------------------------- + +---asdf\()[]|{}*+?^$.- + +(a) + +==================asdf\()[]|{}*+?^$.- +Second test +==================asdf\()[]|{}*+?^$.- + +========================= +NOT A TEST HEADER +========================= +------------------------- + +---asdf\()[]|{}*+?^$.- + +(a) + +=========================asdf\()[]|{}*+?^$.- +Test name with = symbol +=========================asdf\()[]|{}*+?^$.- + +========================= +NOT A TEST HEADER +========================= +------------------------- + +---asdf\()[]|{}*+?^$.- + +(a) + " + .trim(), + None, + ); + + let expected_input = b"\n=========================\n\ + NOT A TEST HEADER\n\ + =========================\n\ + -------------------------\n" + .to_vec(); + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + children: vec![ + TestEntry::Example { + name: "First test".to_string(), + input: expected_input.clone(), + output: "(a)".to_string(), + header_delim_len: 18, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "Second test".to_string(), + input: expected_input.clone(), + output: "(a)".to_string(), + header_delim_len: 18, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "Test name with = symbol".to_string(), + input: expected_input, + output: "(a)".to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + } + ], + file_path: None, + } + ); + } + + #[test] + fn test_parse_test_content_with_newlines_in_test_names() { + let entry = parse_test_content( + "the-filename".to_string(), + r" +=============== +name +with +newlines +=============== +a +--- +(b) + +==================== +name with === signs +==================== +code with ---- +--- +(d) +", + None, + ); + + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + file_path: None, + children: vec![ + TestEntry::Example { + name: "name\nwith\nnewlines".to_string(), + input: b"a".to_vec(), + output: "(b)".to_string(), + header_delim_len: 15, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + }, + TestEntry::Example { + name: "name with === signs".to_string(), + input: b"code with ----".to_vec(), + output: "(d)".to_string(), + header_delim_len: 20, + divider_delim_len: 3, + has_fields: false, + attributes_str: String::new(), + attributes: TestAttributes::default(), + } + ] + } + ); + } + + #[test] + fn test_parse_test_with_markers() { + // do one with :skip, we should not see it in the entry output + + let entry = parse_test_content( + "the-filename".to_string(), + r" +===================== +Test with skip marker +:skip +===================== +a +--- +(b) +", + None, + ); + + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + file_path: None, + children: vec![TestEntry::Example { + name: "Test with skip marker".to_string(), + input: b"a".to_vec(), + output: "(b)".to_string(), + header_delim_len: 21, + divider_delim_len: 3, + has_fields: false, + attributes_str: ":skip".to_string(), + attributes: TestAttributes { + skip: true, + platform: true, + fail_fast: false, + error: false, + languages: vec!["".into()] + }, + }] + } + ); + + let entry = parse_test_content( + "the-filename".to_string(), + &format!( + r" +========================= +Test with platform marker +:platform({}) +:fail-fast +========================= +a +--- +(b) + +============================= +Test with bad platform marker +:platform({}) +:language(foo) +============================= +a +--- +(b) +", + std::env::consts::OS, + if std::env::consts::OS == "linux" { + "macos" + } else { + "linux" + } + ), + None, + ); + + assert_eq!( + entry, + TestEntry::Group { + name: "the-filename".to_string(), + file_path: None, + children: vec![ + TestEntry::Example { + name: "Test with platform marker".to_string(), + input: b"a".to_vec(), + output: "(b)".to_string(), + header_delim_len: 25, + divider_delim_len: 3, + has_fields: false, + attributes_str: format!(":platform({})\n:fail-fast", std::env::consts::OS), + attributes: TestAttributes { + skip: false, + platform: true, + fail_fast: true, + error: false, + languages: vec!["".into()] + }, + }, + TestEntry::Example { + name: "Test with bad platform marker".to_string(), + input: b"a".to_vec(), + output: "(b)".to_string(), + header_delim_len: 29, + divider_delim_len: 3, + has_fields: false, + attributes_str: if std::env::consts::OS == "linux" { + ":platform(macos)\n:language(foo)".to_string() + } else { + ":platform(linux)\n:language(foo)".to_string() + }, + attributes: TestAttributes { + skip: false, + platform: false, + fail_fast: false, + error: false, + languages: vec!["foo".into()] + }, + } + ] + } + ); + } +} diff --git a/crates/cli/src/test_highlight.rs b/cli/src/test_highlight.rs similarity index 81% rename from crates/cli/src/test_highlight.rs rename to cli/src/test_highlight.rs index d96f90c2..34be438f 100644 --- a/crates/cli/src/test_highlight.rs +++ b/cli/src/test_highlight.rs @@ -1,13 +1,14 @@ use std::{fs, path::Path}; +use anstyle::AnsiColor; use anyhow::{anyhow, Result}; use tree_sitter::Point; use tree_sitter_highlight::{Highlight, HighlightConfiguration, HighlightEvent, Highlighter}; use tree_sitter_loader::{Config, Loader}; -use crate::{ +use super::{ query_testing::{parse_position_comments, to_utf8_point, Assertion, Utf8Point}, - test::{TestInfo, TestOutcome, TestResult, TestSummary}, + test::paint, util, }; @@ -47,7 +48,19 @@ pub fn test_highlights( loader_config: &Config, highlighter: &mut Highlighter, directory: &Path, - test_summary: &mut TestSummary, + use_color: bool, +) -> Result<()> { + println!("syntax highlighting:"); + test_highlights_indented(loader, loader_config, highlighter, directory, use_color, 2) +} + +fn test_highlights_indented( + loader: &Loader, + loader_config: &Config, + highlighter: &mut Highlighter, + directory: &Path, + use_color: bool, + indent_level: usize, ) -> Result<()> { let mut failed = false; @@ -55,22 +68,25 @@ pub fn test_highlights( let highlight_test_file = highlight_test_file?; let test_file_path = highlight_test_file.path(); let test_file_name = highlight_test_file.file_name(); + print!( + "{indent:indent_level$}", + indent = "", + indent_level = indent_level * 2 + ); if test_file_path.is_dir() && test_file_path.read_dir()?.next().is_some() { - test_summary - .highlight_results - .add_group(test_file_name.to_string_lossy().as_ref()); - if test_highlights( + println!("{}:", test_file_name.into_string().unwrap()); + if test_highlights_indented( loader, loader_config, highlighter, &test_file_path, - test_summary, + use_color, + indent_level + 1, ) .is_err() { failed = true; } - test_summary.highlight_results.pop_traversal(); } else { let (language, language_config) = loader .language_configuration_for_file_name(&test_file_path)? @@ -82,12 +98,7 @@ pub fn test_highlights( })?; let highlight_config = language_config .highlight_config(language, None)? - .ok_or_else(|| { - anyhow!( - "No highlighting config found for {}", - test_file_path.display() - ) - })?; + .ok_or_else(|| anyhow!("No highlighting config found for {test_file_path:?}"))?; match test_highlight( loader, highlighter, @@ -95,28 +106,30 @@ pub fn test_highlights( fs::read(&test_file_path)?.as_slice(), ) { Ok(assertion_count) => { - test_summary.highlight_results.add_case(TestResult { - name: test_file_name.to_string_lossy().to_string(), - info: TestInfo::AssertionTest { - outcome: TestOutcome::AssertionPassed { assertion_count }, - test_num: test_summary.test_num, - }, - }); + println!( + "✓ {} ({assertion_count} assertions)", + paint( + use_color.then_some(AnsiColor::Green), + test_file_name.to_string_lossy().as_ref() + ), + ); } Err(e) => { - test_summary.highlight_results.add_case(TestResult { - name: test_file_name.to_string_lossy().to_string(), - info: TestInfo::AssertionTest { - outcome: TestOutcome::AssertionFailed { - error: e.to_string(), - }, - test_num: test_summary.test_num, - }, - }); + println!( + "✗ {}", + paint( + use_color.then_some(AnsiColor::Red), + test_file_name.to_string_lossy().as_ref() + ) + ); + println!( + "{indent:indent_level$} {e}", + indent = "", + indent_level = indent_level * 2 + ); failed = true; } } - test_summary.test_num += 1; } } @@ -137,13 +150,11 @@ pub fn iterate_assertions( let mut actual_highlights = Vec::new(); for Assertion { position, - length, negative, expected_capture_name: expected_highlight, } in assertions { let mut passed = false; - let mut end_column = position.column + length - 1; actual_highlights.clear(); // The assertions are ordered by position, so skip past all of the highlights that @@ -154,12 +165,11 @@ pub fn iterate_assertions( continue; } - // Iterate through all of the highlights that start at or before this assertion's + // Iterate through all of the highlights that start at or before this assertion's, // position, looking for one that matches the assertion. let mut j = i; while let (false, Some(highlight)) = (passed, highlights.get(j)) { - end_column = position.column + length - 1; - if highlight.0.row >= position.row && highlight.0.column > end_column { + if highlight.0 > *position { break 'highlight_loop; } @@ -183,7 +193,7 @@ pub fn iterate_assertions( if !passed { return Err(Failure { row: position.row, - column: end_column, + column: position.column, expected_highlight: expected_highlight.clone(), actual_highlights: actual_highlights.into_iter().cloned().collect(), } diff --git a/crates/cli/src/test_tags.rs b/cli/src/test_tags.rs similarity index 62% rename from crates/cli/src/test_tags.rs rename to cli/src/test_tags.rs index 882718e5..5b290bda 100644 --- a/crates/cli/src/test_tags.rs +++ b/cli/src/test_tags.rs @@ -1,12 +1,13 @@ use std::{fs, path::Path}; +use anstyle::AnsiColor; use anyhow::{anyhow, Result}; use tree_sitter_loader::{Config, Loader}; use tree_sitter_tags::{TagsConfiguration, TagsContext}; -use crate::{ +use super::{ query_testing::{parse_position_comments, to_utf8_point, Assertion, Utf8Point}, - test::{TestInfo, TestOutcome, TestResult, TestSummary}, + test::paint, util, }; @@ -46,70 +47,50 @@ pub fn test_tags( loader_config: &Config, tags_context: &mut TagsContext, directory: &Path, - test_summary: &mut TestSummary, + use_color: bool, ) -> Result<()> { let mut failed = false; - + println!("tags:"); for tag_test_file in fs::read_dir(directory)? { let tag_test_file = tag_test_file?; let test_file_path = tag_test_file.path(); let test_file_name = tag_test_file.file_name(); - if test_file_path.is_dir() && test_file_path.read_dir()?.next().is_some() { - test_summary - .tag_results - .add_group(test_file_name.to_string_lossy().as_ref()); - if test_tags( - loader, - loader_config, - tags_context, - &test_file_path, - test_summary, - ) - .is_err() - { + let (language, language_config) = loader + .language_configuration_for_file_name(&test_file_path)? + .ok_or_else(|| { + anyhow!( + "{}", + util::lang_not_found_for_path(test_file_path.as_path(), loader_config) + ) + })?; + let tags_config = language_config + .tags_config(language)? + .ok_or_else(|| anyhow!("No tags config found for {:?}", test_file_path))?; + match test_tag( + tags_context, + tags_config, + fs::read(&test_file_path)?.as_slice(), + ) { + Ok(assertion_count) => { + println!( + " ✓ {} ({assertion_count} assertions)", + paint( + use_color.then_some(AnsiColor::Green), + test_file_name.to_string_lossy().as_ref() + ), + ); + } + Err(e) => { + println!( + " ✗ {}", + paint( + use_color.then_some(AnsiColor::Red), + test_file_name.to_string_lossy().as_ref() + ) + ); + println!(" {e}"); failed = true; } - test_summary.tag_results.pop_traversal(); - } else { - let (language, language_config) = loader - .language_configuration_for_file_name(&test_file_path)? - .ok_or_else(|| { - anyhow!( - "{}", - util::lang_not_found_for_path(test_file_path.as_path(), loader_config) - ) - })?; - let tags_config = language_config - .tags_config(language)? - .ok_or_else(|| anyhow!("No tags config found for {}", test_file_path.display()))?; - match test_tag( - tags_context, - tags_config, - fs::read(&test_file_path)?.as_slice(), - ) { - Ok(assertion_count) => { - test_summary.tag_results.add_case(TestResult { - name: test_file_name.to_string_lossy().to_string(), - info: TestInfo::AssertionTest { - outcome: TestOutcome::AssertionPassed { assertion_count }, - test_num: test_summary.test_num, - }, - }); - } - Err(e) => { - test_summary.tag_results.add_case(TestResult { - name: test_file_name.to_string_lossy().to_string(), - info: TestInfo::AssertionTest { - outcome: TestOutcome::AssertionFailed { - error: e.to_string(), - }, - test_num: test_summary.test_num, - }, - }); - failed = true; - } - } - test_summary.test_num += 1; } } @@ -133,13 +114,11 @@ pub fn test_tag( let mut actual_tags = Vec::<&String>::new(); for Assertion { position, - length, negative, expected_capture_name: expected_tag, } in &assertions { let mut passed = false; - let mut end_column = position.column + length - 1; 'tag_loop: while let Some(tag) = tags.get(i) { if tag.1 <= *position { @@ -151,8 +130,7 @@ pub fn test_tag( // position, looking for one that matches the assertion let mut j = i; while let (false, Some(tag)) = (passed, tags.get(j)) { - end_column = position.column + length - 1; - if tag.0.column > end_column { + if tag.0 > *position { break 'tag_loop; } @@ -174,7 +152,7 @@ pub fn test_tag( if !passed { return Err(Failure { row: position.row, - column: end_column, + column: position.column, expected_tag: expected_tag.clone(), actual_tags: actual_tags.into_iter().cloned().collect(), } diff --git a/cli/src/tests/async_context_test.rs b/cli/src/tests/async_context_test.rs new file mode 100644 index 00000000..cb2345cc --- /dev/null +++ b/cli/src/tests/async_context_test.rs @@ -0,0 +1,284 @@ +use std::{ + future::Future, + pin::{pin, Pin}, + ptr, + task::{self, Context, Poll, RawWaker, RawWakerVTable, Waker}, +}; + +use tree_sitter::Parser; + +use super::helpers::fixtures::get_language; + +#[test] +fn test_node_in_fut() { + let (ret, pended) = tokio_like_spawn(async { + let mut parser = Parser::new(); + let language = get_language("bash"); + parser.set_language(&language).unwrap(); + + let tree = parser.parse("#", None).unwrap(); + + let root = tree.root_node(); + let root_ref = &root; + + let fut_val_fn = || async { + // eprintln!("fut_val_fn: {}", root.child(0).unwrap().kind()); + yield_now().await; + root.child(0).unwrap().kind() + }; + + yield_now().await; + + let fut_ref_fn = || async { + // eprintln!("fut_ref_fn: {}", root_ref.child(0).unwrap().kind()); + yield_now().await; + root_ref.child(0).unwrap().kind() + }; + + let f1 = fut_val_fn().await; + let f2 = fut_ref_fn().await; + assert_eq!(f1, f2); + + let fut_val = async { + // eprintln!("fut_val: {}", root.child(0).unwrap().kind()); + yield_now().await; + root.child(0).unwrap().kind() + }; + + let fut_ref = async { + // eprintln!("fut_ref: {}", root_ref.child(0).unwrap().kind()); + yield_now().await; + root_ref.child(0).unwrap().kind() + }; + + let f1 = fut_val.await; + let f2 = fut_ref.await; + assert_eq!(f1, f2); + + f1 + }) + .join(); + // eprintln!("pended: {pended:?}"); + assert_eq!(ret, "comment"); + assert_eq!(pended, 5); +} + +#[test] +fn test_node_and_cursor_ref_in_fut() { + let ((), pended) = tokio_like_spawn(async { + let mut parser = Parser::new(); + let language = get_language("c"); + parser.set_language(&language).unwrap(); + + let tree = parser.parse("#", None).unwrap(); + + let root = tree.root_node(); + let root_ref = &root; + + let mut cursor = tree.walk(); + let cursor_ref = &mut cursor; + + cursor_ref.goto_first_child(); + + let fut_val = async { + yield_now().await; + let _ = root.to_sexp(); + }; + + yield_now().await; + + let fut_ref = async { + yield_now().await; + let _ = root_ref.to_sexp(); + cursor_ref.goto_first_child(); + }; + + fut_val.await; + fut_ref.await; + + cursor_ref.goto_first_child(); + }) + .join(); + assert_eq!(pended, 3); +} + +#[test] +fn test_node_and_cursor_ref_in_fut_with_fut_fabrics() { + let ((), pended) = tokio_like_spawn(async { + let mut parser = Parser::new(); + let language = get_language("javascript"); + parser.set_language(&language).unwrap(); + + let tree = parser.parse("#", None).unwrap(); + + let root = tree.root_node(); + let root_ref = &root; + + let mut cursor = tree.walk(); + let cursor_ref = &mut cursor; + + cursor_ref.goto_first_child(); + + let fut_val = || async { + yield_now().await; + let _ = root.to_sexp(); + }; + + yield_now().await; + + let fut_ref = || async move { + yield_now().await; + let _ = root_ref.to_sexp(); + cursor_ref.goto_first_child(); + }; + + fut_val().await; + fut_val().await; + fut_ref().await; + }) + .join(); + assert_eq!(pended, 4); +} + +#[test] +fn test_node_and_cursor_ref_in_fut_with_inner_spawns() { + let (ret, pended) = tokio_like_spawn(async { + let mut parser = Parser::new(); + let language = get_language("rust"); + parser.set_language(&language).unwrap(); + + let tree = parser.parse("#", None).unwrap(); + + let mut cursor = tree.walk(); + let cursor_ref = &mut cursor; + + cursor_ref.goto_first_child(); + + let fut_val = || { + let tree = tree.clone(); + async move { + let root = tree.root_node(); + let mut cursor = tree.walk(); + let cursor_ref = &mut cursor; + yield_now().await; + let _ = root.to_sexp(); + cursor_ref.goto_first_child(); + } + }; + + yield_now().await; + + let fut_ref = || { + let tree = tree.clone(); + async move { + let root = tree.root_node(); + let root_ref = &root; + let mut cursor = tree.walk(); + let cursor_ref = &mut cursor; + yield_now().await; + let _ = root_ref.to_sexp(); + cursor_ref.goto_first_child(); + } + }; + + let ((), p1) = tokio_like_spawn(fut_val()).await.unwrap(); + let ((), p2) = tokio_like_spawn(fut_ref()).await.unwrap(); + + cursor_ref.goto_first_child(); + + fut_val().await; + fut_val().await; + fut_ref().await; + + cursor_ref.goto_first_child(); + + p1 + p2 + }) + .join(); + assert_eq!(pended, 4); + assert_eq!(ret, 2); +} + +fn tokio_like_spawn(future: T) -> JoinHandle<(T::Output, usize)> +where + T: Future + Send + 'static, + T::Output: Send + 'static, +{ + // No runtime, just noop waker + + let waker = noop_waker(); + let mut cx = task::Context::from_waker(&waker); + + let mut pending = 0; + let mut future = pin!(future); + let ret = loop { + match future.as_mut().poll(&mut cx) { + Poll::Pending => pending += 1, + Poll::Ready(r) => { + // eprintln!("ready, pended: {pending}"); + break r; + } + } + }; + JoinHandle::new((ret, pending)) +} + +async fn yield_now() { + struct SimpleYieldNow { + yielded: bool, + } + + impl Future for SimpleYieldNow { + type Output = (); + + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { + cx.waker().wake_by_ref(); + if self.yielded { + return Poll::Ready(()); + } + self.yielded = true; + Poll::Pending + } + } + + SimpleYieldNow { yielded: false }.await; +} + +pub fn noop_waker() -> Waker { + const VTABLE: RawWakerVTable = RawWakerVTable::new( + // Cloning just returns a new no-op raw waker + |_| RAW, + // `wake` does nothing + |_| {}, + // `wake_by_ref` does nothing + |_| {}, + // Dropping does nothing as we don't allocate anything + |_| {}, + ); + const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE); + unsafe { Waker::from_raw(RAW) } +} + +struct JoinHandle { + data: Option, +} + +impl JoinHandle { + #[must_use] + const fn new(data: T) -> Self { + Self { data: Some(data) } + } + + fn join(&mut self) -> T { + self.data.take().unwrap() + } +} + +impl Future for JoinHandle { + type Output = std::result::Result; + + fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll { + let data = self.get_mut().data.take().unwrap(); + Poll::Ready(Ok(data)) + } +} diff --git a/crates/cli/src/tests/corpus_test.rs b/cli/src/tests/corpus_test.rs similarity index 85% rename from crates/cli/src/tests/corpus_test.rs rename to cli/src/tests/corpus_test.rs index ba3fd68e..f81d7543 100644 --- a/crates/cli/src/tests/corpus_test.rs +++ b/cli/src/tests/corpus_test.rs @@ -1,6 +1,5 @@ use std::{collections::HashMap, env, fs}; -use anyhow::Context; use tree_sitter::Parser; use tree_sitter_proc_macro::test_with_seed; @@ -15,8 +14,9 @@ use crate::{ EDIT_COUNT, EXAMPLE_EXCLUDE, EXAMPLE_INCLUDE, ITERATION_COUNT, LANGUAGE_FILTER, LOG_GRAPH_ENABLED, START_SEED, }, + generate, parse::perform_edit, - test::{parse_tests, strip_sexp_fields, DiffKey, TestDiff}, + test::{parse_tests, print_diff, print_diff_key, strip_sexp_fields}, tests::{ allocations, helpers::fixtures::{fixtures_dir, get_language, get_test_language, SCRATCH_BASE_DIR}, @@ -24,7 +24,7 @@ use crate::{ }; #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_bash_language(seed: usize) { +fn test_corpus_for_bash(seed: usize) { test_language_corpus( "bash", seed, @@ -40,77 +40,73 @@ fn test_corpus_for_bash_language(seed: usize) { } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_c_language(seed: usize) { +fn test_corpus_for_c(seed: usize) { test_language_corpus("c", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_cpp_language(seed: usize) { +fn test_corpus_for_cpp(seed: usize) { test_language_corpus("cpp", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_embedded_template_language(seed: usize) { +fn test_corpus_for_embedded_template(seed: usize) { test_language_corpus("embedded-template", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_go_language(seed: usize) { +fn test_corpus_for_go(seed: usize) { test_language_corpus("go", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_html_language(seed: usize) { +fn test_corpus_for_html(seed: usize) { test_language_corpus("html", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_java_language(seed: usize) { - test_language_corpus( - "java", - seed, - Some(&["java - corpus - expressions - switch with unnamed pattern variable"]), - None, - ); +fn test_corpus_for_java(seed: usize) { + test_language_corpus("java", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_javascript_language(seed: usize) { +fn test_corpus_for_javascript(seed: usize) { test_language_corpus("javascript", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_json_language(seed: usize) { +fn test_corpus_for_json(seed: usize) { test_language_corpus("json", seed, None, None); } +#[ignore] #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_php_language(seed: usize) { - test_language_corpus("php", seed, None, Some("php")); +fn test_corpus_for_php(seed: usize) { + test_language_corpus("php", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_python_language(seed: usize) { +fn test_corpus_for_python(seed: usize) { test_language_corpus("python", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_ruby_language(seed: usize) { +fn test_corpus_for_ruby(seed: usize) { test_language_corpus("ruby", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_rust_language(seed: usize) { +fn test_corpus_for_rust(seed: usize) { test_language_corpus("rust", seed, None, None); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_typescript_language(seed: usize) { +fn test_corpus_for_typescript(seed: usize) { test_language_corpus("typescript", seed, None, Some("typescript")); } #[test_with_seed(retry=10, seed=*START_SEED, seed_fn=new_seed)] -fn test_corpus_for_tsx_language(seed: usize) { +fn test_corpus_for_tsx(seed: usize) { test_language_corpus("typescript", seed, None, Some("tsx")); } @@ -120,12 +116,6 @@ pub fn test_language_corpus( skipped: Option<&[&str]>, language_dir: Option<&str>, ) { - if let Some(filter) = LANGUAGE_FILTER.as_ref() { - if language_name != filter { - return; - } - } - let language_dir = language_dir.unwrap_or_default(); let grammars_dir = fixtures_dir().join("grammars"); @@ -209,14 +199,15 @@ pub fn test_language_corpus( if actual_output != test.output { println!("Incorrect initial parse for {test_name}"); - DiffKey::print(); - println!("{}", TestDiff::new(&actual_output, &test.output)); + print_diff_key(); + print_diff(&actual_output, &test.output, true); println!(); return false; } true - }); + }) + .unwrap(); if !passed { failure_count += 1; @@ -243,9 +234,8 @@ pub fn test_language_corpus( } // Perform a random series of edits and reparse. - let edit_count = rand.unsigned(*EDIT_COUNT); - let mut undo_stack = Vec::with_capacity(edit_count); - for _ in 0..=edit_count { + let mut undo_stack = Vec::new(); + for _ in 0..=rand.unsigned(*EDIT_COUNT) { let edit = get_random_edit(&mut rand, &input); undo_stack.push(invert_edit(&input, &edit)); perform_edit(&mut tree, &mut input, &edit).unwrap(); @@ -297,8 +287,8 @@ pub fn test_language_corpus( if actual_output != test.output { println!("Incorrect parse for {test_name} - seed {seed}"); - DiffKey::print(); - println!("{}", TestDiff::new(&actual_output, &test.output)); + print_diff_key(); + print_diff(&actual_output, &test.output, true); println!(); return false; } @@ -311,7 +301,7 @@ pub fn test_language_corpus( } true - }); + }).unwrap(); if !passed { failure_count += 1; @@ -352,7 +342,7 @@ fn test_feature_corpus_files() { let language_name = language_name.to_str().unwrap(); if let Some(filter) = LANGUAGE_FILTER.as_ref() { - if language_name != filter { + if language_name != filter.as_str() { continue; } } @@ -363,16 +353,8 @@ fn test_feature_corpus_files() { grammar_path = test_path.join("grammar.json"); } let error_message_path = test_path.join("expected_error.txt"); - let grammar_json = tree_sitter_generate::load_grammar_file(&grammar_path, None) - .with_context(|| { - format!( - "Could not load grammar file for test language '{language_name}' at {}", - grammar_path.display() - ) - }) - .unwrap(); - let generate_result = - tree_sitter_generate::generate_parser_for_grammar(&grammar_json, Some((0, 0, 0))); + let grammar_json = generate::load_grammar_file(&grammar_path, None).unwrap(); + let generate_result = generate::generate_parser_for_grammar(&grammar_json); if error_message_path.exists() { if EXAMPLE_INCLUDE.is_some() || EXAMPLE_EXCLUDE.is_some() { @@ -388,7 +370,7 @@ fn test_feature_corpus_files() { let actual_message = e.to_string().replace("\r\n", "\n"); if expected_message != actual_message { eprintln!( - "Unexpected error message.\n\nExpected:\n\n`{expected_message}`\nActual:\n\n`{actual_message}`\n", + "Unexpected error message.\n\nExpected:\n\n{expected_message}\nActual:\n\n{actual_message}\n", ); failure_count += 1; } @@ -428,15 +410,17 @@ fn test_feature_corpus_files() { if actual_output == test.output { true } else { - DiffKey::print(); - print!("{}", TestDiff::new(&actual_output, &test.output)); + print_diff_key(); + print_diff(&actual_output, &test.output, true); println!(); false } - }); + }) + .unwrap(); if !passed { failure_count += 1; + continue; } } } diff --git a/crates/cli/src/tests/detect_language.rs b/cli/src/tests/detect_language.rs similarity index 50% rename from crates/cli/src/tests/detect_language.rs rename to cli/src/tests/detect_language.rs index c543c31e..db313f59 100644 --- a/crates/cli/src/tests/detect_language.rs +++ b/cli/src/tests/detect_language.rs @@ -8,20 +8,17 @@ use crate::tests::helpers::fixtures::scratch_dir; fn detect_language_by_first_line_regex() { let strace_dir = tree_sitter_dir( r#"{ - "grammars": [ + "name": "tree-sitter-strace", + "version": "0.0.1", + "tree-sitter": [ { - "name": "strace", - "path": ".", "scope": "source.strace", "file-types": [ "strace" ], "first-line-regex": "[0-9:.]* *execve" } - ], - "metadata": { - "version": "0.0.1" - } + ] } "#, "strace", @@ -32,7 +29,7 @@ fn detect_language_by_first_line_regex() { .find_language_configurations_at_path(strace_dir.path(), false) .unwrap(); - // this is just to validate that we can read the tree-sitter.json correctly + // this is just to validate that we can read the package.json correctly assert_eq!(config[0].scope.as_ref().unwrap(), "source.strace"); let file_name = strace_dir.path().join("strace.log"); @@ -59,19 +56,16 @@ fn detect_language_by_first_line_regex() { let dummy_dir = tree_sitter_dir( r#"{ - "grammars": [ + "name": "tree-sitter-dummy", + "version": "0.0.1", + "tree-sitter": [ { - "name": "dummy", "scope": "source.dummy", - "path": ".", "file-types": [ "dummy" ] } - ], - "metadata": { - "version": "0.0.1" - } + ] } "#, "dummy", @@ -89,123 +83,9 @@ fn detect_language_by_first_line_regex() { ); } -#[test] -fn detect_language_by_double_barrel_file_extension() { - let blade_dir = tree_sitter_dir( - r#"{ - "grammars": [ - { - "name": "blade", - "path": ".", - "scope": "source.blade", - "file-types": [ - "blade.php" - ] - } - ], - "metadata": { - "version": "0.0.1" - } -} -"#, - "blade", - ); - - let mut loader = Loader::with_parser_lib_path(scratch_dir().to_path_buf()); - let config = loader - .find_language_configurations_at_path(blade_dir.path(), false) - .unwrap(); - - // this is just to validate that we can read the tree-sitter.json correctly - assert_eq!(config[0].scope.as_ref().unwrap(), "source.blade"); - - let file_name = blade_dir.path().join("foo.blade.php"); - fs::write(&file_name, "").unwrap(); - assert_eq!( - get_lang_scope(&loader, &file_name), - Some("source.blade".into()) - ); -} - -#[test] -fn detect_language_without_filename() { - let gitignore_dir = tree_sitter_dir( - r#"{ - "grammars": [ - { - "name": "gitignore", - "path": ".", - "scope": "source.gitignore", - "file-types": [ - ".gitignore" - ] - } - ], - "metadata": { - "version": "0.0.1" - } -} -"#, - "gitignore", - ); - - let mut loader = Loader::with_parser_lib_path(scratch_dir().to_path_buf()); - let config = loader - .find_language_configurations_at_path(gitignore_dir.path(), false) - .unwrap(); - - // this is just to validate that we can read the tree-sitter.json correctly - assert_eq!(config[0].scope.as_ref().unwrap(), "source.gitignore"); - - let file_name = gitignore_dir.path().join(".gitignore"); - fs::write(&file_name, "").unwrap(); - assert_eq!( - get_lang_scope(&loader, &file_name), - Some("source.gitignore".into()) - ); -} - -#[test] -fn detect_language_without_file_extension() { - let ssh_config_dir = tree_sitter_dir( - r#"{ - "grammars": [ - { - "name": "ssh_config", - "path": ".", - "scope": "source.ssh_config", - "file-types": [ - "ssh_config" - ] - } - ], - "metadata": { - "version": "0.0.1" - } -} -"#, - "ssh_config", - ); - - let mut loader = Loader::with_parser_lib_path(scratch_dir().to_path_buf()); - let config = loader - .find_language_configurations_at_path(ssh_config_dir.path(), false) - .unwrap(); - - // this is just to validate that we can read the tree-sitter.json correctly - assert_eq!(config[0].scope.as_ref().unwrap(), "source.ssh_config"); - - let file_name = ssh_config_dir.path().join("ssh_config"); - fs::write(&file_name, "").unwrap(); - assert_eq!( - get_lang_scope(&loader, &file_name), - Some("source.ssh_config".into()) - ); -} - -fn tree_sitter_dir(tree_sitter_json: &str, name: &str) -> tempfile::TempDir { +fn tree_sitter_dir(package_json: &str, name: &str) -> tempfile::TempDir { let temp_dir = tempfile::tempdir().unwrap(); - fs::write(temp_dir.path().join("tree-sitter.json"), tree_sitter_json).unwrap(); + fs::write(temp_dir.path().join("package.json"), package_json).unwrap(); fs::create_dir_all(temp_dir.path().join("src/tree_sitter")).unwrap(); fs::write( temp_dir.path().join("src/grammar.json"), @@ -215,7 +95,7 @@ fn tree_sitter_dir(tree_sitter_json: &str, name: &str) -> tempfile::TempDir { fs::write( temp_dir.path().join("src/parser.c"), format!( - r#" + r##" #include "tree_sitter/parser.h" #ifdef _WIN32 #define TS_PUBLIC __declspec(dllexport) @@ -223,13 +103,13 @@ fn tree_sitter_dir(tree_sitter_json: &str, name: &str) -> tempfile::TempDir { #define TS_PUBLIC __attribute__((visibility("default"))) #endif TS_PUBLIC const TSLanguage *tree_sitter_{name}() {{}} - "# + "## ), ) .unwrap(); fs::write( temp_dir.path().join("src/tree_sitter/parser.h"), - include_str!("../../../../lib/src/parser.h"), + include_str!("../../../lib/src/parser.h"), ) .unwrap(); temp_dir diff --git a/cli/src/tests/helpers/allocations.rs b/cli/src/tests/helpers/allocations.rs new file mode 100644 index 00000000..103cb092 --- /dev/null +++ b/cli/src/tests/helpers/allocations.rs @@ -0,0 +1,121 @@ +use std::{ + collections::HashMap, + os::raw::c_void, + sync::{ + atomic::{AtomicBool, AtomicUsize, Ordering::SeqCst}, + Mutex, + }, +}; + +#[ctor::ctor] +unsafe fn initialize_allocation_recording() { + tree_sitter::set_allocator( + Some(ts_record_malloc), + Some(ts_record_calloc), + Some(ts_record_realloc), + Some(ts_record_free), + ); +} + +#[derive(Debug, PartialEq, Eq, Hash)] +struct Allocation(*const c_void); +unsafe impl Send for Allocation {} +unsafe impl Sync for Allocation {} + +#[derive(Default)] +struct AllocationRecorder { + enabled: AtomicBool, + allocation_count: AtomicUsize, + outstanding_allocations: Mutex>, +} + +thread_local! { + static RECORDER: AllocationRecorder = AllocationRecorder::default(); +} + +extern "C" { + fn malloc(size: usize) -> *mut c_void; + fn calloc(count: usize, size: usize) -> *mut c_void; + fn realloc(ptr: *mut c_void, size: usize) -> *mut c_void; + fn free(ptr: *mut c_void); +} + +pub fn record(f: impl FnOnce() -> T) -> T { + RECORDER.with(|recorder| { + recorder.enabled.store(true, SeqCst); + recorder.allocation_count.store(0, SeqCst); + recorder.outstanding_allocations.lock().unwrap().clear(); + }); + + let value = f(); + + let outstanding_allocation_indices = RECORDER.with(|recorder| { + recorder.enabled.store(false, SeqCst); + recorder.allocation_count.store(0, SeqCst); + recorder + .outstanding_allocations + .lock() + .unwrap() + .drain() + .map(|e| e.1) + .collect::>() + }); + assert!( + outstanding_allocation_indices.is_empty(), + "Leaked allocation indices: {outstanding_allocation_indices:?}" + ); + value +} + +fn record_alloc(ptr: *mut c_void) { + RECORDER.with(|recorder| { + if recorder.enabled.load(SeqCst) { + let count = recorder.allocation_count.fetch_add(1, SeqCst); + recorder + .outstanding_allocations + .lock() + .unwrap() + .insert(Allocation(ptr), count); + } + }); +} + +fn record_dealloc(ptr: *mut c_void) { + RECORDER.with(|recorder| { + if recorder.enabled.load(SeqCst) { + recorder + .outstanding_allocations + .lock() + .unwrap() + .remove(&Allocation(ptr)); + } + }); +} + +unsafe extern "C" fn ts_record_malloc(size: usize) -> *mut c_void { + let result = malloc(size); + record_alloc(result); + result +} + +unsafe extern "C" fn ts_record_calloc(count: usize, size: usize) -> *mut c_void { + let result = calloc(count, size); + record_alloc(result); + result +} + +unsafe extern "C" fn ts_record_realloc(ptr: *mut c_void, size: usize) -> *mut c_void { + let result = realloc(ptr, size); + if ptr.is_null() { + record_alloc(result); + } else if ptr != result { + record_dealloc(ptr); + record_alloc(result); + } + result +} + +unsafe extern "C" fn ts_record_free(ptr: *mut c_void) { + record_dealloc(ptr); + free(ptr); +} diff --git a/cli/src/tests/helpers/dirs.rs b/cli/src/tests/helpers/dirs.rs new file mode 100644 index 00000000..4d1c4982 --- /dev/null +++ b/cli/src/tests/helpers/dirs.rs @@ -0,0 +1,47 @@ +lazy_static! { + pub static ref ROOT_DIR: PathBuf = PathBuf::from(env!("CARGO_MANIFEST_DIR")).parent().unwrap().to_owned(); + pub static ref FIXTURES_DIR: PathBuf = ROOT_DIR.join("test").join("fixtures"); + pub static ref HEADER_DIR: PathBuf = ROOT_DIR.join("lib").join("include"); + pub static ref GRAMMARS_DIR: PathBuf = ROOT_DIR.join("test").join("fixtures").join("grammars"); + pub static ref SCRATCH_BASE_DIR: PathBuf = { + let result = ROOT_DIR.join("target").join("scratch"); + fs::create_dir_all(&result).unwrap(); + result + }; + pub static ref WASM_DIR: PathBuf = ROOT_DIR.join("target").join("release"); + pub static ref SCRATCH_DIR: PathBuf = { + // https://doc.rust-lang.org/reference/conditional-compilation.html + let vendor = if cfg!(target_vendor = "apple") { + "apple" + } else if cfg!(target_vendor = "fortanix") { + "fortanix" + } else if cfg!(target_vendor = "pc") { + "pc" + } else { + "unknown" + }; + let env = if cfg!(target_env = "gnu") { + "gnu" + } else if cfg!(target_env = "msvc") { + "msvc" + } else if cfg!(target_env = "musl") { + "musl" + } else if cfg!(target_env = "sgx") { + "sgx" + } else { + "unknown" + }; + let endian = if cfg!(target_endian = "little") { + "little" + } else if cfg!(target_endian = "big") { + "big" + } else { + "unknown" + }; + + let machine = format!("{}-{}-{vendor}-{env}-{endian}", std::env::consts::ARCH, std::env::consts::OS); + let result = SCRATCH_BASE_DIR.join(machine); + fs::create_dir_all(&result).unwrap(); + result + }; +} diff --git a/crates/cli/src/tests/helpers/edits.rs b/cli/src/tests/helpers/edits.rs similarity index 100% rename from crates/cli/src/tests/helpers/edits.rs rename to cli/src/tests/helpers/edits.rs diff --git a/crates/cli/src/tests/helpers/fixtures.rs b/cli/src/tests/helpers/fixtures.rs similarity index 62% rename from crates/cli/src/tests/helpers/fixtures.rs rename to cli/src/tests/helpers/fixtures.rs index 0e0ff69d..76f9c9c1 100644 --- a/crates/cli/src/tests/helpers/fixtures.rs +++ b/cli/src/tests/helpers/fixtures.rs @@ -1,30 +1,28 @@ use std::{ env, fs, path::{Path, PathBuf}, - sync::LazyLock, }; use anyhow::Context; +use lazy_static::lazy_static; use tree_sitter::Language; -use tree_sitter_generate::{load_grammar_file, ALLOC_HEADER, ARRAY_HEADER}; use tree_sitter_highlight::HighlightConfiguration; use tree_sitter_loader::{CompileConfig, Loader}; use tree_sitter_tags::TagsConfiguration; -use crate::tests::generate_parser; +use crate::generate::ALLOC_HEADER; include!("./dirs.rs"); -static TEST_LOADER: LazyLock = LazyLock::new(|| { - let mut loader = Loader::with_parser_lib_path(SCRATCH_DIR.clone()); - if env::var("TREE_SITTER_GRAMMAR_DEBUG").is_ok() { - loader.debug_build(true); - } - loader -}); - -#[cfg(feature = "wasm")] -pub static ENGINE: LazyLock = LazyLock::new(Default::default); +lazy_static! { + static ref TEST_LOADER: Loader = { + let mut loader = Loader::with_parser_lib_path(SCRATCH_DIR.clone()); + if env::var("TREE_SITTER_GRAMMAR_DEBUG").is_ok() { + loader.debug_build(true); + } + loader + }; +} pub fn test_loader() -> &'static Loader { &TEST_LOADER @@ -45,22 +43,6 @@ pub fn get_language(name: &str) -> Language { TEST_LOADER.load_language_at_path(config).unwrap() } -pub fn get_test_fixture_language(name: &str) -> Language { - get_test_fixture_language_internal(name, false) -} - -#[cfg(feature = "wasm")] -pub fn get_test_fixture_language_wasm(name: &str) -> Language { - get_test_fixture_language_internal(name, true) -} - -fn get_test_fixture_language_internal(name: &str, wasm: bool) -> Language { - let grammar_dir_path = fixtures_dir().join("test_grammars").join(name); - let grammar_json = load_grammar_file(&grammar_dir_path.join("grammar.js"), None).unwrap(); - let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); - get_test_language_internal(&parser_name, &parser_code, Some(&grammar_dir_path), wasm) -} - pub fn get_language_queries_path(language_name: &str) -> PathBuf { GRAMMARS_DIR.join(language_name).join("queries") } @@ -99,20 +81,11 @@ pub fn get_tags_config(language_name: &str) -> TagsConfiguration { } pub fn get_test_language(name: &str, parser_code: &str, path: Option<&Path>) -> Language { - get_test_language_internal(name, parser_code, path, false) -} - -fn get_test_language_internal( - name: &str, - parser_code: &str, - path: Option<&Path>, - wasm: bool, -) -> Language { let src_dir = scratch_dir().join("src").join(name); fs::create_dir_all(&src_dir).unwrap(); let parser_path = src_dir.join("parser.c"); - if !fs::read_to_string(&parser_path).is_ok_and(|content| content == parser_code) { + if !fs::read_to_string(&parser_path).map_or(false, |content| content == parser_code) { fs::write(&parser_path, parser_code).unwrap(); } @@ -121,7 +94,8 @@ fn get_test_language_internal( if scanner_path.exists() { let scanner_code = fs::read_to_string(&scanner_path).unwrap(); let scanner_copy_path = src_dir.join("scanner.c"); - if !fs::read_to_string(&scanner_copy_path).is_ok_and(|content| content == scanner_code) + if !fs::read_to_string(&scanner_copy_path) + .map_or(false, |content| content == scanner_code) { fs::write(&scanner_copy_path, scanner_code).unwrap(); } @@ -136,16 +110,18 @@ fn get_test_language_internal( let header_path = src_dir.join("tree_sitter"); fs::create_dir_all(&header_path).unwrap(); - for (file, content) in [ + [ ("alloc.h", ALLOC_HEADER), - ("array.h", ARRAY_HEADER), + ("array.h", tree_sitter::ARRAY_HEADER), ("parser.h", tree_sitter::PARSER_HEADER), - ] { + ] + .iter() + .for_each(|(file, content)| { let file = header_path.join(file); fs::write(&file, content) .with_context(|| format!("Failed to write {:?}", file.file_name().unwrap())) .unwrap(); - } + }); let paths_to_check = if let Some(scanner_path) = &scanner_path { vec![parser_path, scanner_path.clone()] @@ -157,21 +133,5 @@ fn get_test_language_internal( config.header_paths = vec![&HEADER_DIR]; config.name = name.to_string(); - if wasm { - #[cfg(feature = "wasm")] - { - let mut loader = Loader::with_parser_lib_path(SCRATCH_DIR.clone()); - loader.use_wasm(&ENGINE); - if env::var("TREE_SITTER_GRAMMAR_DEBUG").is_ok() { - loader.debug_build(true); - } - loader.load_language_at_path_with_name(config).unwrap() - } - #[cfg(not(feature = "wasm"))] - { - unimplemented!("Wasm feature is not enabled") - } - } else { - TEST_LOADER.load_language_at_path_with_name(config).unwrap() - } + TEST_LOADER.load_language_at_path_with_name(config).unwrap() } diff --git a/crates/cli/src/tests/helpers.rs b/cli/src/tests/helpers/mod.rs similarity index 67% rename from crates/cli/src/tests/helpers.rs rename to cli/src/tests/helpers/mod.rs index 4d2e6128..298179c7 100644 --- a/crates/cli/src/tests/helpers.rs +++ b/cli/src/tests/helpers/mod.rs @@ -1,4 +1,4 @@ -pub use crate::fuzz::allocations; +pub mod allocations; pub mod edits; pub(super) mod fixtures; pub(super) mod query_helpers; diff --git a/crates/cli/src/tests/helpers/query_helpers.rs b/cli/src/tests/helpers/query_helpers.rs similarity index 88% rename from crates/cli/src/tests/helpers/query_helpers.rs rename to cli/src/tests/helpers/query_helpers.rs index e2c68f17..9e7a6f63 100644 --- a/crates/cli/src/tests/helpers/query_helpers.rs +++ b/cli/src/tests/helpers/query_helpers.rs @@ -1,7 +1,6 @@ use std::{cmp::Ordering, fmt::Write, ops::Range}; use rand::prelude::Rng; -use streaming_iterator::{IntoStreamingIterator, StreamingIterator}; use tree_sitter::{ Language, Node, Parser, Point, Query, QueryCapture, QueryCursor, QueryMatch, Tree, TreeCursor, }; @@ -12,7 +11,7 @@ pub struct Pattern { named: bool, field: Option<&'static str>, capture: Option, - children: Vec, + children: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -131,12 +130,11 @@ impl Pattern { if self.named { string.push('('); - let mut has_contents = if let Some(kind) = &self.kind { + let mut has_contents = false; + if let Some(kind) = &self.kind { write!(string, "{kind}").unwrap(); - true - } else { - false - }; + has_contents = true; + } for child in &self.children { let indent = indent + 2; if has_contents { @@ -182,9 +180,7 @@ impl Pattern { } matches.sort_unstable(); - for m in &mut matches { - m.last_node = None; - } + matches.iter_mut().for_each(|m| m.last_node = None); matches.dedup(); matches } @@ -225,7 +221,7 @@ impl Pattern { } // Find every matching combination of child patterns and child nodes. - let mut finished_matches = Vec::>::new(); + let mut finished_matches = Vec::::new(); if cursor.goto_first_child() { let mut match_states = vec![(0, mat)]; loop { @@ -276,13 +272,13 @@ impl std::fmt::Display for Pattern { } } -impl PartialOrd for Match<'_, '_> { +impl<'a, 'tree> PartialOrd for Match<'a, 'tree> { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } -impl Ord for Match<'_, '_> { +impl<'a, 'tree> Ord for Match<'a, 'tree> { // Tree-sitter returns matches in the order that they terminate // during a depth-first walk of the tree. If multiple matches // terminate on the same node, those matches are produced in the @@ -323,44 +319,44 @@ pub fn assert_query_matches( let tree = parser.parse(source, None).unwrap(); let mut cursor = QueryCursor::new(); let matches = cursor.matches(query, tree.root_node(), source.as_bytes()); - pretty_assertions::assert_eq!(expected, collect_matches(matches, query, source)); - pretty_assertions::assert_eq!(false, cursor.did_exceed_match_limit()); + pretty_assertions::assert_eq!(collect_matches(matches, query, source), expected); + pretty_assertions::assert_eq!(cursor.did_exceed_match_limit(), false); } pub fn collect_matches<'a>( - mut matches: impl StreamingIterator>, + matches: impl Iterator>, query: &'a Query, source: &'a str, ) -> Vec<(usize, Vec<(&'a str, &'a str)>)> { - let mut result = Vec::new(); - while let Some(m) = matches.next() { - result.push(( - m.pattern_index, - format_captures(m.captures.iter().into_streaming_iter_ref(), query, source), - )); - } - result + matches + .map(|m| { + ( + m.pattern_index, + format_captures(m.captures.iter().copied(), query, source), + ) + }) + .collect() } pub fn collect_captures<'a>( - captures: impl StreamingIterator, usize)>, + captures: impl Iterator, usize)>, query: &'a Query, source: &'a str, ) -> Vec<(&'a str, &'a str)> { - format_captures(captures.map(|(m, i)| m.captures[*i]), query, source) + format_captures(captures.map(|(m, i)| m.captures[i]), query, source) } fn format_captures<'a>( - mut captures: impl StreamingIterator>, + captures: impl Iterator>, query: &'a Query, source: &'a str, ) -> Vec<(&'a str, &'a str)> { - let mut result = Vec::new(); - while let Some(capture) = captures.next() { - result.push(( - query.capture_names()[capture.index as usize], - capture.node.utf8_text(source.as_bytes()).unwrap(), - )); - } - result + captures + .map(|capture| { + ( + query.capture_names()[capture.index as usize], + capture.node.utf8_text(source.as_bytes()).unwrap(), + ) + }) + .collect() } diff --git a/crates/cli/src/tests/highlight_test.rs b/cli/src/tests/highlight_test.rs similarity index 92% rename from crates/cli/src/tests/highlight_test.rs rename to cli/src/tests/highlight_test.rs index 88209bfe..ab9dfcbe 100644 --- a/crates/cli/src/tests/highlight_test.rs +++ b/cli/src/tests/highlight_test.rs @@ -3,81 +3,65 @@ use std::{ fs, os::raw::c_char, ptr, slice, str, - sync::{ - atomic::{AtomicUsize, Ordering}, - LazyLock, - }, + sync::atomic::{AtomicUsize, Ordering}, }; +use lazy_static::lazy_static; use tree_sitter_highlight::{ c, Error, Highlight, HighlightConfiguration, HighlightEvent, Highlighter, HtmlRenderer, }; use super::helpers::fixtures::{get_highlight_config, get_language, get_language_queries_path}; -static JS_HIGHLIGHT: LazyLock = - LazyLock::new(|| get_highlight_config("javascript", Some("injections.scm"), &HIGHLIGHT_NAMES)); - -static JSDOC_HIGHLIGHT: LazyLock = - LazyLock::new(|| get_highlight_config("jsdoc", None, &HIGHLIGHT_NAMES)); - -static HTML_HIGHLIGHT: LazyLock = - LazyLock::new(|| get_highlight_config("html", Some("injections.scm"), &HIGHLIGHT_NAMES)); - -static EJS_HIGHLIGHT: LazyLock = LazyLock::new(|| { - get_highlight_config( +lazy_static! { + static ref JS_HIGHLIGHT: HighlightConfiguration = + get_highlight_config("javascript", Some("injections.scm"), &HIGHLIGHT_NAMES); + static ref JSDOC_HIGHLIGHT: HighlightConfiguration = + get_highlight_config("jsdoc", None, &HIGHLIGHT_NAMES); + static ref HTML_HIGHLIGHT: HighlightConfiguration = + get_highlight_config("html", Some("injections.scm"), &HIGHLIGHT_NAMES); + static ref EJS_HIGHLIGHT: HighlightConfiguration = get_highlight_config( "embedded-template", Some("injections-ejs.scm"), - &HIGHLIGHT_NAMES, - ) -}); - -static RUST_HIGHLIGHT: LazyLock = - LazyLock::new(|| get_highlight_config("rust", Some("injections.scm"), &HIGHLIGHT_NAMES)); - -static HIGHLIGHT_NAMES: LazyLock> = LazyLock::new(|| { - [ + &HIGHLIGHT_NAMES + ); + static ref RUST_HIGHLIGHT: HighlightConfiguration = + get_highlight_config("rust", Some("injections.scm"), &HIGHLIGHT_NAMES); + static ref HIGHLIGHT_NAMES: Vec = [ "attribute", "boolean", "carriage-return", "comment", "constant", - "constant.builtin", "constructor", - "embedded", - "function", "function.builtin", + "function", + "embedded", "keyword", - "module", - "number", "operator", - "property", "property.builtin", + "property", "punctuation", "punctuation.bracket", "punctuation.delimiter", "punctuation.special", "string", - "string.special", "tag", - "type", "type.builtin", - "variable", + "type", "variable.builtin", "variable.parameter", + "variable", ] .iter() .copied() .map(String::from) - .collect() -}); - -static HTML_ATTRS: LazyLock> = LazyLock::new(|| { - HIGHLIGHT_NAMES + .collect(); + static ref HTML_ATTRS: Vec = HIGHLIGHT_NAMES .iter() .map(|s| format!("class={s}")) - .collect() -}); + .collect(); +} #[test] fn test_highlighting_javascript() { @@ -350,11 +334,12 @@ fn test_highlighting_empty_lines() { fn test_highlighting_carriage_returns() { let source = "a = \"a\rb\"\r\nb\r"; + // FIXME(amaanq): figure why this changed w/ JS's grammar changes assert_eq!( &to_html(source, &JS_HIGHLIGHT).unwrap(), &[ - "a = "ab"\n", - "b\n", + "a = "ab"\n", + "b\n", ], ); } @@ -481,7 +466,7 @@ fn test_highlighting_cancellation() { // The initial `highlight` call, which eagerly parses the outer document, should not fail. let mut highlighter = Highlighter::new(); - let mut events = highlighter + let events = highlighter .highlight( &HTML_HIGHLIGHT, source.as_bytes(), @@ -492,18 +477,14 @@ fn test_highlighting_cancellation() { // Iterating the scopes should not panic. It should return an error once the // cancellation is detected. - let found_cancellation_error = events.any(|event| match event { - Ok(_) => false, - Err(Error::Cancelled) => true, - Err(Error::InvalidLanguage | Error::Unknown) => { - unreachable!("Unexpected error type while iterating events") + for event in events { + if let Err(e) = event { + assert_eq!(e, Error::Cancelled); + return; } - }); + } - assert!( - found_cancellation_error, - "Expected a cancellation error while iterating events" - ); + panic!("Expected an error while iterating highlighter"); } #[test] @@ -601,7 +582,7 @@ fn test_highlighting_via_c_api() { let output_line_offsets = unsafe { slice::from_raw_parts(output_line_offsets, output_line_count as usize) }; - let mut lines = Vec::with_capacity(output_line_count as usize); + let mut lines = Vec::new(); for i in 0..(output_line_count as usize) { let line_start = output_line_offsets[i] as usize; let line_end = output_line_offsets @@ -737,9 +718,7 @@ fn to_html<'a>( .map(Highlight), ); renderer - .render(events, src, &|highlight, output| { - output.extend(HTML_ATTRS[highlight.0].as_bytes()); - }) + .render(events, src, &|highlight| HTML_ATTRS[highlight.0].as_bytes()) .unwrap(); Ok(renderer .lines() diff --git a/cli/src/tests/language_test.rs b/cli/src/tests/language_test.rs new file mode 100644 index 00000000..681b93f3 --- /dev/null +++ b/cli/src/tests/language_test.rs @@ -0,0 +1,65 @@ +use tree_sitter::Parser; + +use super::helpers::fixtures::get_language; + +#[test] +fn test_lookahead_iterator() { + let mut parser = Parser::new(); + let language = get_language("rust"); + parser.set_language(&language).unwrap(); + + let tree = parser.parse("struct Stuff {}", None).unwrap(); + + let mut cursor = tree.walk(); + + assert!(cursor.goto_first_child()); // struct + assert!(cursor.goto_first_child()); // struct keyword + + let next_state = cursor.node().next_parse_state(); + assert_ne!(next_state, 0); + assert_eq!( + next_state, + language.next_state(cursor.node().parse_state(), cursor.node().grammar_id()) + ); + assert!((next_state as usize) < language.parse_state_count()); + assert!(cursor.goto_next_sibling()); // type_identifier + assert_eq!(next_state, cursor.node().parse_state()); + assert_eq!(cursor.node().grammar_name(), "identifier"); + assert_ne!(cursor.node().grammar_id(), cursor.node().kind_id()); + + let expected_symbols = ["//", "/*", "identifier", "line_comment", "block_comment"]; + let mut lookahead = language.lookahead_iterator(next_state).unwrap(); + assert_eq!(*lookahead.language(), language); + assert!(lookahead.iter_names().eq(expected_symbols)); + + lookahead.reset_state(next_state); + assert!(lookahead.iter_names().eq(expected_symbols)); + + lookahead.reset(&language, next_state); + assert!(lookahead + .map(|s| language.node_kind_for_id(s).unwrap()) + .eq(expected_symbols)); +} + +#[test] +fn test_lookahead_iterator_modifiable_only_by_mut() { + let mut parser = Parser::new(); + let language = get_language("rust"); + parser.set_language(&language).unwrap(); + + let tree = parser.parse("struct Stuff {}", None).unwrap(); + + let mut cursor = tree.walk(); + + assert!(cursor.goto_first_child()); // struct + assert!(cursor.goto_first_child()); // struct keyword + + let next_state = cursor.node().next_parse_state(); + assert_ne!(next_state, 0); + + let mut lookahead = language.lookahead_iterator(next_state).unwrap(); + let _ = lookahead.next(); + + let mut names = lookahead.iter_names(); + let _ = names.next(); +} diff --git a/cli/src/tests/mod.rs b/cli/src/tests/mod.rs new file mode 100644 index 00000000..234172e4 --- /dev/null +++ b/cli/src/tests/mod.rs @@ -0,0 +1,26 @@ +mod async_context_test; +mod corpus_test; +mod detect_language; +mod helpers; +mod highlight_test; +mod language_test; +mod node_test; +mod parser_hang_test; +mod parser_test; +mod pathological_test; +mod query_test; +mod tags_test; +mod test_highlight_test; +mod test_tags_test; +mod text_provider_test; +mod tree_test; + +#[cfg(feature = "wasm")] +mod wasm_language_test; + +pub use crate::fuzz::{ + allocations, + edits::{get_random_edit, invert_edit}, + random::Rand, + ITERATION_COUNT, +}; diff --git a/crates/cli/src/tests/node_test.rs b/cli/src/tests/node_test.rs similarity index 82% rename from crates/cli/src/tests/node_test.rs rename to cli/src/tests/node_test.rs index 614bfdb9..4b987a53 100644 --- a/crates/cli/src/tests/node_test.rs +++ b/cli/src/tests/node_test.rs @@ -1,5 +1,4 @@ -use tree_sitter::{InputEdit, Node, Parser, Point, Tree}; -use tree_sitter_generate::load_grammar_file; +use tree_sitter::{Node, Parser, Point, Tree}; use super::{ get_random_edit, @@ -7,8 +6,8 @@ use super::{ Rand, }; use crate::{ + generate::{generate_parser_for_grammar, load_grammar_file}, parse::perform_edit, - tests::{generate_parser, helpers::fixtures::get_test_fixture_language}, }; const JSON_EXAMPLE: &str = r#" @@ -172,22 +171,20 @@ fn test_node_child() { assert_eq!(tree.root_node().parent(), None); assert_eq!( - tree.root_node().child_with_descendant(null_node).unwrap(), + tree.root_node() + .child_containing_descendant(null_node) + .unwrap(), array_node ); assert_eq!( - array_node.child_with_descendant(null_node).unwrap(), + array_node.child_containing_descendant(null_node).unwrap(), object_node ); assert_eq!( - object_node.child_with_descendant(null_node).unwrap(), + object_node.child_containing_descendant(null_node).unwrap(), pair_node ); - assert_eq!( - pair_node.child_with_descendant(null_node).unwrap(), - null_node - ); - assert_eq!(null_node.child_with_descendant(null_node), None); + assert_eq!(pair_node.child_containing_descendant(null_node), None); } #[test] @@ -289,14 +286,10 @@ fn test_parent_of_zero_width_node() { assert_eq!(block_parent.to_string(), "(function_definition name: (identifier) parameters: (parameters (identifier)) body: (block))"); assert_eq!( - root.child_with_descendant(block).unwrap(), + root.child_containing_descendant(block).unwrap(), function_definition ); - assert_eq!( - function_definition.child_with_descendant(block).unwrap(), - block - ); - assert_eq!(block.child_with_descendant(block), None); + assert_eq!(function_definition.child_containing_descendant(block), None); let code = ""; parser.set_language(&get_language("html")).unwrap(); @@ -309,65 +302,6 @@ fn test_parent_of_zero_width_node() { assert_eq!(parent, script_element); } -#[test] -fn test_next_sibling_of_zero_width_node() { - let mut parser = Parser::new(); - let language = get_test_fixture_language("next_sibling_from_zwt"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("abdef", None).unwrap(); - - let root_node = tree.root_node(); - let missing_c = root_node.child(2).unwrap(); - assert!(missing_c.is_missing()); - assert_eq!(missing_c.kind(), "c"); - let node_d = root_node.child(3).unwrap(); - assert_eq!(missing_c.next_sibling().unwrap(), node_d); - - let prev_sibling = node_d.prev_sibling().unwrap(); - assert_eq!(prev_sibling, missing_c); -} - -#[test] -fn test_first_child_for_offset() { - let mut parser = Parser::new(); - parser.set_language(&get_language("javascript")).unwrap(); - let tree = parser.parse("x10 + 100", None).unwrap(); - let sum_node = tree.root_node().child(0).unwrap().child(0).unwrap(); - - assert_eq!( - sum_node.first_child_for_byte(0).unwrap().kind(), - "identifier" - ); - assert_eq!( - sum_node.first_child_for_byte(1).unwrap().kind(), - "identifier" - ); - assert_eq!(sum_node.first_child_for_byte(3).unwrap().kind(), "+"); - assert_eq!(sum_node.first_child_for_byte(5).unwrap().kind(), "number"); -} - -#[test] -fn test_first_named_child_for_offset() { - let mut parser = Parser::new(); - parser.set_language(&get_language("javascript")).unwrap(); - let tree = parser.parse("x10 + 100", None).unwrap(); - let sum_node = tree.root_node().child(0).unwrap().child(0).unwrap(); - - assert_eq!( - sum_node.first_named_child_for_byte(0).unwrap().kind(), - "identifier" - ); - assert_eq!( - sum_node.first_named_child_for_byte(1).unwrap().kind(), - "identifier" - ); - assert_eq!( - sum_node.first_named_child_for_byte(3).unwrap().kind(), - "number" - ); -} - #[test] fn test_node_field_name_for_child() { let mut parser = Parser::new(); @@ -535,27 +469,26 @@ fn test_node_named_child() { assert_eq!(tree.root_node().parent(), None); assert_eq!( - tree.root_node().child_with_descendant(null_node).unwrap(), + tree.root_node() + .child_containing_descendant(null_node) + .unwrap(), array_node ); assert_eq!( - array_node.child_with_descendant(null_node).unwrap(), + array_node.child_containing_descendant(null_node).unwrap(), object_node ); assert_eq!( - object_node.child_with_descendant(null_node).unwrap(), + object_node.child_containing_descendant(null_node).unwrap(), pair_node ); - assert_eq!( - pair_node.child_with_descendant(null_node).unwrap(), - null_node - ); - assert_eq!(null_node.child_with_descendant(null_node), None); + assert_eq!(pair_node.child_containing_descendant(null_node), None); } #[test] fn test_node_named_child_with_aliases_and_extras() { - let (parser_name, parser_code) = generate_parser(GRAMMAR_WITH_ALIASES_AND_EXTRAS).unwrap(); + let (parser_name, parser_code) = + generate_parser_for_grammar(GRAMMAR_WITH_ALIASES_AND_EXTRAS).unwrap(); let mut parser = Parser::new(); parser @@ -725,33 +658,6 @@ fn test_node_descendant_for_range() { assert_eq!(pair_node.end_byte(), string_index + 9); assert_eq!(pair_node.start_position(), Point::new(6, 4)); assert_eq!(pair_node.end_position(), Point::new(6, 13)); - - // Zero-width token - { - let code = ""; - let mut parser = Parser::new(); - parser.set_language(&get_language("html")).unwrap(); - - let tree = parser.parse(code, None).unwrap(); - let root = tree.root_node(); - - let child = root - .named_descendant_for_point_range(Point::new(0, 8), Point::new(0, 8)) - .unwrap(); - assert_eq!(child.kind(), "raw_text"); - - let child2 = root.named_descendant_for_byte_range(8, 8).unwrap(); - assert_eq!(child2.kind(), "raw_text"); - - assert_eq!(child, child2); - } - - // Negative test, start > end - assert_eq!(array_node.descendant_for_byte_range(1, 0), None); - assert_eq!( - array_node.descendant_for_point_range(Point::new(6, 8), Point::new(6, 7)), - None - ); } #[test] @@ -829,106 +735,6 @@ fn test_node_is_extra() { assert!(comment_node.is_extra()); } -#[test] -fn test_node_is_error() { - let mut parser = Parser::new(); - parser.set_language(&get_language("javascript")).unwrap(); - let tree = parser.parse("foo(", None).unwrap(); - let root_node = tree.root_node(); - assert_eq!(root_node.kind(), "program"); - assert!(root_node.has_error()); - - let child = root_node.child(0).unwrap(); - assert_eq!(child.kind(), "ERROR"); - assert!(child.is_error()); -} - -#[test] -fn test_edit_point() { - let edit = InputEdit { - start_byte: 5, - old_end_byte: 5, - new_end_byte: 10, - start_position: Point::new(0, 5), - old_end_position: Point::new(0, 5), - new_end_position: Point::new(0, 10), - }; - - // Point after edit - let mut point = Point::new(0, 8); - let mut byte = 8; - edit.edit_point(&mut point, &mut byte); - assert_eq!(point, Point::new(0, 13)); - assert_eq!(byte, 13); - - // Point before edit - let mut point = Point::new(0, 2); - let mut byte = 2; - edit.edit_point(&mut point, &mut byte); - assert_eq!(point, Point::new(0, 2)); - assert_eq!(byte, 2); - - // Point at edit start - let mut point = Point::new(0, 5); - let mut byte = 5; - edit.edit_point(&mut point, &mut byte); - assert_eq!(point, Point::new(0, 10)); - assert_eq!(byte, 10); -} - -#[test] -fn test_edit_range() { - use tree_sitter::{InputEdit, Point, Range}; - - let edit = InputEdit { - start_byte: 10, - old_end_byte: 15, - new_end_byte: 20, - start_position: Point::new(1, 0), - old_end_position: Point::new(1, 5), - new_end_position: Point::new(2, 0), - }; - - // Range after edit - let mut range = Range { - start_byte: 20, - end_byte: 25, - start_point: Point::new(2, 0), - end_point: Point::new(2, 5), - }; - edit.edit_range(&mut range); - assert_eq!(range.start_byte, 25); - assert_eq!(range.end_byte, 30); - assert_eq!(range.start_point, Point::new(3, 0)); - assert_eq!(range.end_point, Point::new(3, 5)); - - // Range before edit - let mut range = Range { - start_byte: 5, - end_byte: 8, - start_point: Point::new(0, 5), - end_point: Point::new(0, 8), - }; - edit.edit_range(&mut range); - assert_eq!(range.start_byte, 5); - assert_eq!(range.end_byte, 8); - assert_eq!(range.start_point, Point::new(0, 5)); - assert_eq!(range.end_point, Point::new(0, 8)); - - // Range overlapping edit - let mut range = Range { - start_byte: 8, - end_byte: 12, - start_point: Point::new(0, 8), - end_point: Point::new(1, 2), - }; - edit.edit_range(&mut range); - assert_eq!(range.start_byte, 8); - assert_eq!(range.end_byte, 10); - assert_eq!(range.start_point, Point::new(0, 8)); - assert_eq!(range.end_point, Point::new(1, 0)); -} - #[test] fn test_node_sexp() { let mut parser = Parser::new(); @@ -948,7 +754,7 @@ fn test_node_sexp() { #[test] fn test_node_field_names() { - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#" { "name": "test_grammar_with_fields", @@ -1058,7 +864,7 @@ fn test_node_field_names() { #[test] fn test_node_field_calls_in_language_without_fields() { - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#" { "name": "test_grammar_with_no_fields", @@ -1116,7 +922,7 @@ fn test_node_is_named_but_aliased_as_anonymous() { ) .unwrap(); - let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); + let (parser_name, parser_code) = generate_parser_for_grammar(&grammar_json).unwrap(); let mut parser = Parser::new(); let language = get_test_language(&parser_name, &parser_code, None); @@ -1194,31 +1000,6 @@ fn test_node_numeric_symbols_respect_simple_aliases() { assert_eq!(unary_minus_node.kind_id(), binary_minus_node.kind_id()); } -#[test] -fn test_hidden_zero_width_node_with_visible_child() { - let code = r" -class Foo { - std:: -private: - std::string s; -}; -"; - - let mut parser = Parser::new(); - parser.set_language(&get_language("cpp")).unwrap(); - let tree = parser.parse(code, None).unwrap(); - let root = tree.root_node(); - - let class_specifier = root.child(0).unwrap(); - let field_decl_list = class_specifier.child_by_field_name("body").unwrap(); - let field_decl = field_decl_list.named_child(0).unwrap(); - let field_ident = field_decl.child_by_field_name("declarator").unwrap(); - assert_eq!( - field_decl.child_with_descendant(field_ident).unwrap(), - field_ident - ); -} - fn get_all_nodes(tree: &Tree) -> Vec { let mut result = Vec::new(); let mut visited_children = false; diff --git a/cli/src/tests/parser_hang_test.rs b/cli/src/tests/parser_hang_test.rs new file mode 100644 index 00000000..e195a885 --- /dev/null +++ b/cli/src/tests/parser_hang_test.rs @@ -0,0 +1,105 @@ +// For some reasons `Command::spawn` doesn't work in CI env for many exotic arches. +#![cfg(all(any(target_arch = "x86_64", target_arch = "x86"), not(sanitizing)))] + +use std::{ + env::VarError, + process::{Command, Stdio}, +}; + +use tree_sitter::Parser; + +use crate::{ + generate::{generate_parser_for_grammar, load_grammar_file}, + tests::helpers::fixtures::{fixtures_dir, get_test_language}, +}; + +// The `sanitizing` cfg is required to don't run tests under specific sunitizer +// because they don't work well with subprocesses _(it's an assumption)_. +// +// Below are two alternative examples of how to disable tests for some arches +// if a way with excluding the whole mod from compilation wouldn't work well. +// +// XXX: Also may be it makes sense to keep such tests as ignored by default +// to omit surprises and enable them on CI by passing an extra option explicitly: +// +// > cargo test -- --include-ignored +// +// #[cfg(all(any(target_arch = "x86_64", target_arch = "x86"), not(sanitizing)))] +// #[cfg_attr(not(all(any(target_arch = "x86_64", target_arch = "x86"), not(sanitizing))), ignore)] +// +#[test] +fn test_grammar_that_should_hang_and_not_segfault() { + let parent_sleep_millis = 1000; + let test_name = "test_grammar_that_should_hang_and_not_segfault"; + let test_var = "CARGO_HANG_TEST"; + + eprintln!(" {test_name}"); + + let tests_exec_path = std::env::args() + .next() + .expect("Failed to get tests executable path"); + + match std::env::var(test_var) { + Ok(v) if v == test_name => { + eprintln!(" child process id {}", std::process::id()); + hang_test(); + } + + Err(VarError::NotPresent) => { + eprintln!(" parent process id {}", std::process::id()); + let mut command = Command::new(tests_exec_path); + command.arg(test_name).env(test_var, test_name); + + if std::env::args().any(|x| x == "--nocapture") { + command.arg("--nocapture"); + } else { + command.stdout(Stdio::null()).stderr(Stdio::null()); + } + + match command.spawn() { + Ok(mut child) => { + std::thread::sleep(std::time::Duration::from_millis(parent_sleep_millis)); + match child.try_wait() { + Ok(Some(status)) if status.success() => { + panic!("Child didn't hang and exited successfully") + } + Ok(Some(status)) => panic!( + "Child didn't hang and exited with status code: {:?}", + status.code() + ), + _ => (), + } + if let Err(e) = child.kill() { + eprintln!( + "Failed to kill hang test's process id: {}, error: {e}", + child.id() + ); + } + } + Err(e) => panic!("{e}"), + } + } + + Err(e) => panic!("Env var error: {e}"), + + _ => unreachable!(), + } +} + +fn hang_test() { + let test_grammar_dir = fixtures_dir() + .join("test_grammars") + .join("get_col_should_hang_not_crash"); + + let grammar_json = load_grammar_file(&test_grammar_dir.join("grammar.js"), None).unwrap(); + let (parser_name, parser_code) = generate_parser_for_grammar(grammar_json.as_str()).unwrap(); + + let language = get_test_language(&parser_name, &parser_code, Some(test_grammar_dir.as_path())); + + let mut parser = Parser::new(); + parser.set_language(&language).unwrap(); + + let code_that_should_hang = "\nHello"; + + parser.parse(code_that_should_hang, None).unwrap(); +} diff --git a/crates/cli/src/tests/parser_test.rs b/cli/src/tests/parser_test.rs similarity index 62% rename from crates/cli/src/tests/parser_test.rs rename to cli/src/tests/parser_test.rs index f1d50319..7a857002 100644 --- a/crates/cli/src/tests/parser_test.rs +++ b/cli/src/tests/parser_test.rs @@ -1,17 +1,9 @@ use std::{ - ops::ControlFlow, - sync::{ - atomic::{AtomicUsize, Ordering}, - mpsc, - }, - thread, - time::{self, Duration}, + sync::atomic::{AtomicUsize, Ordering}, + thread, time, }; -use tree_sitter::{ - Decode, IncludedRangesError, InputEdit, LogType, ParseOptions, ParseState, Parser, Point, Range, -}; -use tree_sitter_generate::load_grammar_file; +use tree_sitter::{IncludedRangesError, InputEdit, LogType, Parser, Point, Range}; use tree_sitter_proc_macro::retry; use super::helpers::{ @@ -21,12 +13,9 @@ use super::helpers::{ }; use crate::{ fuzz::edits::Edit, + generate::{generate_parser_for_grammar, load_grammar_file}, parse::perform_edit, - tests::{ - generate_parser, - helpers::fixtures::{fixtures_dir, get_test_fixture_language}, - invert_edit, - }, + tests::{helpers::fixtures::fixtures_dir, invert_edit}, }; #[test] @@ -97,6 +86,7 @@ fn test_parsing_with_logging() { } #[test] +#[cfg(unix)] fn test_parsing_with_debug_graph_enabled() { use std::io::{BufRead, BufReader, Seek}; @@ -129,7 +119,7 @@ fn test_parsing_with_custom_utf8_input() { let lines = &["pub fn foo() {", " 1", "}"]; let tree = parser - .parse_with_options( + .parse_with( &mut |_, position| { let row = position.row; let column = position.column; @@ -144,7 +134,6 @@ fn test_parsing_with_custom_utf8_input() { } }, None, - None, ) .unwrap(); @@ -166,19 +155,17 @@ fn test_parsing_with_custom_utf8_input() { } #[test] -fn test_parsing_with_custom_utf16le_input() { +fn test_parsing_with_custom_utf16_input() { let mut parser = Parser::new(); parser.set_language(&get_language("rust")).unwrap(); let lines = ["pub fn foo() {", " 1", "}"] .iter() - .map(|s| s.encode_utf16().map(u16::to_le).collect::>()) + .map(|s| s.encode_utf16().collect::>()) .collect::>(); - let newline = [('\n' as u16).to_le()]; - let tree = parser - .parse_utf16_le_with_options( + .parse_utf16_with( &mut |_, position| { let row = position.row; let column = position.column; @@ -186,14 +173,13 @@ fn test_parsing_with_custom_utf16le_input() { if column < lines[row].len() { &lines[row][column..] } else { - &newline + &[10] } } else { &[] } }, None, - None, ) .unwrap(); @@ -207,48 +193,6 @@ fn test_parsing_with_custom_utf16le_input() { assert_eq!(root.child(0).unwrap().kind(), "function_item"); } -#[test] -fn test_parsing_with_custom_utf16_be_input() { - let mut parser = Parser::new(); - parser.set_language(&get_language("rust")).unwrap(); - - let lines: Vec> = ["pub fn foo() {", " 1", "}"] - .iter() - .map(|s| s.encode_utf16().collect::>()) - .map(|v| v.iter().map(|u| u.to_be()).collect()) - .collect(); - - let newline = [('\n' as u16).to_be()]; - - let tree = parser - .parse_utf16_be_with_options( - &mut |_, position| { - let row = position.row; - let column = position.column; - if row < lines.len() { - if column < lines[row].len() { - &lines[row][column..] - } else { - &newline - } - } else { - &[] - } - }, - None, - None, - ) - .unwrap(); - let root = tree.root_node(); - assert_eq!( - root.to_sexp(), - "(source_file (function_item (visibility_modifier) name: (identifier) parameters: (parameters) body: (block (integer_literal))))" - ); - assert_eq!(root.kind(), "source_file"); - assert!(!root.has_error()); - assert_eq!(root.child(0).unwrap().kind(), "function_item"); -} - #[test] fn test_parsing_with_callback_returning_owned_strings() { let mut parser = Parser::new(); @@ -257,10 +201,9 @@ fn test_parsing_with_callback_returning_owned_strings() { let text = b"pub fn foo() { 1 }"; let tree = parser - .parse_with_options( + .parse_with( &mut |i, _| String::from_utf8(text[i..].to_vec()).unwrap(), None, - None, ) .unwrap(); @@ -278,13 +221,7 @@ fn test_parsing_text_with_byte_order_mark() { // Parse UTF16 text with a BOM let tree = parser - .parse_utf16_le( - "\u{FEFF}fn a() {}" - .encode_utf16() - .map(u16::to_le) - .collect::>(), - None, - ) + .parse_utf16("\u{FEFF}fn a() {}".encode_utf16().collect::>(), None) .unwrap(); assert_eq!( tree.root_node().to_sexp(), @@ -362,7 +299,7 @@ fn test_parsing_ends_when_input_callback_returns_empty() { let mut i = 0; let source = b"abcdefghijklmnoqrs"; let tree = parser - .parse_with_options( + .parse_with( &mut |offset, _| { i += 1; if offset >= 6 { @@ -372,7 +309,6 @@ fn test_parsing_ends_when_input_callback_returns_empty() { } }, None, - None, ) .unwrap(); assert_eq!(tree.root_node().end_byte(), 6); @@ -410,7 +346,7 @@ fn test_parsing_after_editing_beginning_of_code() { let mut recorder = ReadRecorder::new(&code); let tree = parser - .parse_with_options(&mut |i, _| recorder.read(i), Some(&tree), None) + .parse_with(&mut |i, _| recorder.read(i), Some(&tree)) .unwrap(); assert_eq!( tree.root_node().to_sexp(), @@ -458,7 +394,7 @@ fn test_parsing_after_editing_end_of_code() { let mut recorder = ReadRecorder::new(&code); let tree = parser - .parse_with_options(&mut |i, _| recorder.read(i), Some(&tree), None) + .parse_with(&mut |i, _| recorder.read(i), Some(&tree)) .unwrap(); assert_eq!( tree.root_node().to_sexp(), @@ -490,9 +426,15 @@ fn test_parsing_empty_file_with_reused_tree() { #[test] fn test_parsing_after_editing_tree_that_depends_on_column_values() { + let dir = fixtures_dir() + .join("test_grammars") + .join("uses_current_column"); + let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap(); + let (grammar_name, parser_code) = generate_parser_for_grammar(&grammar_json).unwrap(); + let mut parser = Parser::new(); parser - .set_language(&get_test_fixture_language("uses_current_column")) + .set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir))) .unwrap(); let mut code = b" @@ -538,7 +480,7 @@ h + i let mut recorder = ReadRecorder::new(&code); let tree = parser - .parse_with_options(&mut |i, _| recorder.read(i), Some(&tree), None) + .parse_with(&mut |i, _| recorder.read(i), Some(&tree)) .unwrap(); assert_eq!( @@ -559,60 +501,6 @@ h + i ); } -#[test] -fn test_parsing_after_editing_tree_that_depends_on_column_position() { - let mut parser = Parser::new(); - parser - .set_language(&get_test_fixture_language("depends_on_column")) - .unwrap(); - - let mut code = b"\n x".to_vec(); - let mut tree = parser.parse(&code, None).unwrap(); - assert_eq!(tree.root_node().to_sexp(), "(x_is_at (odd_column))"); - - perform_edit( - &mut tree, - &mut code, - &Edit { - position: 1, - deleted_length: 0, - inserted_text: b" ".to_vec(), - }, - ) - .unwrap(); - - assert_eq!(code, b"\n x"); - - let mut recorder = ReadRecorder::new(&code); - let mut tree = parser - .parse_with_options(&mut |i, _| recorder.read(i), Some(&tree), None) - .unwrap(); - - assert_eq!(tree.root_node().to_sexp(), "(x_is_at (even_column))",); - assert_eq!(recorder.strings_read(), vec!["\n x"]); - - perform_edit( - &mut tree, - &mut code, - &Edit { - position: 1, - deleted_length: 0, - inserted_text: b"\n".to_vec(), - }, - ) - .unwrap(); - - assert_eq!(code, b"\n\n x"); - - let mut recorder = ReadRecorder::new(&code); - let tree = parser - .parse_with_options(&mut |i, _| recorder.read(i), Some(&tree), None) - .unwrap(); - - assert_eq!(tree.root_node().to_sexp(), "(x_is_at (even_column))",); - assert_eq!(recorder.strings_read(), vec!["\n\n x"]); -} - #[test] fn test_parsing_after_detecting_error_in_the_middle_of_a_string_token() { let mut parser = Parser::new(); @@ -707,20 +595,13 @@ fn test_parsing_on_multiple_threads() { #[test] fn test_parsing_cancelled_by_another_thread() { let cancellation_flag = std::sync::Arc::new(AtomicUsize::new(0)); - let flag = cancellation_flag.clone(); - let callback = &mut |_: &ParseState| { - if cancellation_flag.load(Ordering::SeqCst) != 0 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - }; let mut parser = Parser::new(); parser.set_language(&get_language("javascript")).unwrap(); + unsafe { parser.set_cancellation_flag(Some(&cancellation_flag)) }; // Long input - parsing succeeds - let tree = parser.parse_with_options( + let tree = parser.parse_with( &mut |offset, _| { if offset == 0 { " [".as_bytes() @@ -731,17 +612,17 @@ fn test_parsing_cancelled_by_another_thread() { } }, None, - Some(ParseOptions::new().progress_callback(callback)), ); assert!(tree.is_some()); + let flag = cancellation_flag.clone(); let cancel_thread = thread::spawn(move || { thread::sleep(time::Duration::from_millis(100)); flag.store(1, Ordering::SeqCst); }); // Infinite input - let tree = parser.parse_with_options( + let tree = parser.parse_with( &mut |offset, _| { thread::yield_now(); thread::sleep(time::Duration::from_millis(10)); @@ -752,7 +633,6 @@ fn test_parsing_cancelled_by_another_thread() { } }, None, - Some(ParseOptions::new().progress_callback(callback)), ); // Parsing returns None because it was cancelled. @@ -769,8 +649,9 @@ fn test_parsing_with_a_timeout() { parser.set_language(&get_language("json")).unwrap(); // Parse an infinitely-long array, but pause after 1ms of processing. + parser.set_timeout_micros(1000); let start_time = time::Instant::now(); - let tree = parser.parse_with_options( + let tree = parser.parse_with( &mut |offset, _| { if offset == 0 { b" [" @@ -779,20 +660,14 @@ fn test_parsing_with_a_timeout() { } }, None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 1000 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), ); assert!(tree.is_none()); assert!(start_time.elapsed().as_micros() < 2000); // Continue parsing, but pause after 1 ms of processing. + parser.set_timeout_micros(5000); let start_time = time::Instant::now(); - let tree = parser.parse_with_options( + let tree = parser.parse_with( &mut |offset, _| { if offset == 0 { b" [" @@ -801,28 +676,21 @@ fn test_parsing_with_a_timeout() { } }, None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 5000 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), ); assert!(tree.is_none()); assert!(start_time.elapsed().as_micros() > 100); assert!(start_time.elapsed().as_micros() < 10000); // Finish parsing + parser.set_timeout_micros(0); let tree = parser - .parse_with_options( + .parse_with( &mut |offset, _| match offset { 5001.. => "".as_bytes(), 5000 => "]".as_bytes(), _ => ",0".as_bytes(), }, None, - None, ) .unwrap(); assert_eq!(tree.root_node().child(0).unwrap().kind(), "array"); @@ -834,29 +702,16 @@ fn test_parsing_with_a_timeout_and_a_reset() { let mut parser = Parser::new(); parser.set_language(&get_language("json")).unwrap(); - let start_time = time::Instant::now(); - let code = "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]"; - let tree = parser.parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, + parser.set_timeout_micros(5); + let tree = parser.parse( + "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 5 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), ); assert!(tree.is_none()); // Without calling reset, the parser continues from where it left off, so // it does not see the changes to the beginning of the source code. + parser.set_timeout_micros(0); let tree = parser.parse( "[null, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", None, @@ -871,29 +726,16 @@ fn test_parsing_with_a_timeout_and_a_reset() { "string" ); - let start_time = time::Instant::now(); - let code = "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]"; - let tree = parser.parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, + parser.set_timeout_micros(5); + let tree = parser.parse( + "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 5 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), ); assert!(tree.is_none()); // By calling reset, we force the parser to start over from scratch so // that it sees the changes to the beginning of the source code. + parser.set_timeout_micros(0); parser.reset(); let tree = parser.parse( "[null, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", @@ -917,30 +759,17 @@ fn test_parsing_with_a_timeout_and_implicit_reset() { let mut parser = Parser::new(); parser.set_language(&get_language("javascript")).unwrap(); - let code = "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]"; - let start_time = time::Instant::now(); - let tree = parser.parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, + parser.set_timeout_micros(5); + let tree = parser.parse( + "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 5 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), ); assert!(tree.is_none()); // Changing the parser's language implicitly resets, discarding // the previous partial parse. parser.set_language(&get_language("json")).unwrap(); + parser.set_timeout_micros(0); let tree = parser.parse( "[null, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", None, @@ -964,24 +793,10 @@ fn test_parsing_with_timeout_and_no_completion() { let mut parser = Parser::new(); parser.set_language(&get_language("javascript")).unwrap(); - let code = "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]"; - let start_time = time::Instant::now(); - let tree = parser.parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, + parser.set_timeout_micros(5); + let tree = parser.parse( + "[\"ok\", 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32]", None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 5 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), ); assert!(tree.is_none()); @@ -989,131 +804,6 @@ fn test_parsing_with_timeout_and_no_completion() { }); } -#[test] -fn test_parsing_with_timeout_during_balancing() { - allocations::record(|| { - let mut parser = Parser::new(); - parser.set_language(&get_language("javascript")).unwrap(); - - let function_count = 100; - - let code = "function() {}\n".repeat(function_count); - let mut current_byte_offset = 0; - let mut in_balancing = false; - let tree = parser.parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, - None, - Some(ParseOptions::new().progress_callback(&mut |state| { - // The parser will call the progress_callback during parsing, and at the very end - // during tree-balancing. For very large trees, this balancing act can take quite - // some time, so we want to verify that timing out during this operation is - // possible. - // - // We verify this by checking the current byte offset, as this number will *not* be - // updated during tree balancing. If we see the same offset twice, we know that we - // are in the balancing phase. - if state.current_byte_offset() != current_byte_offset { - current_byte_offset = state.current_byte_offset(); - ControlFlow::Continue(()) - } else { - in_balancing = true; - ControlFlow::Break(()) - } - })), - ); - - assert!(tree.is_none()); - assert!(in_balancing); - - // This should not cause an assertion failure. - parser.reset(); - let tree = parser.parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, - None, - Some(ParseOptions::new().progress_callback(&mut |state| { - if state.current_byte_offset() != current_byte_offset { - current_byte_offset = state.current_byte_offset(); - ControlFlow::Continue(()) - } else { - in_balancing = true; - ControlFlow::Break(()) - } - })), - ); - - assert!(tree.is_none()); - assert!(in_balancing); - - // If we resume parsing (implying we didn't call `parser.reset()`), we should be able to - // finish parsing the tree, continuing from where we left off. - let tree = parser - .parse_with_options( - &mut |offset, _| { - if offset >= code.len() { - &[] - } else { - &code.as_bytes()[offset..] - } - }, - None, - Some(ParseOptions::new().progress_callback(&mut |state| { - // Because we've already finished parsing, we should only be resuming the - // balancing phase. - assert!(state.current_byte_offset() == current_byte_offset); - ControlFlow::Continue(()) - })), - ) - .unwrap(); - assert!(!tree.root_node().has_error()); - assert_eq!(tree.root_node().child_count(), function_count); - }); -} - -#[test] -fn test_parsing_with_timeout_when_error_detected() { - let mut parser = Parser::new(); - parser.set_language(&get_language("json")).unwrap(); - - // Parse an infinitely-long array, but insert an error after 1000 characters. - let mut offset = 0; - let erroneous_code = "!,"; - let tree = parser.parse_with_options( - &mut |i, _| match i { - 0 => "[", - 1..=1000 => "0,", - _ => erroneous_code, - }, - None, - Some(ParseOptions::new().progress_callback(&mut |state| { - offset = state.current_byte_offset(); - if state.has_error() { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - })), - ); - - // The callback is called at the end of parsing, however, what we're asserting here is that - // parsing ends immediately as the error is detected. This is verified by checking the offset - // of the last byte processed is the length of the erroneous code we inserted, aka, 1002, or - // 1000 + the length of the erroneous code. - assert_eq!(offset, 1000 + erroneous_code.len()); - assert!(tree.is_none()); -} - // Included Ranges #[test] @@ -1277,7 +967,7 @@ fn test_parsing_with_included_range_containing_mismatched_positions() { parser.set_included_ranges(&[range_to_parse]).unwrap(); let html_tree = parser - .parse_with_options(&mut chunked_input(source_code, 3), None, None) + .parse_with(&mut chunked_input(source_code, 3), None) .unwrap(); assert_eq!(html_tree.root_node().range(), range_to_parse); @@ -1333,8 +1023,9 @@ fn test_parsing_error_in_invalid_included_ranges() { fn test_parsing_utf16_code_with_errors_at_the_end_of_an_included_range() { let source_code = ""; let utf16_source_code = source_code - .encode_utf16() - .map(u16::to_le) + .as_bytes() + .iter() + .map(|c| u16::from(*c)) .collect::>(); let start_byte = 2 * source_code.find("a.").unwrap(); @@ -1350,7 +1041,7 @@ fn test_parsing_utf16_code_with_errors_at_the_end_of_an_included_range() { end_point: Point::new(0, end_byte), }]) .unwrap(); - let tree = parser.parse_utf16_le(&utf16_source_code, None).unwrap(); + let tree = parser.parse_utf16(&utf16_source_code, None).unwrap(); assert_eq!(tree.root_node().to_sexp(), "(program (ERROR (identifier)))"); } @@ -1409,7 +1100,7 @@ fn test_parsing_with_a_newly_excluded_range() { let mut parser = Parser::new(); parser.set_language(&get_language("html")).unwrap(); let mut first_tree = parser - .parse_with_options(&mut chunked_input(&source_code, 3), None, None) + .parse_with(&mut chunked_input(&source_code, 3), None) .unwrap(); // Insert code at the beginning of the document. @@ -1446,7 +1137,7 @@ fn test_parsing_with_a_newly_excluded_range() { ]) .unwrap(); let tree = parser - .parse_with_options(&mut chunked_input(&source_code, 3), Some(&first_tree), None) + .parse_with(&mut chunked_input(&source_code, 3), Some(&first_tree)) .unwrap(); assert_eq!( @@ -1499,7 +1190,7 @@ fn test_parsing_with_a_newly_included_range() { .set_included_ranges(&[simple_range(range1_start, range1_end)]) .unwrap(); let tree = parser - .parse_with_options(&mut chunked_input(source_code, 3), None, None) + .parse_with(&mut chunked_input(source_code, 3), None) .unwrap(); assert_eq!( tree.root_node().to_sexp(), @@ -1518,7 +1209,7 @@ fn test_parsing_with_a_newly_included_range() { ]) .unwrap(); let tree2 = parser - .parse_with_options(&mut chunked_input(source_code, 3), Some(&tree), None) + .parse_with(&mut chunked_input(source_code, 3), Some(&tree)) .unwrap(); assert_eq!( tree2.root_node().to_sexp(), @@ -1560,7 +1251,7 @@ fn test_parsing_with_a_newly_included_range() { #[test] fn test_parsing_with_included_ranges_and_missing_tokens() { - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#"{ "name": "test_leading_missing_token", "rules": { @@ -1621,7 +1312,7 @@ fn test_parsing_with_included_ranges_and_missing_tokens() { #[test] fn test_grammars_that_can_hang_on_eof() { - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#" { "name": "test_single_null_char_regex", @@ -1647,7 +1338,7 @@ fn test_grammars_that_can_hang_on_eof() { .unwrap(); parser.parse("\"", None).unwrap(); - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#" { "name": "test_null_char_with_next_char_regex", @@ -1672,7 +1363,7 @@ fn test_grammars_that_can_hang_on_eof() { .unwrap(); parser.parse("\"", None).unwrap(); - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#" { "name": "test_null_char_with_range_regex", @@ -1700,7 +1391,7 @@ fn test_grammars_that_can_hang_on_eof() { #[test] fn test_parse_stack_recursive_merge_error_cost_calculation_bug() { - let source_code = r" + let source_code = r#" fn main() { if n == 1 { } else if n == 2 { @@ -1713,7 +1404,7 @@ let y = if x == 5 { 10 } else { 15 }; if foo && bar {} if foo && bar || baz {} -"; +"#; let mut parser = Parser::new(); parser.set_language(&get_language("rust")).unwrap(); @@ -1733,9 +1424,13 @@ if foo && bar || baz {} #[test] fn test_parsing_with_scanner_logging() { + let dir = fixtures_dir().join("test_grammars").join("external_tokens"); + let grammar_json = load_grammar_file(&dir.join("grammar.js"), None).unwrap(); + let (grammar_name, parser_code) = generate_parser_for_grammar(&grammar_json).unwrap(); + let mut parser = Parser::new(); parser - .set_language(&get_test_fixture_language("external_tokens")) + .set_language(&get_test_language(&grammar_name, &parser_code, Some(&dir))) .unwrap(); let mut found = false; @@ -1751,326 +1446,6 @@ fn test_parsing_with_scanner_logging() { assert!(found); } -#[test] -fn test_parsing_get_column_at_eof() { - let mut parser = Parser::new(); - parser - .set_language(&get_test_fixture_language("get_col_eof")) - .unwrap(); - - parser.parse("a", None).unwrap(); -} - -#[test] -fn test_parsing_by_halting_at_offset() { - let mut parser = Parser::new(); - parser.set_language(&get_language("javascript")).unwrap(); - - let source_code = "function foo() { return 1; }".repeat(1000); - - let mut seen_byte_offsets = vec![]; - - parser - .parse_with_options( - &mut |offset, _| { - if offset < source_code.len() { - &source_code.as_bytes()[offset..] - } else { - &[] - } - }, - None, - Some(ParseOptions::new().progress_callback(&mut |p| { - seen_byte_offsets.push(p.current_byte_offset()); - ControlFlow::Continue(()) - })), - ) - .unwrap(); - - assert!(seen_byte_offsets.len() > 100); -} - -#[test] -fn test_decode_utf32() { - use widestring::u32cstr; - - let mut parser = Parser::new(); - parser.set_language(&get_language("rust")).unwrap(); - - let utf32_text = u32cstr!("pub fn foo() { println!(\"€50\"); }"); - let utf32_text = unsafe { - std::slice::from_raw_parts(utf32_text.as_ptr().cast::(), utf32_text.len() * 4) - }; - - struct U32Decoder; - - impl Decode for U32Decoder { - fn decode(bytes: &[u8]) -> (i32, u32) { - if bytes.len() >= 4 { - #[cfg(target_endian = "big")] - { - ( - i32::from_be_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]), - 4, - ) - } - - #[cfg(target_endian = "little")] - { - ( - i32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]), - 4, - ) - } - } else { - (0, 0) - } - } - } - - let tree = parser - .parse_custom_encoding::( - &mut |offset, _| { - if offset < utf32_text.len() { - &utf32_text[offset..] - } else { - &[] - } - }, - None, - None, - ) - .unwrap(); - - assert_eq!( - tree.root_node().to_sexp(), - "(source_file (function_item (visibility_modifier) name: (identifier) parameters: (parameters) body: (block (expression_statement (macro_invocation macro: (identifier) (token_tree (string_literal (string_content))))))))" - ); -} - -#[test] -fn test_decode_cp1252() { - use encoding_rs::WINDOWS_1252; - - let mut parser = Parser::new(); - parser.set_language(&get_language("rust")).unwrap(); - - let windows_1252_text = WINDOWS_1252.encode("pub fn foo() { println!(\"€50\"); }").0; - - struct Cp1252Decoder; - - impl Decode for Cp1252Decoder { - fn decode(bytes: &[u8]) -> (i32, u32) { - if !bytes.is_empty() { - let byte = bytes[0]; - (byte as i32, 1) - } else { - (0, 0) - } - } - } - - let tree = parser - .parse_custom_encoding::( - &mut |offset, _| &windows_1252_text[offset..], - None, - None, - ) - .unwrap(); - - assert_eq!( - tree.root_node().to_sexp(), - "(source_file (function_item (visibility_modifier) name: (identifier) parameters: (parameters) body: (block (expression_statement (macro_invocation macro: (identifier) (token_tree (string_literal (string_content))))))))" - ); -} - -#[test] -fn test_decode_macintosh() { - use encoding_rs::MACINTOSH; - - let mut parser = Parser::new(); - parser.set_language(&get_language("rust")).unwrap(); - - let macintosh_text = MACINTOSH.encode("pub fn foo() { println!(\"€50\"); }").0; - - struct MacintoshDecoder; - - impl Decode for MacintoshDecoder { - fn decode(bytes: &[u8]) -> (i32, u32) { - if !bytes.is_empty() { - let byte = bytes[0]; - (byte as i32, 1) - } else { - (0, 0) - } - } - } - - let tree = parser - .parse_custom_encoding::( - &mut |offset, _| &macintosh_text[offset..], - None, - None, - ) - .unwrap(); - - assert_eq!( - tree.root_node().to_sexp(), - "(source_file (function_item (visibility_modifier) name: (identifier) parameters: (parameters) body: (block (expression_statement (macro_invocation macro: (identifier) (token_tree (string_literal (string_content))))))))" - ); -} - -#[test] -fn test_decode_utf24le() { - let mut parser = Parser::new(); - parser.set_language(&get_language("rust")).unwrap(); - - let mut utf24le_text = Vec::new(); - for c in "pub fn foo() { println!(\"€50\"); }".chars() { - let code_point = c as u32; - utf24le_text.push((code_point & 0xFF) as u8); - utf24le_text.push(((code_point >> 8) & 0xFF) as u8); - utf24le_text.push(((code_point >> 16) & 0xFF) as u8); - } - - struct Utf24LeDecoder; - - impl Decode for Utf24LeDecoder { - fn decode(bytes: &[u8]) -> (i32, u32) { - if bytes.len() >= 3 { - (i32::from_le_bytes([bytes[0], bytes[1], bytes[2], 0]), 3) - } else { - (0, 0) - } - } - } - - let tree = parser - .parse_custom_encoding::( - &mut |offset, _| &utf24le_text[offset..], - None, - None, - ) - .unwrap(); - - assert_eq!( - tree.root_node().to_sexp(), - "(source_file (function_item (visibility_modifier) name: (identifier) parameters: (parameters) body: (block (expression_statement (macro_invocation macro: (identifier) (token_tree (string_literal (string_content))))))))" - ); -} - -#[test] -fn test_grammars_that_should_not_compile() { - assert!(generate_parser( - r#" - { - "name": "issue_1111", - "rules": { - "source_file": { "type": "STRING", "value": "" } - }, - } - "# - ) - .is_err()); - - assert!(generate_parser( - r#" - { - "name": "issue_1271", - "rules": { - "source_file": { "type": "SYMBOL", "name": "identifier" }, - "identifier": { - "type": "TOKEN", - "content": { - "type": "REPEAT", - "content": { "type": "PATTERN", "value": "a" } - } - } - }, - } - "# - ) - .is_err()); - - assert!(generate_parser( - r#" - { - "name": "issue_1156_expl_1", - "rules": { - "source_file": { - "type": "TOKEN", - "content": { - "type": "REPEAT", - "content": { "type": "STRING", "value": "c" } - } - } - }, - } - "# - ) - .is_err()); - - assert!(generate_parser( - r#" - { - "name": "issue_1156_expl_2", - "rules": { - "source_file": { - "type": "TOKEN", - "content": { - "type": "CHOICE", - "members": [ - { "type": "STRING", "value": "e" }, - { "type": "BLANK" } - ] - } - } - }, - } - "# - ) - .is_err()); - - assert!(generate_parser( - r#" - { - "name": "issue_1156_expl_3", - "rules": { - "source_file": { - "type": "IMMEDIATE_TOKEN", - "content": { - "type": "REPEAT", - "content": { "type": "STRING", "value": "p" } - } - } - }, - } - "# - ) - .is_err()); - - assert!(generate_parser( - r#" - { - "name": "issue_1156_expl_4", - "rules": { - "source_file": { - "type": "IMMEDIATE_TOKEN", - "content": { - "type": "CHOICE", - "members": [ - { "type": "STRING", "value": "r" }, - { "type": "BLANK" } - ] - } - } - }, - } - "# - ) - .is_err()); -} - const fn simple_range(start: usize, end: usize) -> Range { Range { start_byte: start, @@ -2081,99 +1456,5 @@ const fn simple_range(start: usize, end: usize) -> Range { } fn chunked_input<'a>(text: &'a str, size: usize) -> impl FnMut(usize, Point) -> &'a [u8] { - move |offset, _| &text.as_bytes()[offset..text.len().min(offset + size)] -} - -#[test] -fn test_parse_options_reborrow() { - let mut parser = Parser::new(); - parser.set_language(&get_language("rust")).unwrap(); - - let parse_count = AtomicUsize::new(0); - - let mut callback = |_: &ParseState| { - parse_count.fetch_add(1, Ordering::SeqCst); - ControlFlow::Continue(()) - }; - let mut options = ParseOptions::new().progress_callback(&mut callback); - - let text1 = "fn first() {}".repeat(20); - let text2 = "fn second() {}".repeat(20); - - let tree1 = parser - .parse_with_options( - &mut |offset, _| { - if offset >= text1.len() { - &[] - } else { - &text1.as_bytes()[offset..] - } - }, - None, - Some(options.reborrow()), - ) - .unwrap(); - - assert_eq!(tree1.root_node().child(0).unwrap().kind(), "function_item"); - - let tree2 = parser - .parse_with_options( - &mut |offset, _| { - if offset >= text2.len() { - &[] - } else { - &text2.as_bytes()[offset..] - } - }, - None, - Some(options.reborrow()), - ) - .unwrap(); - - assert_eq!(tree2.root_node().child(0).unwrap().kind(), "function_item"); - - assert!(parse_count.load(Ordering::SeqCst) > 0); -} - -#[test] -fn test_grammar_that_should_hang_and_not_segfault() { - fn hang_test() { - let test_grammar_dir = fixtures_dir() - .join("test_grammars") - .join("get_col_should_hang_not_crash"); - - let grammar_json = load_grammar_file(&test_grammar_dir.join("grammar.js"), None) - .expect("Failed to load grammar file"); - - let (parser_name, parser_code) = - generate_parser(grammar_json.as_str()).expect("Failed to generate parser"); - - let language = - get_test_language(&parser_name, &parser_code, Some(test_grammar_dir.as_path())); - - let mut parser = Parser::new(); - parser - .set_language(&language) - .expect("Failed to set parser language"); - - let code_that_should_hang = "\nHello"; - - parser - .parse(code_that_should_hang, None) - .expect("Parse operation completed unexpectedly"); - } - - let timeout = Duration::from_millis(500); - let (tx, rx) = mpsc::channel(); - - thread::spawn(move || tx.send(std::panic::catch_unwind(hang_test))); - - match rx.recv_timeout(timeout) { - Ok(Ok(())) => panic!("The test completed rather than hanging"), - Ok(Err(panic_info)) => panic!("The test panicked unexpectedly: {panic_info:?}"), - Err(mpsc::RecvTimeoutError::Timeout) => {} // Expected - Err(mpsc::RecvTimeoutError::Disconnected) => { - panic!("The test thread disconnected unexpectedly") - } - } + move |offset, _| text[offset..text.len().min(offset + size)].as_bytes() } diff --git a/crates/cli/src/tests/pathological_test.rs b/cli/src/tests/pathological_test.rs similarity index 100% rename from crates/cli/src/tests/pathological_test.rs rename to cli/src/tests/pathological_test.rs diff --git a/crates/cli/src/tests/proc_macro/Cargo.toml b/cli/src/tests/proc_macro/Cargo.toml similarity index 60% rename from crates/cli/src/tests/proc_macro/Cargo.toml rename to cli/src/tests/proc_macro/Cargo.toml index 915bd172..ade4d616 100644 --- a/crates/cli/src/tests/proc_macro/Cargo.toml +++ b/cli/src/tests/proc_macro/Cargo.toml @@ -5,13 +5,11 @@ edition.workspace = true rust-version.workspace = true publish = false -[lints] -workspace = true - [lib] proc-macro = true [dependencies] -proc-macro2 = "1.0.93" -quote = "1.0.38" -syn = { version = "2.0.96", features = ["full"] } +proc-macro2 = "1.0.78" +quote = "1.0.35" +rand = "0.8.5" +syn = { version = "2.0.52", features = ["full"] } diff --git a/crates/cli/src/tests/proc_macro/src/lib.rs b/cli/src/tests/proc_macro/src/lib.rs similarity index 100% rename from crates/cli/src/tests/proc_macro/src/lib.rs rename to cli/src/tests/proc_macro/src/lib.rs diff --git a/crates/cli/src/tests/query_test.rs b/cli/src/tests/query_test.rs similarity index 85% rename from crates/cli/src/tests/query_test.rs rename to cli/src/tests/query_test.rs index 3f1467e5..d404d19a 100644 --- a/crates/cli/src/tests/query_test.rs +++ b/cli/src/tests/query_test.rs @@ -1,14 +1,12 @@ -use std::{env, fmt::Write, ops::ControlFlow, sync::LazyLock}; +use std::{env, fmt::Write}; use indoc::indoc; +use lazy_static::lazy_static; use rand::{prelude::StdRng, SeedableRng}; -use streaming_iterator::StreamingIterator; use tree_sitter::{ - CaptureQuantifier, InputEdit, Language, Node, Parser, Point, Query, QueryCursor, - QueryCursorOptions, QueryError, QueryErrorKind, QueryPredicate, QueryPredicateArg, - QueryProperty, Range, + CaptureQuantifier, Language, Node, Parser, Point, Query, QueryCursor, QueryError, + QueryErrorKind, QueryPredicate, QueryPredicateArg, QueryProperty, }; -use tree_sitter_generate::load_grammar_file; use unindent::Unindent; use super::helpers::{ @@ -16,17 +14,17 @@ use super::helpers::{ fixtures::{get_language, get_test_language}, query_helpers::{assert_query_matches, Match, Pattern}, }; -use crate::tests::{ - generate_parser, - helpers::{ - fixtures::get_test_fixture_language, - query_helpers::{collect_captures, collect_matches}, +use crate::{ + generate::generate_parser_for_grammar, + tests::{ + helpers::query_helpers::{collect_captures, collect_matches}, + ITERATION_COUNT, }, - ITERATION_COUNT, }; -static EXAMPLE_FILTER: LazyLock> = - LazyLock::new(|| env::var("TREE_SITTER_TEST_EXAMPLE_FILTER").ok()); +lazy_static! { + static ref EXAMPLE_FILTER: Option = env::var("TREE_SITTER_TEST_EXAMPLE_FILTER").ok(); +} #[test] fn test_query_errors_on_invalid_syntax() { @@ -121,24 +119,12 @@ fn test_query_errors_on_invalid_syntax() { // Unclosed sibling expression with predicate assert_eq!( - Query::new(&language, r"((identifier) (#a?)") + Query::new(&language, r"((identifier) (#a)") .unwrap_err() .message, [ - "((identifier) (#a?)", // - " ^", - ] - .join("\n") - ); - - // Predicate not ending in `?` or `!` - assert_eq!( - Query::new(&language, r"((identifier) (#a))") - .unwrap_err() - .message, - [ - "((identifier) (#a))", // - " ^", + "((identifier) (#a)", // + " ^", ] .join("\n") ); @@ -208,50 +194,6 @@ fn test_query_errors_on_invalid_syntax() { ] .join("\n") ); - - // MISSING keyword with full pattern - assert_eq!( - Query::new( - &get_language("c"), - r"(MISSING (function_declarator (identifier))) " - ) - .unwrap_err() - .message, - [ - r"(MISSING (function_declarator (identifier))) ", - r" ^", - ] - .join("\n") - ); - - // MISSING keyword with multiple identifiers - assert_eq!( - Query::new( - &get_language("c"), - r"(MISSING function_declarator function_declarator) " - ) - .unwrap_err() - .message, - [ - r"(MISSING function_declarator function_declarator) ", - r" ^", - ] - .join("\n") - ); - assert_eq!( - Query::new(&language, "(statement / export_statement)").unwrap_err(), - QueryError { - row: 0, - offset: 11, - column: 11, - kind: QueryErrorKind::Syntax, - message: [ - "(statement / export_statement)", // - " ^" - ] - .join("\n") - } - ); }); } @@ -260,36 +202,6 @@ fn test_query_errors_on_invalid_symbols() { allocations::record(|| { let language = get_language("javascript"); - assert_eq!( - Query::new(&language, "\">>>>\"").unwrap_err(), - QueryError { - row: 0, - offset: 1, - column: 1, - kind: QueryErrorKind::NodeType, - message: "\">>>>\"".to_string() - } - ); - assert_eq!( - Query::new(&language, "\"te\\\"st\"").unwrap_err(), - QueryError { - row: 0, - offset: 1, - column: 1, - kind: QueryErrorKind::NodeType, - message: "\"te\\\"st\"".to_string() - } - ); - assert_eq!( - Query::new(&language, "\"\\\\\" @cap").unwrap_err(), - QueryError { - row: 0, - offset: 1, - column: 1, - kind: QueryErrorKind::NodeType, - message: "\"\\\\\"".to_string() - } - ); assert_eq!( Query::new(&language, "(clas)").unwrap_err(), QueryError { @@ -297,7 +209,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 1, column: 1, kind: QueryErrorKind::NodeType, - message: "\"clas\"".to_string() + message: "clas".to_string() } ); assert_eq!( @@ -307,7 +219,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 15, column: 15, kind: QueryErrorKind::NodeType, - message: "\"arrayyyyy\"".to_string() + message: "arrayyyyy".to_string() }, ); assert_eq!( @@ -317,7 +229,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 26, column: 26, kind: QueryErrorKind::NodeType, - message: "\"non_existent3\"".to_string() + message: "non_existent3".to_string() }, ); assert_eq!( @@ -327,7 +239,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 14, column: 14, kind: QueryErrorKind::Field, - message: "\"condit\"".to_string() + message: "condit".to_string() }, ); assert_eq!( @@ -337,7 +249,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 14, column: 14, kind: QueryErrorKind::Field, - message: "\"conditioning\"".to_string() + message: "conditioning".to_string() } ); assert_eq!( @@ -347,7 +259,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 15, column: 15, kind: QueryErrorKind::Field, - message: "\"alternativ\"".to_string() + message: "alternativ".to_string() } ); assert_eq!( @@ -357,17 +269,7 @@ fn test_query_errors_on_invalid_symbols() { offset: 15, column: 15, kind: QueryErrorKind::Field, - message: "\"alternatives\"".to_string() - } - ); - assert_eq!( - Query::new(&language, "fakefield: (identifier)").unwrap_err(), - QueryError { - row: 0, - offset: 0, - column: 0, - kind: QueryErrorKind::Field, - message: "\"fakefield\"".to_string() + message: "alternatives".to_string() } ); }); @@ -410,7 +312,7 @@ fn test_query_errors_on_invalid_predicates() { row: 0, column: 29, offset: 29, - message: "\"ok\"".to_string(), + message: "ok".to_string(), } ); }); @@ -430,11 +332,11 @@ fn test_query_errors_on_impossible_patterns() { Err(QueryError { kind: QueryErrorKind::Structure, row: 0, - offset: 37, - column: 37, + offset: 51, + column: 51, message: [ "(binary_expression left: (expression (identifier)) left: (expression (identifier)))", - " ^", + " ^", ] .join("\n"), }) @@ -557,51 +459,6 @@ fn test_query_errors_on_impossible_patterns() { .join("\n") }) ); - assert_eq!( - Query::new(&js_lang, "(identifier/identifier)").unwrap_err(), - QueryError { - row: 0, - offset: 0, - column: 0, - kind: QueryErrorKind::Structure, - message: [ - "(identifier/identifier)", // - "^" - ] - .join("\n") - } - ); - - if js_lang.abi_version() >= 15 { - assert_eq!( - Query::new(&js_lang, "(statement/identifier)").unwrap_err(), - QueryError { - row: 0, - offset: 0, - column: 0, - kind: QueryErrorKind::Structure, - message: [ - "(statement/identifier)", // - "^" - ] - .join("\n") - } - ); - assert_eq!( - Query::new(&js_lang, "(statement/pattern)").unwrap_err(), - QueryError { - row: 0, - offset: 0, - column: 0, - kind: QueryErrorKind::Structure, - message: [ - "(statement/pattern)", // - "^" - ] - .join("\n") - } - ); - } }); } @@ -839,7 +696,8 @@ fn test_query_matches_with_many_overlapping_results() { // .foo(bar(BAZ)) // .foo(bar(BAZ)) // ... - let source = format!("a{}", "\n .foo(bar(BAZ))".repeat(count)); + let mut source = "a".to_string(); + source += &"\n .foo(bar(BAZ))".repeat(count); assert_query_matches( &language, @@ -880,74 +738,6 @@ fn test_query_matches_capturing_error_nodes() { }); } -#[test] -fn test_query_matches_capturing_missing_nodes() { - allocations::record(|| { - let language = get_language("javascript"); - let query = Query::new( - &language, - r#" - (MISSING - ; Comments should be valid - ) @missing - (MISSING - ; Comments should be valid - ";" - ; Comments should be valid - ) @missing-semicolon - "#, - ) - .unwrap(); - - // Missing anonymous nodes - assert_query_matches( - &language, - &query, - " - x = function(a) { b; } function(c) { d; } - // ^ MISSING semicolon here - ", - &[ - (0, vec![("missing", "")]), - (1, vec![("missing-semicolon", "")]), - ], - ); - - let language = get_language("c"); - let query = Query::new( - &language, - "(MISSING field_identifier) @missing-field-ident - (MISSING identifier) @missing-ident - (MISSING) @missing-anything", - ) - .unwrap(); - - // Missing named nodes - assert_query_matches( - &language, - &query, - " - int main() { - if (a.) { - // ^ MISSING field_identifier here - b(); - c(); - - if (*) d(); - // ^ MISSING identifier here - } - } - ", - &[ - (0, vec![("missing-field-ident", "")]), - (2, vec![("missing-anything", "")]), - (1, vec![("missing-ident", "")]), - (2, vec![("missing-anything", "")]), - ], - ); - }); -} - #[test] fn test_query_matches_with_extra_children() { allocations::record(|| { @@ -2207,7 +1997,6 @@ fn test_query_matches_within_byte_range() { ] ); - // An end byte of zero indicates there is no end let matches = cursor .set_byte_range(12..0) @@ -2480,50 +2269,29 @@ fn test_query_matches_with_wildcard_at_root_intersecting_byte_range() { // After the first line of the class definition let offset = source.find("A:").unwrap() + 2; - let mut matches = Vec::new(); - let mut match_iter = cursor.set_byte_range(offset..offset).matches( - &query, - tree.root_node(), - source.as_bytes(), - ); - - while let Some(mat) = match_iter.next() { - if let Some(capture) = mat.captures.first() { - matches.push(capture.node.kind()); - } - } + let matches = cursor + .set_byte_range(offset..offset) + .matches(&query, tree.root_node(), source.as_bytes()) + .map(|mat| mat.captures[0].node.kind()) + .collect::>(); assert_eq!(matches, &["class_definition"]); // After the first line of the function definition let offset = source.find("b():").unwrap() + 4; - let mut matches = Vec::new(); - let mut match_iter = cursor.set_byte_range(offset..offset).matches( - &query, - tree.root_node(), - source.as_bytes(), - ); - - while let Some(mat) = match_iter.next() { - if let Some(capture) = mat.captures.first() { - matches.push(capture.node.kind()); - } - } + let matches = cursor + .set_byte_range(offset..offset) + .matches(&query, tree.root_node(), source.as_bytes()) + .map(|mat| mat.captures[0].node.kind()) + .collect::>(); assert_eq!(matches, &["class_definition", "function_definition"]); // After the first line of the if statement let offset = source.find("c:").unwrap() + 2; - let mut matches = Vec::new(); - let mut match_iter = cursor.set_byte_range(offset..offset).matches( - &query, - tree.root_node(), - source.as_bytes(), - ); - - while let Some(mat) = match_iter.next() { - if let Some(capture) = mat.captures.first() { - matches.push(capture.node.kind()); - } - } + let matches = cursor + .set_byte_range(offset..offset) + .matches(&query, tree.root_node(), source.as_bytes()) + .map(|mat| mat.captures[0].node.kind()) + .collect::>(); assert_eq!( matches, &["class_definition", "function_definition", "if_statement"] @@ -2576,9 +2344,8 @@ fn test_query_captures_within_byte_range_assigned_after_iterating() { // Retrieve some captures let mut results = Vec::new(); - let mut first_five = captures.by_ref().take(5); - while let Some((mat, capture_ix)) = first_five.next() { - let capture = mat.captures[*capture_ix]; + for (mat, capture_ix) in captures.by_ref().take(5) { + let capture = mat.captures[capture_ix]; results.push(( query.capture_names()[capture.index as usize], &source[capture.node.byte_range()], @@ -2600,8 +2367,8 @@ fn test_query_captures_within_byte_range_assigned_after_iterating() { // intersect the range. results.clear(); captures.set_byte_range(source.find("Ok").unwrap()..source.len()); - while let Some((mat, capture_ix)) = captures.next() { - let capture = mat.captures[*capture_ix]; + for (mat, capture_ix) in captures { + let capture = mat.captures[capture_ix]; results.push(( query.capture_names()[capture.index as usize], &source[capture.node.byte_range()], @@ -2669,64 +2436,6 @@ fn test_query_matches_within_range_of_long_repetition() { }); } -#[test] -fn test_query_matches_contained_within_range() { - allocations::record(|| { - let language = get_language("json"); - let query = Query::new( - &language, - r#" - ("[" @l_bracket "]" @r_bracket) - ("{" @l_brace "}" @r_brace) - "#, - ) - .unwrap(); - - let source = r#" - [ - {"key1": "value1"}, - {"key2": "value2"}, - {"key3": "value3"}, - {"key4": "value4"}, - {"key5": "value5"}, - {"key6": "value6"}, - {"key7": "value7"}, - {"key8": "value8"}, - {"key9": "value9"}, - {"key10": "value10"}, - {"key11": "value11"}, - {"key12": "value12"}, - ] - "# - .unindent(); - - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - let tree = parser.parse(&source, None).unwrap(); - - let expected_matches = [ - (1, vec![("l_brace", "{"), ("r_brace", "}")]), - (1, vec![("l_brace", "{"), ("r_brace", "}")]), - ]; - { - let mut cursor = QueryCursor::new(); - let matches = cursor - .set_containing_point_range(Point::new(5, 0)..Point::new(7, 0)) - .matches(&query, tree.root_node(), source.as_bytes()); - assert_eq!(collect_matches(matches, &query, &source), &expected_matches); - } - { - let mut cursor = QueryCursor::new(); - let matches = cursor.set_containing_byte_range(78..120).matches( - &query, - tree.root_node(), - source.as_bytes(), - ); - assert_eq!(collect_matches(matches, &query, &source), &expected_matches); - } - }); -} - #[test] fn test_query_matches_different_queries_same_cursor() { allocations::record(|| { @@ -2895,23 +2604,21 @@ fn test_query_matches_with_captured_wildcard_at_root() { parser.set_language(&language).unwrap(); let tree = parser.parse(source, None).unwrap(); - let mut match_capture_names_and_rows = Vec::new(); - let mut match_iter = cursor.matches(&query, tree.root_node(), source.as_bytes()); - - while let Some(m) = match_iter.next() { - let captures = m - .captures - .iter() - .map(|c| { - ( - query.capture_names()[c.index as usize], - c.node.kind(), - c.node.start_position().row, - ) - }) - .collect::>(); - match_capture_names_and_rows.push(captures); - } + let match_capture_names_and_rows = cursor + .matches(&query, tree.root_node(), source.as_bytes()) + .map(|m| { + m.captures + .iter() + .map(|c| { + ( + query.capture_names()[c.index as usize], + c.node.kind(), + c.node.start_position().row, + ) + }) + .collect::>() + }) + .collect::>(); assert_eq!( match_capture_names_and_rows, @@ -3075,61 +2782,6 @@ fn test_query_matches_with_deeply_nested_patterns_with_fields() { }); } -#[test] -fn test_query_matches_with_alternations_and_predicates() { - allocations::record(|| { - let language = get_language("java"); - let query = Query::new( - &language, - " - (block - [ - (local_variable_declaration - (variable_declarator - (identifier) @def.a - (string_literal) @lit.a - ) - ) - (local_variable_declaration - (variable_declarator - (identifier) @def.b - (null_literal) @lit.b - ) - ) - ] - (expression_statement - (method_invocation [ - (argument_list - (identifier) @ref.a - (string_literal) - ) - (argument_list - (null_literal) - (identifier) @ref.b - ) - ]) - ) - (#eq? @def.a @ref.a ) - (#eq? @def.b @ref.b ) - ) - ", - ) - .unwrap(); - - assert_query_matches( - &language, - &query, - r#" - void test() { - int a = "foo"; - f(null, b); - } - "#, - &[], - ); - }); -} - #[test] fn test_query_matches_with_indefinite_step_containing_no_captures() { allocations::record(|| { @@ -3810,10 +3462,8 @@ fn test_query_captures_with_matches_removed() { let mut cursor = QueryCursor::new(); let mut captured_strings = Vec::new(); - - let mut captures = cursor.captures(&query, tree.root_node(), source.as_bytes()); - while let Some((m, i)) = captures.next() { - let capture = m.captures[*i]; + for (m, i) in cursor.captures(&query, tree.root_node(), source.as_bytes()) { + let capture = m.captures[i]; let text = capture.node.utf8_text(source.as_bytes()).unwrap(); if text == "a" { m.remove(); @@ -3856,9 +3506,8 @@ fn test_query_captures_with_matches_removed_before_they_finish() { let mut cursor = QueryCursor::new(); let mut captured_strings = Vec::new(); - let mut captures = cursor.captures(&query, tree.root_node(), source.as_bytes()); - while let Some((m, i)) = captures.next() { - let capture = m.captures[*i]; + for (m, i) in cursor.captures(&query, tree.root_node(), source.as_bytes()) { + let capture = m.captures[i]; let text = capture.node.utf8_text(source.as_bytes()).unwrap(); if text == "as" { m.remove(); @@ -4259,27 +3908,27 @@ fn test_query_random() { let pattern = pattern_ast.to_string(); let expected_matches = pattern_ast.matches_in_tree(&test_tree); - let query = Query::new(&language, &pattern).unwrap_or_else(|e| { - panic!("failed to build query for pattern {pattern}. seed: {seed}\n{e}") - }); - let mut actual_matches = Vec::new(); - let mut match_iter = cursor.matches( - &query, - test_tree.root_node(), - include_bytes!("parser_test.rs").as_ref(), - ); - - while let Some(mat) = match_iter.next() { - let transformed_match = Match { + let query = match Query::new(&language, &pattern) { + Ok(query) => query, + Err(e) => { + panic!("failed to build query for pattern {pattern} - {e}. seed: {seed}"); + } + }; + let mut actual_matches = cursor + .matches( + &query, + test_tree.root_node(), + (include_str!("parser_test.rs")).as_bytes(), + ) + .map(|mat| Match { last_node: None, captures: mat .captures .iter() .map(|c| (query.capture_names()[c.index as usize], c.node)) .collect::>(), - }; - actual_matches.push(transformed_match); - } + }) + .collect::>(); // actual_matches.sort_unstable(); actual_matches.dedup(); @@ -5090,26 +4739,6 @@ fn test_query_quantified_captures() { ("comment.documentation", "// quuz"), ], }, - Row { - description: "multiple quantifiers should not hang query parsing", - language: get_language("c"), - code: indoc! {" - // foo - // bar - // baz - "}, - pattern: r" - ((comment) ?+ @comment) - ", - // This should be identical to the `*` quantifier. - captures: &[ - ("comment", "// foo"), - ("comment", "// foo"), - ("comment", "// foo"), - ("comment", "// bar"), - ("comment", "// baz"), - ], - }, ]; allocations::record(|| { @@ -5249,7 +4878,7 @@ fn test_query_error_does_not_oob() { offset: 1, column: 1, kind: QueryErrorKind::NodeType, - message: "\"clas\"".to_string() + message: "clas".to_string() } ); } @@ -5281,12 +4910,12 @@ fn test_consecutive_zero_or_modifiers() { assert!(matches.next().is_some()); let mut cursor = QueryCursor::new(); - let mut matches = cursor.matches(&query, three_tree.root_node(), three_source.as_bytes()); + let matches = cursor.matches(&query, three_tree.root_node(), three_source.as_bytes()); let mut len_3 = false; let mut len_1 = false; - while let Some(m) = matches.next() { + for m in matches { if m.captures.len() == 3 { len_3 = true; } @@ -5385,7 +5014,7 @@ fn test_grammar_with_aliased_literal_query() { // expansion: $ => seq('}'), // }, // }); - let (parser_name, parser_code) = generate_parser( + let (parser_name, parser_code) = generate_parser_for_grammar( r#" { "name": "test", @@ -5508,7 +5137,7 @@ fn test_query_wildcard_with_immediate_first_child() { fn test_query_on_empty_source_code() { let language = get_language("javascript"); let source_code = ""; - let query = "(program) @program"; + let query = r#"(program) @program"#; let query = Query::new(&language, query).unwrap(); assert_query_matches( &language, @@ -5530,434 +5159,15 @@ fn test_query_execution_with_timeout() { let query = Query::new(&language, "(function_declaration) @function").unwrap(); let mut cursor = QueryCursor::new(); - let start_time = std::time::Instant::now(); + cursor.set_timeout_micros(1000); let matches = cursor - .matches_with_options( - &query, - tree.root_node(), - source_code.as_bytes(), - QueryCursorOptions::new().progress_callback(&mut |_| { - if start_time.elapsed().as_micros() > 1000 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - }), - ) + .matches(&query, tree.root_node(), source_code.as_bytes()) .count(); assert!(matches < 1000); + cursor.set_timeout_micros(0); let matches = cursor .matches(&query, tree.root_node(), source_code.as_bytes()) .count(); assert_eq!(matches, 1000); } - -#[test] -fn test_query_execution_with_points_causing_underflow() { - let language = get_language("rust"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - #[allow(clippy::literal_string_with_formatting_args)] - let code = r#"fn main() { - println!("{:?}", foo()); -}"#; - parser - .set_included_ranges(&[Range { - start_byte: 24, - end_byte: 39, - start_point: Point::new(0, 0), // 5, 12 - end_point: Point::new(0, 0), // 5, 27 - }]) - .unwrap(); - - let query = Query::new(&language, "(call_expression) @cap").unwrap(); - let mut cursor = QueryCursor::new(); - - let mut tree = parser.parse(code, None).unwrap(); - - let matches = { - let root_node = tree.root_node(); - let matches = cursor.matches(&query, root_node, code.as_bytes()); - collect_matches(matches, &query, code) - .into_iter() - .map(|(i, m)| { - ( - i, - m.into_iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect::>(), - ) - }) - .collect::>() - }; - - tree.edit(&InputEdit { - start_byte: 40, - old_end_byte: 40, - new_end_byte: 41, - start_position: Point::new(1, 28), - old_end_position: Point::new(1, 28), - new_end_position: Point::new(2, 0), - }); - - let tree2 = parser.parse(code, Some(&tree)).unwrap(); - - let matches2 = { - let root_node = tree2.root_node(); - let matches = cursor.matches(&query, root_node, code.as_bytes()); - collect_matches(matches, &query, code) - .into_iter() - .map(|(i, m)| { - ( - i, - m.into_iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect::>(), - ) - }) - .collect::>() - }; - - assert_eq!(matches, matches2); -} - -#[test] -fn test_wildcard_behavior_before_anchor() { - let language = get_language("python"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let source = " - (a, b) - (c, d,) - "; - - // In this query, we're targeting any *named* node immediately before a closing parenthesis. - let query = Query::new(&language, r#"(tuple (_) @last . ")" .) @match"#).unwrap(); - assert_query_matches( - &language, - &query, - source, - &[ - (0, vec![("match", "(a, b)"), ("last", "b")]), - (0, vec![("match", "(c, d,)"), ("last", "d")]), - ], - ); - - // In this query, we're targeting *any* node immediately before a closing - // parenthesis. - let query = Query::new(&language, r#"(tuple _ @last . ")" .) @match"#).unwrap(); - assert_query_matches( - &language, - &query, - source, - &[ - (0, vec![("match", "(a, b)"), ("last", "b")]), - (0, vec![("match", "(c, d,)"), ("last", ",")]), - ], - ); -} - -#[test] -fn test_pattern_alternatives_follow_last_child_constraint() { - let language = get_language("rust"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let code = " -fn f() { - if a {} // <- should NOT match - if b {} -}"; - - let tree = parser.parse(code, None).unwrap(); - let mut cursor = QueryCursor::new(); - - let query = Query::new( - &language, - "(block - [ - (type_cast_expression) - (expression_statement) - ] @last - . - )", - ) - .unwrap(); - - let matches = { - let root_node = tree.root_node(); - let matches = cursor.matches(&query, root_node, code.as_bytes()); - collect_matches(matches, &query, code) - .into_iter() - .map(|(i, m)| { - ( - i, - m.into_iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect::>(), - ) - }) - .collect::>() - }; - - let flipped_query = Query::new( - &language, - "(block - [ - (expression_statement) - (type_cast_expression) - ] @last - . - )", - ) - .unwrap(); - - let flipped_matches = { - let root_node = tree.root_node(); - let matches = cursor.matches(&flipped_query, root_node, code.as_bytes()); - collect_matches(matches, &flipped_query, code) - .into_iter() - .map(|(i, m)| { - ( - i, - m.into_iter() - .map(|(k, v)| (k.to_string(), v.to_string())) - .collect::>(), - ) - }) - .collect::>() - }; - - assert_eq!( - matches, - vec![(0, vec![(String::from("last"), String::from("if b {}"))])] - ); - assert_eq!(matches, flipped_matches); -} - -#[test] -fn test_wildcard_parent_allows_fallible_child_patterns() { - let language = get_language("javascript"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let source_code = r#" -function foo() { - "bar" -} - "#; - - let query = Query::new( - &language, - "(function_declaration - (_ - (expression_statement) - ) - ) @part", - ) - .unwrap(); - - assert_query_matches( - &language, - &query, - source_code, - &[(0, vec![("part", "function foo() {\n \"bar\"\n}")])], - ); -} - -#[test] -fn test_unfinished_captures_are_not_definite_with_pending_anchors() { - let language = get_language("javascript"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let source_code = " -const foo = [ - 1, 2, 3 -] -"; - - let tree = parser.parse(source_code, None).unwrap(); - let query = Query::new(&language, r#"(array (_) @foo . "]")"#).unwrap(); - let mut matches_cursor = QueryCursor::new(); - let mut captures_cursor = QueryCursor::new(); - - let captures = captures_cursor.captures(&query, tree.root_node(), source_code.as_bytes()); - let captures = collect_captures(captures, &query, source_code); - - let matches = matches_cursor.matches(&query, tree.root_node(), source_code.as_bytes()); - let matches = collect_matches(matches, &query, source_code); - - assert_eq!(captures, vec![("foo", "3")]); - assert_eq!(matches.len(), 1); - assert_eq!(matches[0].1, captures); -} - -#[test] -fn test_query_with_predicate_causing_oob_access() { - let language = get_language("rust"); - - let query = "(call_expression - function: (scoped_identifier - path: (scoped_identifier (identifier) @_regex (#any-of? @_regex \"Regex\" \"RegexBuilder\") .)) - (#set! injection.language \"regex\"))"; - Query::new(&language, query).unwrap(); -} - -#[test] -fn test_query_with_anonymous_error_node() { - let language = get_test_fixture_language("anonymous_error"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let source = "ERROR"; - - let tree = parser.parse(source, None).unwrap(); - let query = Query::new( - &language, - r#" - "ERROR" @error - (document "ERROR" @error) - "#, - ) - .unwrap(); - let mut cursor = QueryCursor::new(); - let matches = cursor.matches(&query, tree.root_node(), source.as_bytes()); - let matches = collect_matches(matches, &query, source); - - assert_eq!( - matches, - vec![(1, vec![("error", "ERROR")]), (0, vec![("error", "ERROR")])] - ); -} - -#[test] -fn test_query_allows_error_nodes_with_children() { - allocations::record(|| { - let language = get_language("cpp"); - - let code = "SomeStruct foo{.bar{}};"; - - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - - let tree = parser.parse(code, None).unwrap(); - let root = tree.root_node(); - - let query = Query::new(&language, "(initializer_list (ERROR) @error)").unwrap(); - let mut cursor = QueryCursor::new(); - - let matches = cursor.matches(&query, root, code.as_bytes()); - let matches = collect_matches(matches, &query, code); - assert_eq!(matches, &[(0, vec![("error", ".bar")])]); - }); -} - -#[test] -fn test_query_assertion_on_unreachable_node_with_child() { - // The `await_binding` rule is unreachable because it has a lower precedence than - // `identifier`, so we'll always reduce to an expression of type `identifier` - // instead whenever we see the token `await` followed by an identifier. - // - // A query that tries to capture the `await` token in the `await_binding` rule - // should not cause an assertion failure during query analysis. - let grammar = r#" -export default grammar({ - name: "query_assertion_crash", - - rules: { - source_file: $ => repeat($.expression), - - expression: $ => choice( - $.await_binding, - $.await_expr, - $.equal_expr, - prec(3, $.identifier), - ), - - await_binding: $ => prec(1, seq('await', $.identifier, '=', $.expression)), - - await_expr: $ => prec(1, seq('await', $.expression)), - - equal_expr: $ => prec.right(2, seq($.expression, '=', $.expression)), - - identifier: _ => /[a-z]+/, - } -}); - "#; - - let file = tempfile::NamedTempFile::with_suffix(".js").unwrap(); - std::fs::write(file.path(), grammar).unwrap(); - - let grammar_json = load_grammar_file(file.path(), None).unwrap(); - - let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); - - let language = get_test_language(&parser_name, &parser_code, None); - - let query_result = Query::new(&language, r#"(await_binding "await")"#); - - assert!(query_result.is_err()); - assert_eq!( - query_result.unwrap_err(), - QueryError { - kind: QueryErrorKind::Structure, - row: 0, - offset: 0, - column: 0, - message: ["(await_binding \"await\")", "^"].join("\n"), - } - ); -} - -#[test] -fn test_query_supertype_with_anonymous_node() { - let grammar = r#" -export default grammar({ - name: "supertype_anonymous_test", - - extras: $ => [/\s/, $.comment], - - supertypes: $ => [$.expression], - - word: $ => $.identifier, - - rules: { - source_file: $ => repeat($.expression), - - expression: $ => choice( - $.function_call, - '()' // an empty tuple, which should be queryable with the supertype syntax - ), - - function_call: $ => seq($.identifier, '()'), - - identifier: _ => /[a-zA-Z_][a-zA-Z0-9_]*/, - - comment: _ => token(seq('//', /.*/)), - } -}); - "#; - - let file = tempfile::NamedTempFile::with_suffix(".js").unwrap(); - std::fs::write(file.path(), grammar).unwrap(); - - let grammar_json = load_grammar_file(file.path(), None).unwrap(); - - let (parser_name, parser_code) = generate_parser(&grammar_json).unwrap(); - - let language = get_test_language(&parser_name, &parser_code, None); - - let query_result = Query::new(&language, r#"(expression/"()") @tuple"#); - - assert!(query_result.is_ok()); - - let query = query_result.unwrap(); - - let source = "foo()\n()"; - - assert_query_matches(&language, &query, source, &[(0, vec![("tuple", "()")])]); -} diff --git a/crates/cli/src/tests/tags_test.rs b/cli/src/tests/tags_test.rs similarity index 93% rename from crates/cli/src/tests/tags_test.rs rename to cli/src/tests/tags_test.rs index 0c9f7111..cb07fb75 100644 --- a/crates/cli/src/tests/tags_test.rs +++ b/cli/src/tests/tags_test.rs @@ -1,7 +1,6 @@ use std::{ ffi::{CStr, CString}, fs, ptr, slice, str, - sync::atomic::{AtomicUsize, Ordering}, }; use tree_sitter::Point; @@ -263,34 +262,34 @@ fn test_tags_ruby() { #[test] fn test_tags_cancellation() { + use std::sync::atomic::{AtomicUsize, Ordering}; + allocations::record(|| { // Large javascript document - let source = "/* hi */ class A { /* ok */ b() {} }\n".repeat(500); + let source = (0..500) + .map(|_| "/* hi */ class A { /* ok */ b() {} }\n") + .collect::(); + let cancellation_flag = AtomicUsize::new(0); let language = get_language("javascript"); let tags_config = TagsConfiguration::new(language, JS_TAG_QUERY, "").unwrap(); + let mut tag_context = TagsContext::new(); let tags = tag_context .generate_tags(&tags_config, source.as_bytes(), Some(&cancellation_flag)) .unwrap(); - let found_cancellation_error = tags.0.enumerate().any(|(i, tag)| { + for (i, tag) in tags.0.enumerate() { if i == 150 { cancellation_flag.store(1, Ordering::SeqCst); } - match tag { - Ok(_) => false, - Err(Error::Cancelled) => true, - Err(e) => { - unreachable!("Unexpected error type while iterating tags: {e}") - } + if let Err(e) = tag { + assert_eq!(e, Error::Cancelled); + return; } - }); + } - assert!( - found_cancellation_error, - "Expected to halt tagging with a cancellation error" - ); + panic!("Expected to halt tagging with an error"); }); } @@ -402,11 +401,8 @@ fn test_tags_via_c_api() { let syntax_types = unsafe { let mut len = 0; - let ptr = c::ts_tagger_syntax_kinds_for_scope_name( - tagger, - c_scope_name.as_ptr(), - &raw mut len, - ); + let ptr = + c::ts_tagger_syntax_kinds_for_scope_name(tagger, c_scope_name.as_ptr(), &mut len); slice::from_raw_parts(ptr, len as usize) .iter() .map(|i| CStr::from_ptr(*i).to_str().unwrap()) diff --git a/crates/cli/src/tests/test_highlight_test.rs b/cli/src/tests/test_highlight_test.rs similarity index 83% rename from crates/cli/src/tests/test_highlight_test.rs rename to cli/src/tests/test_highlight_test.rs index e8567d6d..054e33f8 100644 --- a/crates/cli/src/tests/test_highlight_test.rs +++ b/cli/src/tests/test_highlight_test.rs @@ -23,7 +23,7 @@ fn test_highlight_test_with_basic_test() { "// hi", "var abc = function(d) {", " // ^ function", - " // ^^^ keyword", + " // ^ keyword", " return d + e;", " // ^ variable", " // ^ !variable", @@ -39,12 +39,12 @@ fn test_highlight_test_with_basic_test() { assert_eq!( assertions, &[ - Assertion::new(1, 5, 1, false, String::from("function")), - Assertion::new(1, 11, 3, false, String::from("keyword")), - Assertion::new(4, 9, 1, false, String::from("variable")), - Assertion::new(4, 11, 1, true, String::from("variable")), - Assertion::new(8, 5, 1, false, String::from("function")), - Assertion::new(8, 11, 1, false, String::from("keyword")), + Assertion::new(1, 5, false, String::from("function")), + Assertion::new(1, 11, false, String::from("keyword")), + Assertion::new(4, 9, false, String::from("variable")), + Assertion::new(4, 11, true, String::from("variable")), + Assertion::new(8, 5, false, String::from("function")), + Assertion::new(8, 11, false, String::from("keyword")), ] ); diff --git a/crates/cli/src/tests/test_tags_test.rs b/cli/src/tests/test_tags_test.rs similarity index 83% rename from crates/cli/src/tests/test_tags_test.rs rename to cli/src/tests/test_tags_test.rs index c9019a71..5f7b88fc 100644 --- a/crates/cli/src/tests/test_tags_test.rs +++ b/cli/src/tests/test_tags_test.rs @@ -30,10 +30,10 @@ fn test_tags_test_with_basic_test() { assert_eq!( assertions, &[ - Assertion::new(1, 4, 1, false, String::from("definition.function")), - Assertion::new(3, 9, 1, false, String::from("reference.call")), - Assertion::new(5, 11, 1, false, String::from("reference.call")), - Assertion::new(5, 13, 1, true, String::from("variable.parameter")), + Assertion::new(1, 4, false, String::from("definition.function")), + Assertion::new(3, 9, false, String::from("reference.call")), + Assertion::new(5, 11, false, String::from("reference.call")), + Assertion::new(5, 13, true, String::from("variable.parameter")), ] ); diff --git a/crates/cli/src/tests/text_provider_test.rs b/cli/src/tests/text_provider_test.rs similarity index 88% rename from crates/cli/src/tests/text_provider_test.rs rename to cli/src/tests/text_provider_test.rs index 6c4e8939..e35e20ec 100644 --- a/crates/cli/src/tests/text_provider_test.rs +++ b/cli/src/tests/text_provider_test.rs @@ -1,6 +1,5 @@ use std::{iter, sync::Arc}; -use streaming_iterator::StreamingIterator; use tree_sitter::{Language, Node, Parser, Point, Query, QueryCursor, TextProvider, Tree}; use crate::tests::helpers::fixtures::get_language; @@ -20,7 +19,8 @@ where let language = get_language("c"); let mut parser = Parser::new(); parser.set_language(&language).unwrap(); - let tree = parser.parse_with_options(callback, None, None).unwrap(); + let tree = parser.parse_with(callback, None).unwrap(); + // eprintln!("{}", tree.clone().root_node().to_sexp()); assert_eq!("comment", tree.root_node().child(0).unwrap().kind()); (tree, language) } @@ -30,8 +30,8 @@ fn tree_query>(tree: &Tree, text: impl TextProvider, language: let mut cursor = QueryCursor::new(); let mut captures = cursor.captures(&query, tree.root_node(), text); let (match_, idx) = captures.next().unwrap(); - let capture = match_.captures[*idx]; - assert_eq!(capture.index as usize, *idx); + let capture = match_.captures[idx]; + assert_eq!(capture.index as usize, idx); assert_eq!("comment", capture.node.kind()); } @@ -106,19 +106,6 @@ fn test_text_provider_for_arc_of_bytes_slice() { check_parsing(text.clone(), text.as_ref()); } -#[test] -fn test_text_provider_for_vec_utf16_text() { - let source_text = "你好".encode_utf16().collect::>(); - - let language = get_language("c"); - let mut parser = Parser::new(); - parser.set_language(&language).unwrap(); - let tree = parser.parse_utf16_le(&source_text, None).unwrap(); - - let tree_text = tree.root_node().utf16_text(&source_text); - assert_eq!(source_text, tree_text); -} - #[test] fn test_text_provider_callback_with_str_slice() { let text: &str = "// comment"; diff --git a/crates/cli/src/tests/tree_test.rs b/cli/src/tests/tree_test.rs similarity index 94% rename from crates/cli/src/tests/tree_test.rs rename to cli/src/tests/tree_test.rs index a4941bb6..6ba47a03 100644 --- a/crates/cli/src/tests/tree_test.rs +++ b/cli/src/tests/tree_test.rs @@ -3,11 +3,7 @@ use std::str; use tree_sitter::{InputEdit, Parser, Point, Range, Tree}; use super::helpers::fixtures::get_language; -use crate::{ - fuzz::edits::Edit, - parse::perform_edit, - tests::{helpers::fixtures::get_test_fixture_language, invert_edit}, -}; +use crate::{fuzz::edits::Edit, parse::perform_edit, tests::invert_edit}; #[test] fn test_tree_edit() { @@ -381,40 +377,6 @@ fn test_tree_cursor() { assert_eq!(copy.node().kind(), "struct_item"); } -#[test] -fn test_tree_cursor_previous_sibling_with_aliases() { - let mut parser = Parser::new(); - parser - .set_language(&get_test_fixture_language("aliases_in_root")) - .unwrap(); - - let text = "# comment\n# \nfoo foo"; - let tree = parser.parse(text, None).unwrap(); - let mut cursor = tree.walk(); - assert_eq!(cursor.node().kind(), "document"); - - cursor.goto_first_child(); - assert_eq!(cursor.node().kind(), "comment"); - - assert!(cursor.goto_next_sibling()); - assert_eq!(cursor.node().kind(), "comment"); - - assert!(cursor.goto_next_sibling()); - assert_eq!(cursor.node().kind(), "bar"); - - assert!(cursor.goto_previous_sibling()); - assert_eq!(cursor.node().kind(), "comment"); - - assert!(cursor.goto_previous_sibling()); - assert_eq!(cursor.node().kind(), "comment"); - - assert!(cursor.goto_next_sibling()); - assert_eq!(cursor.node().kind(), "comment"); - - assert!(cursor.goto_next_sibling()); - assert_eq!(cursor.node().kind(), "bar"); -} - #[test] fn test_tree_cursor_previous_sibling() { let mut parser = Parser::new(); @@ -513,13 +475,12 @@ fn test_tree_cursor_child_for_point() { assert_eq!(c.node().kind(), "program"); // descend to expression statement - assert_eq!(c.goto_first_child_for_point(Point::new(6, 5)), Some(0)); + assert_eq!(c.goto_first_child_for_point(Point::new(6, 6)), Some(0)); assert_eq!(c.node().kind(), "expression_statement"); // step into ';' and back up assert_eq!(c.goto_first_child_for_point(Point::new(7, 0)), None); - assert_eq!(c.goto_first_child_for_point(Point::new(6, 6)), None); - assert_eq!(c.goto_first_child_for_point(Point::new(6, 5)), Some(1)); + assert_eq!(c.goto_first_child_for_point(Point::new(6, 6)), Some(1)); assert_eq!( (c.node().kind(), c.node().start_position()), (";", Point::new(6, 5)) @@ -556,7 +517,7 @@ fn test_tree_cursor_child_for_point() { assert!(c.goto_parent()); // step into first ',' and back up - assert_eq!(c.goto_first_child_for_point(Point::new(1, 11)), Some(2)); + assert_eq!(c.goto_first_child_for_point(Point::new(1, 12)), Some(2)); assert_eq!( (c.node().kind(), c.node().start_position()), (",", Point::new(1, 11)) @@ -743,11 +704,11 @@ fn test_consistency_with_mid_codepoint_edit() { #[test] fn test_tree_cursor_on_aliased_root_with_extra_child() { - let source = r" + let source = r#" fn main() { C/* hi */::::E; } -"; +"#; let mut parser = Parser::new(); parser.set_language(&get_language("rust")).unwrap(); diff --git a/crates/cli/src/tests/wasm_language_test.rs b/cli/src/tests/wasm_language_test.rs similarity index 87% rename from crates/cli/src/tests/wasm_language_test.rs rename to cli/src/tests/wasm_language_test.rs index d62095c0..1ea63658 100644 --- a/crates/cli/src/tests/wasm_language_test.rs +++ b/cli/src/tests/wasm_language_test.rs @@ -1,13 +1,16 @@ use std::fs; -use streaming_iterator::StreamingIterator; -use tree_sitter::{Parser, Query, QueryCursor, WasmError, WasmErrorKind, WasmStore}; - -use crate::tests::helpers::{ - allocations, - fixtures::{get_test_fixture_language_wasm, ENGINE, WASM_DIR}, +use lazy_static::lazy_static; +use tree_sitter::{ + wasmtime::Engine, Parser, Query, QueryCursor, WasmError, WasmErrorKind, WasmStore, }; +use crate::tests::helpers::{allocations, fixtures::WASM_DIR}; + +lazy_static! { + static ref ENGINE: Engine = Engine::default(); +} + #[test] fn test_wasm_stdlib_symbols() { let symbols = tree_sitter::wasm_stdlib_symbols().collect::>(); @@ -91,33 +94,6 @@ fn test_load_wasm_javascript_language() { }); } -#[test] -fn test_load_wasm_python_language() { - allocations::record(|| { - let mut store = WasmStore::new(&ENGINE).unwrap(); - let mut parser = Parser::new(); - let wasm = fs::read(WASM_DIR.join("tree-sitter-python.wasm")).unwrap(); - let language = store.load_language("python", &wasm).unwrap(); - parser.set_wasm_store(store).unwrap(); - parser.set_language(&language).unwrap(); - let tree = parser.parse("a = b\nc = d", None).unwrap(); - assert_eq!(tree.root_node().to_sexp(), "(module (expression_statement (assignment left: (identifier) right: (identifier))) (expression_statement (assignment left: (identifier) right: (identifier))))"); - }); -} - -#[test] -fn test_load_fixture_language_wasm() { - allocations::record(|| { - let store = WasmStore::new(&ENGINE).unwrap(); - let mut parser = Parser::new(); - let language = get_test_fixture_language_wasm("epsilon_external_tokens"); - parser.set_wasm_store(store).unwrap(); - parser.set_language(&language).unwrap(); - let tree = parser.parse("hello", None).unwrap(); - assert_eq!(tree.root_node().to_sexp(), "(document (zero_width))"); - }); -} - #[test] fn test_load_multiple_wasm_languages() { allocations::record(|| { @@ -142,7 +118,7 @@ fn test_load_multiple_wasm_languages() { let mut query_cursor = QueryCursor::new(); // First, parse with the store that originally loaded the languages. - // Then parse with a new parser and Wasm store, so that the languages + // Then parse with a new parser and wasm store, so that the languages // are added one-by-one, in between parses. for mut parser in [parser, parser2] { for _ in 0..2 { @@ -252,7 +228,7 @@ fn test_load_wasm_errors() { store.load_language("rust", bad_wasm).unwrap_err(), WasmError { kind: WasmErrorKind::Parse, - message: "failed to parse dylink section of Wasm module".into(), + message: "failed to parse dylink section of wasm module".into(), } ); diff --git a/crates/cli/src/util.rs b/cli/src/util.rs similarity index 99% rename from crates/cli/src/util.rs rename to cli/src/util.rs index 72968db8..fd4f4699 100644 --- a/crates/cli/src/util.rs +++ b/cli/src/util.rs @@ -9,7 +9,6 @@ use std::{ use anyhow::{anyhow, Context, Result}; use indoc::indoc; -use log::error; use tree_sitter::{Parser, Tree}; use tree_sitter_config::Config; use tree_sitter_loader::Config as LoaderConfig; @@ -121,7 +120,7 @@ impl Drop for LogSession { webbrowser::open(&self.path.to_string_lossy()).unwrap(); } } else { - error!( + eprintln!( "Dot failed: {} {}", String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr) diff --git a/crates/cli/src/wasm.rs b/cli/src/wasm.rs similarity index 81% rename from crates/cli/src/wasm.rs rename to cli/src/wasm.rs index 09fb459b..7782a330 100644 --- a/crates/cli/src/wasm.rs +++ b/cli/src/wasm.rs @@ -5,13 +5,14 @@ use std::{ use anyhow::{anyhow, Context, Result}; use tree_sitter::wasm_stdlib_symbols; -use tree_sitter_generate::{load_grammar_file, parse_grammar::GrammarJSON}; use tree_sitter_loader::Loader; use wasmparser::Parser; +use super::generate::parse_grammar::GrammarJSON; + pub fn load_language_wasm_file(language_dir: &Path) -> Result<(String, Vec)> { let grammar_name = get_grammar_name(language_dir) - .with_context(|| "Failed to get Wasm filename") + .with_context(|| "Failed to get wasm filename") .unwrap(); let wasm_filename = format!("tree-sitter-{grammar_name}.wasm"); let contents = fs::read(language_dir.join(&wasm_filename)).with_context(|| { @@ -23,44 +24,39 @@ pub fn load_language_wasm_file(language_dir: &Path) -> Result<(String, Vec)> pub fn get_grammar_name(language_dir: &Path) -> Result { let src_dir = language_dir.join("src"); let grammar_json_path = src_dir.join("grammar.json"); - let grammar_json = fs::read_to_string(&grammar_json_path).with_context(|| { - format!( - "Failed to read grammar file {}", - grammar_json_path.display() - ) - })?; - let grammar: GrammarJSON = serde_json::from_str(&grammar_json).with_context(|| { - format!( - "Failed to parse grammar file {}", - grammar_json_path.display() - ) - })?; + let grammar_json = fs::read_to_string(&grammar_json_path) + .with_context(|| format!("Failed to read grammar file {grammar_json_path:?}"))?; + let grammar: GrammarJSON = serde_json::from_str(&grammar_json) + .with_context(|| format!("Failed to parse grammar file {grammar_json_path:?}"))?; Ok(grammar.name) } pub fn compile_language_to_wasm( loader: &Loader, + root_dir: Option<&Path>, language_dir: &Path, output_dir: &Path, output_file: Option, + force_docker: bool, ) -> Result<()> { - let grammar_name = get_grammar_name(language_dir) - .or_else(|_| load_grammar_file(&language_dir.join("grammar.js"), None))?; + let grammar_name = get_grammar_name(language_dir)?; let output_filename = output_file.unwrap_or_else(|| output_dir.join(format!("tree-sitter-{grammar_name}.wasm"))); let src_path = language_dir.join("src"); let scanner_path = loader.get_scanner_path(&src_path); loader.compile_parser_to_wasm( &grammar_name, + root_dir, &src_path, scanner_path .as_ref() .and_then(|p| Some(Path::new(p.file_name()?))), &output_filename, + force_docker, )?; // Exit with an error if the external scanner uses symbols from the - // C or C++ standard libraries that aren't available to Wasm parsers. + // C or C++ standard libraries that aren't available to wasm parsers. let stdlib_symbols = wasm_stdlib_symbols().collect::>(); let dylink_symbols = [ "__indirect_function_table", @@ -99,7 +95,7 @@ pub fn compile_language_to_wasm( if !missing_symbols.is_empty() { Err(anyhow!( concat!( - "This external scanner uses a symbol that isn't available to Wasm parsers.\n", + "This external scanner uses a symbol that isn't available to wasm parsers.\n", "\n", "Missing symbols:\n", " {}\n", diff --git a/cli/vendor/xterm-colors.json b/cli/vendor/xterm-colors.json new file mode 100644 index 00000000..47994496 --- /dev/null +++ b/cli/vendor/xterm-colors.json @@ -0,0 +1,258 @@ +[ + "#000000", + "#800000", + "#008000", + "#808000", + "#000080", + "#800080", + "#008080", + "#c0c0c0", + "#808080", + "#ff0000", + "#00ff00", + "#ffff00", + "#0000ff", + "#ff00ff", + "#00ffff", + "#ffffff", + "#000000", + "#00005f", + "#000087", + "#0000af", + "#0000d7", + "#0000ff", + "#005f00", + "#005f5f", + "#005f87", + "#005faf", + "#005fd7", + "#005fff", + "#008700", + "#00875f", + "#008787", + "#0087af", + "#0087d7", + "#0087ff", + "#00af00", + "#00af5f", + "#00af87", + "#00afaf", + "#00afd7", + "#00afff", + "#00d700", + "#00d75f", + "#00d787", + "#00d7af", + "#00d7d7", + "#00d7ff", + "#00ff00", + "#00ff5f", + "#00ff87", + "#00ffaf", + "#00ffd7", + "#00ffff", + "#5f0000", + "#5f005f", + "#5f0087", + "#5f00af", + "#5f00d7", + "#5f00ff", + "#5f5f00", + "#5f5f5f", + "#5f5f87", + "#5f5faf", + "#5f5fd7", + "#5f5fff", + "#5f8700", + "#5f875f", + "#5f8787", + "#5f87af", + "#5f87d7", + "#5f87ff", + "#5faf00", + "#5faf5f", + "#5faf87", + "#5fafaf", + "#5fafd7", + "#5fafff", + "#5fd700", + "#5fd75f", + "#5fd787", + "#5fd7af", + "#5fd7d7", + "#5fd7ff", + "#5fff00", + "#5fff5f", + "#5fff87", + "#5fffaf", + "#5fffd7", + "#5fffff", + "#870000", + "#87005f", + "#870087", + "#8700af", + "#8700d7", + "#8700ff", + "#875f00", + "#875f5f", + "#875f87", + "#875faf", + "#875fd7", + "#875fff", + "#878700", + "#87875f", + "#878787", + "#8787af", + "#8787d7", + "#8787ff", + "#87af00", + "#87af5f", + "#87af87", + "#87afaf", + "#87afd7", + "#87afff", + "#87d700", + "#87d75f", + "#87d787", + "#87d7af", + "#87d7d7", + "#87d7ff", + "#87ff00", + "#87ff5f", + "#87ff87", + "#87ffaf", + "#87ffd7", + "#87ffff", + "#af0000", + "#af005f", + "#af0087", + "#af00af", + "#af00d7", + "#af00ff", + "#af5f00", + "#af5f5f", + "#af5f87", + "#af5faf", + "#af5fd7", + "#af5fff", + "#af8700", + "#af875f", + "#af8787", + "#af87af", + "#af87d7", + "#af87ff", + "#afaf00", + "#afaf5f", + "#afaf87", + "#afafaf", + "#afafd7", + "#afafff", + "#afd700", + "#afd75f", + "#afd787", + "#afd7af", + "#afd7d7", + "#afd7ff", + "#afff00", + "#afff5f", + "#afff87", + "#afffaf", + "#afffd7", + "#afffff", + "#d70000", + "#d7005f", + "#d70087", + "#d700af", + "#d700d7", + "#d700ff", + "#d75f00", + "#d75f5f", + "#d75f87", + "#d75faf", + "#d75fd7", + "#d75fff", + "#d78700", + "#d7875f", + "#d78787", + "#d787af", + "#d787d7", + "#d787ff", + "#d7af00", + "#d7af5f", + "#d7af87", + "#d7afaf", + "#d7afd7", + "#d7afff", + "#d7d700", + "#d7d75f", + "#d7d787", + "#d7d7af", + "#d7d7d7", + "#d7d7ff", + "#d7ff00", + "#d7ff5f", + "#d7ff87", + "#d7ffaf", + "#d7ffd7", + "#d7ffff", + "#ff0000", + "#ff005f", + "#ff0087", + "#ff00af", + "#ff00d7", + "#ff00ff", + "#ff5f00", + "#ff5f5f", + "#ff5f87", + "#ff5faf", + "#ff5fd7", + "#ff5fff", + "#ff8700", + "#ff875f", + "#ff8787", + "#ff87af", + "#ff87d7", + "#ff87ff", + "#ffaf00", + "#ffaf5f", + "#ffaf87", + "#ffafaf", + "#ffafd7", + "#ffafff", + "#ffd700", + "#ffd75f", + "#ffd787", + "#ffd7af", + "#ffd7d7", + "#ffd7ff", + "#ffff00", + "#ffff5f", + "#ffff87", + "#ffffaf", + "#ffffd7", + "#ffffff", + "#080808", + "#121212", + "#1c1c1c", + "#262626", + "#303030", + "#3a3a3a", + "#444444", + "#4e4e4e", + "#585858", + "#626262", + "#6c6c6c", + "#767676", + "#808080", + "#8a8a8a", + "#949494", + "#9e9e9e", + "#a8a8a8", + "#b2b2b2", + "#bcbcbc", + "#c6c6c6", + "#d0d0d0", + "#dadada", + "#e4e4e4", + "#eeeeee" +] diff --git a/crates/cli/LICENSE b/crates/cli/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/cli/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/cli/build.rs b/crates/cli/build.rs deleted file mode 100644 index 45f54634..00000000 --- a/crates/cli/build.rs +++ /dev/null @@ -1,80 +0,0 @@ -use std::{ - env, - path::{Path, PathBuf}, - process::Command, - time::SystemTime, -}; - -fn main() { - if let Some(git_sha) = read_git_sha() { - println!("cargo:rustc-env=BUILD_SHA={git_sha}"); - } - - println!("cargo:rustc-check-cfg=cfg(sanitizing)"); - println!("cargo:rustc-check-cfg=cfg(TREE_SITTER_EMBED_WASM_BINDING)"); - - if web_playground_files_present() { - println!("cargo:rustc-cfg=TREE_SITTER_EMBED_WASM_BINDING"); - } - - let build_time = SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs_f64(); - println!("cargo:rustc-env=BUILD_TIME={build_time}"); - - #[cfg(any( - target_os = "linux", - target_os = "android", - target_os = "freebsd", - target_os = "openbsd", - target_os = "netbsd", - target_os = "dragonfly", - ))] - { - let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()).join("dynamic-symbols.txt"); - std::fs::write( - &out_dir, - "{ - ts_current_malloc; - ts_current_calloc; - ts_current_realloc; - ts_current_free; - };", - ) - .unwrap(); - println!( - "cargo:rustc-link-arg=-Wl,--dynamic-list={}", - out_dir.display() - ); - } -} - -fn web_playground_files_present() -> bool { - let paths = [ - "../../docs/src/assets/js/playground.js", - "../../lib/binding_web/web-tree-sitter.js", - "../../lib/binding_web/web-tree-sitter.wasm", - ]; - - paths.iter().all(|p| Path::new(p).exists()) -} - -fn read_git_sha() -> Option { - let crate_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); - - if !crate_path.parent().is_some_and(|p| p.join(".git").exists()) { - return None; - } - - Command::new("git") - .args(["rev-parse", "HEAD"]) - .current_dir(crate_path) - .output() - .map_or(None, |output| { - if !output.status.success() { - return None; - } - Some(String::from_utf8_lossy(&output.stdout).to_string()) - }) -} diff --git a/crates/cli/eslint/.gitignore b/crates/cli/eslint/.gitignore deleted file mode 100644 index 6b1d0bfa..00000000 --- a/crates/cli/eslint/.gitignore +++ /dev/null @@ -1 +0,0 @@ -LICENSE diff --git a/crates/cli/npm/package-lock.json b/crates/cli/npm/package-lock.json deleted file mode 100644 index 739e69f1..00000000 --- a/crates/cli/npm/package-lock.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "tree-sitter-cli", - "version": "0.27.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tree-sitter-cli", - "version": "0.27.0", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "tree-sitter": "cli.js" - }, - "engines": { - "node": ">=12.0.0" - } - } - } -} diff --git a/crates/cli/package.nix b/crates/cli/package.nix deleted file mode 100644 index eea05e12..00000000 --- a/crates/cli/package.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ - lib, - src, - rustPlatform, - version, - clang, - libclang, - cmake, - pkg-config, - nodejs_22, - test-grammars, - stdenv, - installShellFiles, -}: -let - isCross = stdenv.targetPlatform == stdenv.buildPlatform; -in -rustPlatform.buildRustPackage { - pname = "tree-sitter-cli"; - - inherit src version; - - cargoBuildFlags = [ "--all-features" ]; - - nativeBuildInputs = [ - clang - cmake - pkg-config - nodejs_22 - ] - ++ lib.optionals (!isCross) [ installShellFiles ]; - - cargoLock.lockFile = ../../Cargo.lock; - - env.LIBCLANG_PATH = "${libclang.lib}/lib"; - - preBuild = '' - rm -rf test/fixtures - mkdir -p test/fixtures - cp -r ${test-grammars}/fixtures/* test/fixtures/ - chmod -R u+w test/fixtures - ''; - - preCheck = "export HOME=$TMPDIR"; - doCheck = !isCross; - - postInstall = lib.optionalString (!isCross) '' - installShellCompletion --cmd tree-sitter \ - --bash <($out/bin/tree-sitter complete --shell bash) \ - --zsh <($out/bin/tree-sitter complete --shell zsh) \ - --fish <($out/bin/tree-sitter complete --shell fish) - ''; - - meta = { - description = "Tree-sitter CLI - A tool for developing, testing, and using Tree-sitter parsers"; - longDescription = '' - Tree-sitter is a parser generator tool and an incremental parsing library. - It can build a concrete syntax tree for a source file and efficiently update - the syntax tree as the source file is edited. This package provides the CLI - tool for developing, testing, and using Tree-sitter parsers. - ''; - homepage = "https://tree-sitter.github.io/tree-sitter"; - changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}"; - license = lib.licenses.mit; - maintainers = with lib.maintainers; [ amaanq ]; - platforms = lib.platforms.all; - mainProgram = "tree-sitter"; - }; -} diff --git a/crates/cli/src/init.rs b/crates/cli/src/init.rs deleted file mode 100644 index 70ca25af..00000000 --- a/crates/cli/src/init.rs +++ /dev/null @@ -1,1548 +0,0 @@ -use std::{ - fs, - path::{Path, PathBuf}, - str::{self, FromStr}, -}; - -use anyhow::{anyhow, Context, Result}; -use crc32fast::hash as crc32; -use heck::{ToKebabCase, ToShoutySnakeCase, ToSnakeCase, ToUpperCamelCase}; -use indoc::{formatdoc, indoc}; -use log::info; -use rand::{thread_rng, Rng}; -use semver::Version; -use serde::{Deserialize, Serialize}; -use serde_json::{Map, Value}; -use tree_sitter_generate::write_file; -use tree_sitter_loader::{ - Author, Bindings, Grammar, Links, Metadata, PathsJSON, TreeSitterJSON, - DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME, DEFAULT_INJECTIONS_QUERY_FILE_NAME, - DEFAULT_LOCALS_QUERY_FILE_NAME, DEFAULT_TAGS_QUERY_FILE_NAME, -}; - -const CLI_VERSION: &str = env!("CARGO_PKG_VERSION"); -const CLI_VERSION_PLACEHOLDER: &str = "CLI_VERSION"; - -const ABI_VERSION_MAX: usize = tree_sitter::LANGUAGE_VERSION; -const ABI_VERSION_MAX_PLACEHOLDER: &str = "ABI_VERSION_MAX"; - -const PARSER_NAME_PLACEHOLDER: &str = "PARSER_NAME"; -const CAMEL_PARSER_NAME_PLACEHOLDER: &str = "CAMEL_PARSER_NAME"; -const TITLE_PARSER_NAME_PLACEHOLDER: &str = "TITLE_PARSER_NAME"; -const UPPER_PARSER_NAME_PLACEHOLDER: &str = "UPPER_PARSER_NAME"; -const LOWER_PARSER_NAME_PLACEHOLDER: &str = "LOWER_PARSER_NAME"; -const KEBAB_PARSER_NAME_PLACEHOLDER: &str = "KEBAB_PARSER_NAME"; -const PARSER_CLASS_NAME_PLACEHOLDER: &str = "PARSER_CLASS_NAME"; - -const PARSER_DESCRIPTION_PLACEHOLDER: &str = "PARSER_DESCRIPTION"; -const PARSER_LICENSE_PLACEHOLDER: &str = "PARSER_LICENSE"; -const PARSER_NS_PLACEHOLDER: &str = "PARSER_NS"; -const PARSER_NS_CLEANED_PLACEHOLDER: &str = "PARSER_NS_CLEANED"; -const PARSER_URL_PLACEHOLDER: &str = "PARSER_URL"; -const PARSER_URL_STRIPPED_PLACEHOLDER: &str = "PARSER_URL_STRIPPED"; -const PARSER_VERSION_PLACEHOLDER: &str = "PARSER_VERSION"; -const PARSER_FINGERPRINT_PLACEHOLDER: &str = "PARSER_FINGERPRINT"; - -const AUTHOR_NAME_PLACEHOLDER: &str = "PARSER_AUTHOR_NAME"; -const AUTHOR_EMAIL_PLACEHOLDER: &str = "PARSER_AUTHOR_EMAIL"; -const AUTHOR_URL_PLACEHOLDER: &str = "PARSER_AUTHOR_URL"; - -const AUTHOR_BLOCK_JS: &str = "\n \"author\": {"; -const AUTHOR_NAME_PLACEHOLDER_JS: &str = "\n \"name\": \"PARSER_AUTHOR_NAME\","; -const AUTHOR_EMAIL_PLACEHOLDER_JS: &str = ",\n \"email\": \"PARSER_AUTHOR_EMAIL\""; -const AUTHOR_URL_PLACEHOLDER_JS: &str = ",\n \"url\": \"PARSER_AUTHOR_URL\""; - -const AUTHOR_BLOCK_PY: &str = "\nauthors = [{"; -const AUTHOR_NAME_PLACEHOLDER_PY: &str = "name = \"PARSER_AUTHOR_NAME\""; -const AUTHOR_EMAIL_PLACEHOLDER_PY: &str = ", email = \"PARSER_AUTHOR_EMAIL\""; - -const AUTHOR_BLOCK_RS: &str = "\nauthors = ["; -const AUTHOR_NAME_PLACEHOLDER_RS: &str = "PARSER_AUTHOR_NAME"; -const AUTHOR_EMAIL_PLACEHOLDER_RS: &str = " PARSER_AUTHOR_EMAIL"; - -const AUTHOR_BLOCK_JAVA: &str = "\n "; -const AUTHOR_NAME_PLACEHOLDER_JAVA: &str = "\n PARSER_AUTHOR_NAME"; -const AUTHOR_EMAIL_PLACEHOLDER_JAVA: &str = "\n PARSER_AUTHOR_EMAIL"; -const AUTHOR_URL_PLACEHOLDER_JAVA: &str = "\n PARSER_AUTHOR_URL"; - -const AUTHOR_BLOCK_GRAMMAR: &str = "\n * @author "; -const AUTHOR_NAME_PLACEHOLDER_GRAMMAR: &str = "PARSER_AUTHOR_NAME"; -const AUTHOR_EMAIL_PLACEHOLDER_GRAMMAR: &str = " PARSER_AUTHOR_EMAIL"; - -const FUNDING_URL_PLACEHOLDER: &str = "FUNDING_URL"; - -const HIGHLIGHTS_QUERY_PATH_PLACEHOLDER: &str = "HIGHLIGHTS_QUERY_PATH"; -const INJECTIONS_QUERY_PATH_PLACEHOLDER: &str = "INJECTIONS_QUERY_PATH"; -const LOCALS_QUERY_PATH_PLACEHOLDER: &str = "LOCALS_QUERY_PATH"; -const TAGS_QUERY_PATH_PLACEHOLDER: &str = "TAGS_QUERY_PATH"; - -const GRAMMAR_JS_TEMPLATE: &str = include_str!("./templates/grammar.js"); -const PACKAGE_JSON_TEMPLATE: &str = include_str!("./templates/package.json"); -const GITIGNORE_TEMPLATE: &str = include_str!("./templates/gitignore"); -const GITATTRIBUTES_TEMPLATE: &str = include_str!("./templates/gitattributes"); -const EDITORCONFIG_TEMPLATE: &str = include_str!("./templates/.editorconfig"); - -const RUST_BINDING_VERSION: &str = env!("CARGO_PKG_VERSION"); -const RUST_BINDING_VERSION_PLACEHOLDER: &str = "RUST_BINDING_VERSION"; - -const LIB_RS_TEMPLATE: &str = include_str!("./templates/lib.rs"); -const BUILD_RS_TEMPLATE: &str = include_str!("./templates/build.rs"); -const CARGO_TOML_TEMPLATE: &str = include_str!("./templates/_cargo.toml"); - -const INDEX_JS_TEMPLATE: &str = include_str!("./templates/index.js"); -const INDEX_D_TS_TEMPLATE: &str = include_str!("./templates/index.d.ts"); -const JS_BINDING_CC_TEMPLATE: &str = include_str!("./templates/js-binding.cc"); -const BINDING_GYP_TEMPLATE: &str = include_str!("./templates/binding.gyp"); -const BINDING_TEST_JS_TEMPLATE: &str = include_str!("./templates/binding_test.js"); - -const MAKEFILE_TEMPLATE: &str = include_str!("./templates/makefile"); -const CMAKELISTS_TXT_TEMPLATE: &str = include_str!("./templates/cmakelists.cmake"); -const PARSER_NAME_H_TEMPLATE: &str = include_str!("./templates/PARSER_NAME.h"); -const PARSER_NAME_PC_IN_TEMPLATE: &str = include_str!("./templates/PARSER_NAME.pc.in"); - -const GO_MOD_TEMPLATE: &str = include_str!("./templates/go.mod"); -const BINDING_GO_TEMPLATE: &str = include_str!("./templates/binding.go"); -const BINDING_TEST_GO_TEMPLATE: &str = include_str!("./templates/binding_test.go"); - -const SETUP_PY_TEMPLATE: &str = include_str!("./templates/setup.py"); -const INIT_PY_TEMPLATE: &str = include_str!("./templates/__init__.py"); -const INIT_PYI_TEMPLATE: &str = include_str!("./templates/__init__.pyi"); -const PYPROJECT_TOML_TEMPLATE: &str = include_str!("./templates/pyproject.toml"); -const PY_BINDING_C_TEMPLATE: &str = include_str!("./templates/py-binding.c"); -const TEST_BINDING_PY_TEMPLATE: &str = include_str!("./templates/test_binding.py"); - -const PACKAGE_SWIFT_TEMPLATE: &str = include_str!("./templates/package.swift"); -const TESTS_SWIFT_TEMPLATE: &str = include_str!("./templates/tests.swift"); - -const POM_XML_TEMPLATE: &str = include_str!("./templates/pom.xml"); -const BINDING_JAVA_TEMPLATE: &str = include_str!("./templates/binding.java"); -const TEST_JAVA_TEMPLATE: &str = include_str!("./templates/test.java"); - -const BUILD_ZIG_TEMPLATE: &str = include_str!("./templates/build.zig"); -const BUILD_ZIG_ZON_TEMPLATE: &str = include_str!("./templates/build.zig.zon"); -const ROOT_ZIG_TEMPLATE: &str = include_str!("./templates/root.zig"); -const TEST_ZIG_TEMPLATE: &str = include_str!("./templates/test.zig"); - -pub const TREE_SITTER_JSON_SCHEMA: &str = - "https://tree-sitter.github.io/tree-sitter/assets/schemas/config.schema.json"; - -#[derive(Serialize, Deserialize, Clone)] -pub struct JsonConfigOpts { - pub name: String, - pub camelcase: String, - pub title: String, - pub description: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub repository: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub funding: Option, - pub scope: String, - pub file_types: Vec, - pub version: Version, - pub license: String, - pub author: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option, - pub namespace: Option, - pub bindings: Bindings, -} - -impl JsonConfigOpts { - #[must_use] - pub fn to_tree_sitter_json(self) -> TreeSitterJSON { - TreeSitterJSON { - schema: Some(TREE_SITTER_JSON_SCHEMA.to_string()), - grammars: vec![Grammar { - name: self.name.clone(), - camelcase: Some(self.camelcase), - title: Some(self.title), - scope: self.scope, - path: None, - external_files: PathsJSON::Empty, - file_types: Some(self.file_types), - highlights: PathsJSON::Empty, - injections: PathsJSON::Empty, - locals: PathsJSON::Empty, - tags: PathsJSON::Empty, - injection_regex: Some(format!("^{}$", self.name)), - first_line_regex: None, - content_regex: None, - class_name: Some(format!("TreeSitter{}", self.name.to_upper_camel_case())), - }], - metadata: Metadata { - version: self.version, - license: Some(self.license), - description: Some(self.description), - authors: Some(vec![Author { - name: self.author, - email: self.email, - url: self.url, - }]), - links: Some(Links { - repository: self.repository.unwrap_or_else(|| { - format!("https://github.com/tree-sitter/tree-sitter-{}", self.name) - }), - funding: self.funding, - }), - namespace: self.namespace, - }, - bindings: self.bindings, - } - } -} - -impl Default for JsonConfigOpts { - fn default() -> Self { - Self { - name: String::new(), - camelcase: String::new(), - title: String::new(), - description: String::new(), - repository: None, - funding: None, - scope: String::new(), - file_types: vec![], - version: Version::from_str("0.1.0").unwrap(), - license: String::new(), - author: String::new(), - email: None, - url: None, - namespace: None, - bindings: Bindings::default(), - } - } -} - -struct GenerateOpts<'a> { - author_name: Option<&'a str>, - author_email: Option<&'a str>, - author_url: Option<&'a str>, - license: Option<&'a str>, - description: Option<&'a str>, - repository: Option<&'a str>, - funding: Option<&'a str>, - version: &'a Version, - camel_parser_name: &'a str, - title_parser_name: &'a str, - class_name: &'a str, - highlights_query_path: &'a str, - injections_query_path: &'a str, - locals_query_path: &'a str, - tags_query_path: &'a str, - namespace: Option<&'a str>, -} - -pub fn generate_grammar_files( - repo_path: &Path, - language_name: &str, - allow_update: bool, - opts: Option<&JsonConfigOpts>, -) -> Result<()> { - let dashed_language_name = language_name.to_kebab_case(); - - let tree_sitter_config = missing_path_else( - repo_path.join("tree-sitter.json"), - true, - |path| { - // invariant: opts is always Some when `tree-sitter.json` doesn't exist - let Some(opts) = opts else { unreachable!() }; - - let tree_sitter_json = opts.clone().to_tree_sitter_json(); - write_file(path, serde_json::to_string_pretty(&tree_sitter_json)?)?; - Ok(()) - }, - |path| { - // updating the config, if needed - if let Some(opts) = opts { - let tree_sitter_json = opts.clone().to_tree_sitter_json(); - write_file(path, serde_json::to_string_pretty(&tree_sitter_json)?)?; - } - Ok(()) - }, - )?; - - let tree_sitter_config = serde_json::from_str::( - &fs::read_to_string(tree_sitter_config.as_path()) - .with_context(|| "Failed to read tree-sitter.json")?, - )?; - - let authors = tree_sitter_config.metadata.authors.as_ref(); - let camel_name = tree_sitter_config.grammars[0] - .camelcase - .clone() - .unwrap_or_else(|| language_name.to_upper_camel_case()); - let title_name = tree_sitter_config.grammars[0] - .title - .clone() - .unwrap_or_else(|| language_name.to_upper_camel_case()); - let class_name = tree_sitter_config.grammars[0] - .class_name - .clone() - .unwrap_or_else(|| format!("TreeSitter{}", language_name.to_upper_camel_case())); - - let default_highlights_path = Path::new("queries").join(DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME); - let default_injections_path = Path::new("queries").join(DEFAULT_INJECTIONS_QUERY_FILE_NAME); - let default_locals_path = Path::new("queries").join(DEFAULT_LOCALS_QUERY_FILE_NAME); - let default_tags_path = Path::new("queries").join(DEFAULT_TAGS_QUERY_FILE_NAME); - - let generate_opts = GenerateOpts { - author_name: authors - .map(|a| a.first().map(|a| a.name.as_str())) - .unwrap_or_default(), - author_email: authors - .map(|a| a.first().and_then(|a| a.email.as_deref())) - .unwrap_or_default(), - author_url: authors - .map(|a| a.first().and_then(|a| a.url.as_deref())) - .unwrap_or_default(), - license: tree_sitter_config.metadata.license.as_deref(), - description: tree_sitter_config.metadata.description.as_deref(), - repository: tree_sitter_config - .metadata - .links - .as_ref() - .map(|l| l.repository.as_str()), - funding: tree_sitter_config - .metadata - .links - .as_ref() - .and_then(|l| l.funding.as_deref()), - version: &tree_sitter_config.metadata.version, - camel_parser_name: &camel_name, - title_parser_name: &title_name, - class_name: &class_name, - highlights_query_path: tree_sitter_config.grammars[0] - .highlights - .to_variable_value(&default_highlights_path), - injections_query_path: tree_sitter_config.grammars[0] - .injections - .to_variable_value(&default_injections_path), - locals_query_path: tree_sitter_config.grammars[0] - .locals - .to_variable_value(&default_locals_path), - tags_query_path: tree_sitter_config.grammars[0] - .tags - .to_variable_value(&default_tags_path), - namespace: tree_sitter_config.metadata.namespace.as_deref(), - }; - - // Create package.json - missing_path_else( - repo_path.join("package.json"), - allow_update, - |path| { - generate_file( - path, - PACKAGE_JSON_TEMPLATE, - dashed_language_name.as_str(), - &generate_opts, - ) - }, - |path| { - let mut contents = fs::read_to_string(path)? - .replace( - r#""node-addon-api": "^8.3.1""#, - r#""node-addon-api": "^8.5.0""#, - ) - .replace( - indoc! {r#" - "prebuildify": "^6.0.1", - "tree-sitter-cli":"#}, - indoc! {r#" - "prebuildify": "^6.0.1", - "tree-sitter": "^0.25.0", - "tree-sitter-cli":"#}, - ); - if !contents.contains("module") { - info!("Migrating package.json to ESM"); - contents = contents.replace( - r#""repository":"#, - indoc! {r#" - "type": "module", - "repository":"#}, - ); - } - write_file(path, contents)?; - Ok(()) - }, - )?; - - // Do not create a grammar.js file in a repo with multiple language configs - if !tree_sitter_config.has_multiple_language_configs() { - missing_path_else( - repo_path.join("grammar.js"), - allow_update, - |path| generate_file(path, GRAMMAR_JS_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - if contents.contains("module.exports") { - info!("Migrating grammars.js to ESM"); - contents = contents.replace("module.exports =", "export default"); - write_file(path, contents)?; - } - - Ok(()) - }, - )?; - } - - // Write .gitignore file - missing_path_else( - repo_path.join(".gitignore"), - allow_update, - |path| generate_file(path, GITIGNORE_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("Zig artifacts") { - info!("Adding zig entries to .gitignore"); - contents.push('\n'); - contents.push_str(indoc! {" - # Zig artifacts - .zig-cache/ - zig-cache/ - zig-out/ - "}); - } - Ok(()) - }, - )?; - - // Write .gitattributes file - missing_path_else( - repo_path.join(".gitattributes"), - allow_update, - |path| generate_file(path, GITATTRIBUTES_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - let c_bindings_entry = "bindings/c/* "; - if contents.contains(c_bindings_entry) { - info!("Updating c bindings entry in .gitattributes"); - contents = contents.replace(c_bindings_entry, "bindings/c/** "); - } - if !contents.contains("Zig bindings") { - info!("Adding zig entries to .gitattributes"); - contents.push('\n'); - contents.push_str(indoc! {" - # Zig bindings - build.zig linguist-generated - build.zig.zon linguist-generated - "}); - } - write_file(path, contents)?; - Ok(()) - }, - )?; - - // Write .editorconfig file - missing_path(repo_path.join(".editorconfig"), |path| { - generate_file(path, EDITORCONFIG_TEMPLATE, language_name, &generate_opts) - })?; - - let bindings_dir = repo_path.join("bindings"); - - // Generate Rust bindings - if tree_sitter_config.bindings.rust { - missing_path(bindings_dir.join("rust"), create_dir)?.apply(|path| { - missing_path_else(path.join("lib.rs"), allow_update, |path| { - generate_file(path, LIB_RS_TEMPLATE, language_name, &generate_opts) - }, |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("#[cfg(with_highlights_query)]") { - info!("Updating query constants in bindings/rust/lib.rs"); - let replacement = indoc! {r#" - #[cfg(with_highlights_query)] - /// The syntax highlighting query for this grammar. - pub const HIGHLIGHTS_QUERY: &str = include_str!("../../HIGHLIGHTS_QUERY_PATH"); - - #[cfg(with_injections_query)] - /// The language injection query for this grammar. - pub const INJECTIONS_QUERY: &str = include_str!("../../INJECTIONS_QUERY_PATH"); - - #[cfg(with_locals_query)] - /// The local variable query for this grammar. - pub const LOCALS_QUERY: &str = include_str!("../../LOCALS_QUERY_PATH"); - - #[cfg(with_tags_query)] - /// The symbol tagging query for this grammar. - pub const TAGS_QUERY: &str = include_str!("../../TAGS_QUERY_PATH"); - "#} - .replace("HIGHLIGHTS_QUERY_PATH", generate_opts.highlights_query_path) - .replace("INJECTIONS_QUERY_PATH", generate_opts.injections_query_path) - .replace("LOCALS_QUERY_PATH", generate_opts.locals_query_path) - .replace("TAGS_QUERY_PATH", generate_opts.tags_query_path); - contents = contents - .replace( - indoc! {r#" - // NOTE: uncomment these to include any queries that this grammar contains: - - // pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm"); - // pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm"); - // pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm"); - // pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm"); - "#}, - &replacement, - ); - } - write_file(path, contents)?; - Ok(()) - })?; - - missing_path_else( - path.join("build.rs"), - allow_update, - |path| generate_file(path, BUILD_RS_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("wasm32-unknown-unknown") { - info!("Adding wasm32-unknown-unknown target to bindings/rust/build.rs"); - let replacement = indoc!{r#" - c_config.flag("-utf-8"); - - if std::env::var("TARGET").unwrap() == "wasm32-unknown-unknown" { - let Ok(wasm_headers) = std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); - }; - let Ok(wasm_src) = - std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(std::path::PathBuf::from) - else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); - }; - - c_config.include(&wasm_headers); - c_config.files([ - wasm_src.join("stdio.c"), - wasm_src.join("stdlib.c"), - wasm_src.join("string.c"), - ]); - } - "#} - .lines() - .map(|line| if line.is_empty() { line.to_string() } else { format!(" {line}") }) - .collect::>() - .join("\n"); - - contents = contents.replace(r#" c_config.flag("-utf-8");"#, &replacement); - } - - // Introduce configuration variables for dynamic query inclusion - if !contents.contains("with_highlights_query") { - info!("Adding support for dynamic query inclusion to bindings/rust/build.rs"); - let replaced = indoc! {r#" - c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); - }"#} - .replace("KEBAB_PARSER_NAME", &language_name.to_kebab_case()); - - let replacement = indoc! {r#" - c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); - - println!("cargo:rustc-check-cfg=cfg(with_highlights_query)"); - if !"HIGHLIGHTS_QUERY_PATH".is_empty() && std::path::Path::new("HIGHLIGHTS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_highlights_query"); - } - println!("cargo:rustc-check-cfg=cfg(with_injections_query)"); - if !"INJECTIONS_QUERY_PATH".is_empty() && std::path::Path::new("INJECTIONS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_injections_query"); - } - println!("cargo:rustc-check-cfg=cfg(with_locals_query)"); - if !"LOCALS_QUERY_PATH".is_empty() && std::path::Path::new("LOCALS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_locals_query"); - } - println!("cargo:rustc-check-cfg=cfg(with_tags_query)"); - if !"TAGS_QUERY_PATH".is_empty() && std::path::Path::new("TAGS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_tags_query"); - } - }"#} - .replace("KEBAB_PARSER_NAME", &language_name.to_kebab_case()) - .replace("HIGHLIGHTS_QUERY_PATH", generate_opts.highlights_query_path) - .replace("INJECTIONS_QUERY_PATH", generate_opts.injections_query_path) - .replace("LOCALS_QUERY_PATH", generate_opts.locals_query_path) - .replace("TAGS_QUERY_PATH", generate_opts.tags_query_path); - - contents = contents.replace( - &replaced, - &replacement, - ); - } - - write_file(path, contents)?; - Ok(()) - }, - )?; - - missing_path_else( - repo_path.join("Cargo.toml"), - allow_update, - |path| { - generate_file( - path, - CARGO_TOML_TEMPLATE, - dashed_language_name.as_str(), - &generate_opts, - ) - }, - |path| { - let contents = fs::read_to_string(path)?; - if contents.contains("\"LICENSE\"") { - info!("Adding LICENSE entry to bindings/rust/Cargo.toml"); - write_file(path, contents.replace("\"LICENSE\"", "\"/LICENSE\""))?; - } - Ok(()) - }, - )?; - - Ok(()) - })?; - } - - // Generate Node bindings - if tree_sitter_config.bindings.node { - missing_path(bindings_dir.join("node"), create_dir)?.apply(|path| { - missing_path_else( - path.join("index.js"), - allow_update, - |path| generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - if !contents.contains("Object.defineProperty") { - info!("Replacing index.js"); - generate_file(path, INDEX_JS_TEMPLATE, language_name, &generate_opts)?; - } - Ok(()) - }, - )?; - - missing_path_else( - path.join("index.d.ts"), - allow_update, - |path| generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - if !contents.contains("export default binding") { - info!("Replacing index.d.ts"); - generate_file(path, INDEX_D_TS_TEMPLATE, language_name, &generate_opts)?; - } - Ok(()) - }, - )?; - - missing_path_else( - path.join("binding_test.js"), - allow_update, - |path| { - generate_file( - path, - BINDING_TEST_JS_TEMPLATE, - language_name, - &generate_opts, - ) - }, - |path| { - let contents = fs::read_to_string(path)?; - if !contents.contains("import") { - info!("Replacing binding_test.js"); - generate_file( - path, - BINDING_TEST_JS_TEMPLATE, - language_name, - &generate_opts, - )?; - } - Ok(()) - }, - )?; - - missing_path(path.join("binding.cc"), |path| { - generate_file(path, JS_BINDING_CC_TEMPLATE, language_name, &generate_opts) - })?; - - missing_path_else( - repo_path.join("binding.gyp"), - allow_update, - |path| generate_file(path, BINDING_GYP_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - if contents.contains("fs.exists(") { - info!("Replacing `fs.exists` calls in binding.gyp"); - write_file(path, contents.replace("fs.exists(", "fs.existsSync("))?; - } - Ok(()) - }, - )?; - - Ok(()) - })?; - } - - // Generate C bindings - if tree_sitter_config.bindings.c { - let kebab_case_name = language_name.to_kebab_case(); - missing_path(bindings_dir.join("c"), create_dir)?.apply(|path| { - let header_name = format!("tree-sitter-{kebab_case_name}.h"); - let old_file = &path.join(&header_name); - if allow_update && fs::exists(old_file).unwrap_or(false) { - info!("Removing bindings/c/{header_name}"); - fs::remove_file(old_file)?; - } - missing_path(path.join("tree_sitter"), create_dir)?.apply(|include_path| { - missing_path( - include_path.join(&header_name), - |path| { - generate_file(path, PARSER_NAME_H_TEMPLATE, language_name, &generate_opts) - }, - )?; - Ok(()) - })?; - - missing_path( - path.join(format!("tree-sitter-{kebab_case_name}.pc.in")), - |path| { - generate_file( - path, - PARSER_NAME_PC_IN_TEMPLATE, - language_name, - &generate_opts, - ) - }, - )?; - - missing_path_else( - repo_path.join("Makefile"), - allow_update, - |path| { - generate_file(path, MAKEFILE_TEMPLATE, language_name, &generate_opts) - }, - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("cd '$(DESTDIR)$(LIBDIR)' && ln -sf") { - info!("Replacing Makefile"); - generate_file(path, MAKEFILE_TEMPLATE, language_name, &generate_opts)?; - } else { - let replaced = indoc! {r" - $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate $^ - "}; - if contents.contains(replaced) { - info!("Adding --no-parser target to Makefile"); - contents = contents - .replace( - replaced, - indoc! {r" - $(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --no-parser $^ - - $(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate $^ - "} - ); - } - write_file(path, contents)?; - } - Ok(()) - }, - )?; - - missing_path_else( - repo_path.join("CMakeLists.txt"), - allow_update, - |path| generate_file(path, CMAKELISTS_TXT_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - let replaced_contents = contents - .replace("add_custom_target(test", "add_custom_target(ts-test") - .replace( - &formatdoc! {r#" - install(FILES bindings/c/tree-sitter-{language_name}.h - DESTINATION "${{CMAKE_INSTALL_INCLUDEDIR}}/tree_sitter") - "#}, - indoc! {r#" - install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bindings/c/tree_sitter" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - FILES_MATCHING PATTERN "*.h") - "#} - ).replace( - &format!("target_include_directories(tree-sitter-{language_name} PRIVATE src)"), - &formatdoc! {" - target_include_directories(tree-sitter-{language_name} - PRIVATE src - INTERFACE $ - $) - "} - ).replace( - indoc! {r#" - add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" - COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --abi=${TREE_SITTER_ABI_VERSION} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generating parser.c") - "#}, - indoc! {r#" - add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" - "${CMAKE_CURRENT_SOURCE_DIR}/src/node-types.json" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" - COMMAND "${TREE_SITTER_CLI}" generate grammar.js --no-parser - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generating grammar.json") - - add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" - BYPRODUCTS "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/parser.h" - "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/alloc.h" - "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/array.h" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" - COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --abi=${TREE_SITTER_ABI_VERSION} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generating parser.c") - "#} - ); - if !replaced_contents.eq(&contents) { - info!("Updating CMakeLists.txt"); - write_file(path, replaced_contents)?; - } - Ok(()) - }, - )?; - - Ok(()) - })?; - } - - // Generate Go bindings - if tree_sitter_config.bindings.go { - missing_path(bindings_dir.join("go"), create_dir)?.apply(|path| { - missing_path(path.join("binding.go"), |path| { - generate_file(path, BINDING_GO_TEMPLATE, language_name, &generate_opts) - })?; - - missing_path(path.join("binding_test.go"), |path| { - generate_file( - path, - BINDING_TEST_GO_TEMPLATE, - language_name, - &generate_opts, - ) - })?; - - missing_path(repo_path.join("go.mod"), |path| { - generate_file(path, GO_MOD_TEMPLATE, language_name, &generate_opts) - })?; - - Ok(()) - })?; - } - - // Generate Python bindings - if tree_sitter_config.bindings.python { - missing_path(bindings_dir.join("python"), create_dir)?.apply(|path| { - let snake_case_grammar_name = format!("tree_sitter_{}", language_name.to_snake_case()); - let lang_path = path.join(&snake_case_grammar_name); - missing_path(&lang_path, create_dir)?; - - missing_path_else( - lang_path.join("binding.c"), - allow_update, - |path| generate_file(path, PY_BINDING_C_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("PyModuleDef_Init") { - info!("Updating bindings/python/{snake_case_grammar_name}/binding.c"); - contents = contents - .replace("PyModule_Create", "PyModuleDef_Init") - .replace( - "static PyMethodDef methods[] = {\n", - indoc! {" - static struct PyModuleDef_Slot slots[] = { - #ifdef Py_GIL_DISABLED - {Py_mod_gil, Py_MOD_GIL_NOT_USED}, - #endif - {0, NULL} - }; - - static PyMethodDef methods[] = { - "}, - ) - .replace( - indoc! {" - .m_size = -1, - .m_methods = methods - "}, - indoc! {" - .m_size = 0, - .m_methods = methods, - .m_slots = slots, - "}, - ); - write_file(path, contents)?; - } - Ok(()) - }, - )?; - - missing_path_else( - lang_path.join("__init__.py"), - allow_update, - |path| { - generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts) - }, - |path| { - let contents = fs::read_to_string(path)?; - if !contents.contains("uncomment these to include any queries") { - info!("Replacing __init__.py"); - generate_file(path, INIT_PY_TEMPLATE, language_name, &generate_opts)?; - } - Ok(()) - }, - )?; - - missing_path_else( - lang_path.join("__init__.pyi"), - allow_update, - |path| generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - if contents.contains("uncomment these to include any queries") { - info!("Replacing __init__.pyi"); - generate_file(path, INIT_PYI_TEMPLATE, language_name, &generate_opts)?; - } else if !contents.contains("CapsuleType") { - info!("Updating __init__.pyi"); - contents = contents - .replace( - "from typing import Final", - "from typing import Final\nfrom typing_extensions import CapsuleType" - ) - .replace("-> object:", "-> CapsuleType:"); - write_file(path, contents)?; - } - Ok(()) - }, - )?; - - missing_path(lang_path.join("py.typed"), |path| { - generate_file(path, "", language_name, &generate_opts) // py.typed is empty - })?; - - missing_path(path.join("tests"), create_dir)?.apply(|path| { - missing_path_else( - path.join("test_binding.py"), - allow_update, - |path| { - generate_file( - path, - TEST_BINDING_PY_TEMPLATE, - language_name, - &generate_opts, - ) - }, - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("Parser(Language(") { - info!("Updating Language function in bindings/python/tests/test_binding.py"); - contents = contents - .replace("tree_sitter.Language(", "Parser(Language(") - .replace(".language())\n", ".language()))\n") - .replace( - "import tree_sitter\n", - "from tree_sitter import Language, Parser\n", - ); - write_file(path, contents)?; - } - Ok(()) - }, - )?; - Ok(()) - })?; - - missing_path_else( - repo_path.join("setup.py"), - allow_update, - |path| generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts), - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("build_ext") { - info!("Replacing setup.py"); - generate_file(path, SETUP_PY_TEMPLATE, language_name, &generate_opts)?; - } - if !contents.contains(" and not get_config_var") { - info!("Updating Python free-threading support in setup.py"); - contents = contents.replace( - r#"startswith("cp"):"#, - r#"startswith("cp") and not get_config_var("Py_GIL_DISABLED"):"# - ); - write_file(path, contents)?; - } - Ok(()) - }, - )?; - - missing_path_else( - repo_path.join("pyproject.toml"), - allow_update, - |path| { - generate_file( - path, - PYPROJECT_TOML_TEMPLATE, - dashed_language_name.as_str(), - &generate_opts, - ) - }, - |path| { - let mut contents = fs::read_to_string(path)?; - if !contents.contains("cp310-*") { - info!("Updating dependencies in pyproject.toml"); - contents = contents - .replace(r#"build = "cp39-*""#, r#"build = "cp310-*""#) - .replace(r#"python = ">=3.9""#, r#"python = ">=3.10""#) - .replace("tree-sitter~=0.22", "tree-sitter~=0.24"); - write_file(path, contents)?; - } - Ok(()) - }, - )?; - - Ok(()) - })?; - } - - // Generate Swift bindings - if tree_sitter_config.bindings.swift { - missing_path(bindings_dir.join("swift"), create_dir)?.apply(|path| { - let lang_path = path.join(&class_name); - missing_path(&lang_path, create_dir)?; - - missing_path(lang_path.join(format!("{language_name}.h")), |path| { - generate_file(path, PARSER_NAME_H_TEMPLATE, language_name, &generate_opts) - })?; - - missing_path(path.join(format!("{class_name}Tests")), create_dir)?.apply(|path| { - missing_path(path.join(format!("{class_name}Tests.swift")), |path| { - generate_file(path, TESTS_SWIFT_TEMPLATE, language_name, &generate_opts) - })?; - - Ok(()) - })?; - - missing_path_else( - repo_path.join("Package.swift"), - allow_update, - |path| generate_file(path, PACKAGE_SWIFT_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - let replaced_contents = contents - .replace( - "https://github.com/ChimeHQ/SwiftTreeSitter", - "https://github.com/tree-sitter/swift-tree-sitter", - ) - .replace("version: \"0.8.0\")", "version: \"0.9.0\")") - .replace("(url:", "(name: \"SwiftTreeSitter\", url:"); - if !replaced_contents.eq(&contents) { - info!("Updating tree-sitter dependency in Package.swift"); - write_file(path, contents)?; - } - Ok(()) - }, - )?; - - Ok(()) - })?; - } - - // Generate Zig bindings - if tree_sitter_config.bindings.zig { - missing_path_else( - repo_path.join("build.zig"), - allow_update, - |path| generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - if !contents.contains("b.pkg_hash.len") { - info!("Replacing build.zig"); - generate_file(path, BUILD_ZIG_TEMPLATE, language_name, &generate_opts) - } else { - Ok(()) - } - }, - )?; - - missing_path_else( - repo_path.join("build.zig.zon"), - allow_update, - |path| generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - if !contents.contains(".name = .tree_sitter_") { - info!("Replacing build.zig.zon"); - generate_file(path, BUILD_ZIG_ZON_TEMPLATE, language_name, &generate_opts) - } else { - Ok(()) - } - }, - )?; - - missing_path(bindings_dir.join("zig"), create_dir)?.apply(|path| { - missing_path_else( - path.join("root.zig"), - allow_update, - |path| generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts), - |path| { - let contents = fs::read_to_string(path)?; - if contents.contains("ts.Language") { - info!("Replacing root.zig"); - generate_file(path, ROOT_ZIG_TEMPLATE, language_name, &generate_opts) - } else { - Ok(()) - } - }, - )?; - - missing_path(path.join("test.zig"), |path| { - generate_file(path, TEST_ZIG_TEMPLATE, language_name, &generate_opts) - })?; - - Ok(()) - })?; - } - - // Generate Java bindings - if tree_sitter_config.bindings.java { - missing_path(repo_path.join("pom.xml"), |path| { - generate_file(path, POM_XML_TEMPLATE, language_name, &generate_opts) - })?; - - missing_path(bindings_dir.join("java"), create_dir)?.apply(|path| { - missing_path(path.join("main"), create_dir)?.apply(|path| { - let package_path = generate_opts - .namespace - .unwrap_or("io.github.treesitter") - .replace(['-', '_'], "") - .split('.') - .fold(path.to_path_buf(), |path, dir| path.join(dir)) - .join("jtreesitter") - .join(language_name.to_lowercase().replace('_', "")); - missing_path(package_path, create_dir)?.apply(|path| { - missing_path(path.join(format!("{class_name}.java")), |path| { - generate_file(path, BINDING_JAVA_TEMPLATE, language_name, &generate_opts) - })?; - - Ok(()) - })?; - - Ok(()) - })?; - - missing_path(path.join("test"), create_dir)?.apply(|path| { - missing_path(path.join(format!("{class_name}Test.java")), |path| { - generate_file(path, TEST_JAVA_TEMPLATE, language_name, &generate_opts) - })?; - - Ok(()) - })?; - - Ok(()) - })?; - } - - Ok(()) -} - -pub fn get_root_path(path: &Path) -> Result { - let mut pathbuf = path.to_owned(); - let filename = path.file_name().unwrap().to_str().unwrap(); - let is_package_json = filename == "package.json"; - loop { - let json = pathbuf - .exists() - .then(|| { - let contents = fs::read_to_string(pathbuf.as_path()) - .with_context(|| format!("Failed to read {filename}"))?; - if is_package_json { - serde_json::from_str::>(&contents) - .context(format!("Failed to parse {filename}")) - .map(|v| v.contains_key("tree-sitter")) - } else { - serde_json::from_str::(&contents) - .context(format!("Failed to parse {filename}")) - .map(|_| true) - } - }) - .transpose()?; - if json == Some(true) { - return Ok(pathbuf.parent().unwrap().to_path_buf()); - } - pathbuf.pop(); // filename - if !pathbuf.pop() { - return Err(anyhow!(format!( - concat!( - "Failed to locate a {} file,", - " please ensure you have one, and if you don't then consult the docs", - ), - filename - ))); - } - pathbuf.push(filename); - } -} - -fn generate_file( - path: &Path, - template: &str, - language_name: &str, - generate_opts: &GenerateOpts, -) -> Result<()> { - let filename = path.file_name().unwrap().to_str().unwrap(); - - let lower_parser_name = if path - .extension() - .is_some_and(|e| e.eq_ignore_ascii_case("java")) - { - language_name.to_snake_case().replace('_', "") - } else { - language_name.to_snake_case() - }; - - let mut replacement = template - .replace( - CAMEL_PARSER_NAME_PLACEHOLDER, - generate_opts.camel_parser_name, - ) - .replace( - TITLE_PARSER_NAME_PLACEHOLDER, - generate_opts.title_parser_name, - ) - .replace( - UPPER_PARSER_NAME_PLACEHOLDER, - &language_name.to_shouty_snake_case(), - ) - .replace( - KEBAB_PARSER_NAME_PLACEHOLDER, - &language_name.to_kebab_case(), - ) - .replace(LOWER_PARSER_NAME_PLACEHOLDER, &lower_parser_name) - .replace(PARSER_NAME_PLACEHOLDER, language_name) - .replace(CLI_VERSION_PLACEHOLDER, CLI_VERSION) - .replace(RUST_BINDING_VERSION_PLACEHOLDER, RUST_BINDING_VERSION) - .replace(ABI_VERSION_MAX_PLACEHOLDER, &ABI_VERSION_MAX.to_string()) - .replace( - PARSER_VERSION_PLACEHOLDER, - &generate_opts.version.to_string(), - ) - .replace(PARSER_CLASS_NAME_PLACEHOLDER, generate_opts.class_name) - .replace( - HIGHLIGHTS_QUERY_PATH_PLACEHOLDER, - generate_opts.highlights_query_path, - ) - .replace( - INJECTIONS_QUERY_PATH_PLACEHOLDER, - generate_opts.injections_query_path, - ) - .replace( - LOCALS_QUERY_PATH_PLACEHOLDER, - generate_opts.locals_query_path, - ) - .replace(TAGS_QUERY_PATH_PLACEHOLDER, generate_opts.tags_query_path); - - if let Some(name) = generate_opts.author_name { - replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER, name); - } else { - match filename { - "package.json" => { - replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_JS, ""); - } - "pyproject.toml" => { - replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_PY, ""); - } - "grammar.js" => { - replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_GRAMMAR, ""); - } - "Cargo.toml" => { - replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_RS, ""); - } - "pom.xml" => { - replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER_JAVA, ""); - } - _ => {} - } - } - - if let Some(email) = generate_opts.author_email { - replacement = match filename { - "Cargo.toml" | "grammar.js" => { - replacement.replace(AUTHOR_EMAIL_PLACEHOLDER, &format!("<{email}>")) - } - _ => replacement.replace(AUTHOR_EMAIL_PLACEHOLDER, email), - } - } else { - match filename { - "package.json" => { - replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_JS, ""); - } - "pyproject.toml" => { - replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_PY, ""); - } - "grammar.js" => { - replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_GRAMMAR, ""); - } - "Cargo.toml" => { - replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_RS, ""); - } - "pom.xml" => { - replacement = replacement.replace(AUTHOR_EMAIL_PLACEHOLDER_JAVA, ""); - } - _ => {} - } - } - - match (generate_opts.author_url, filename) { - (Some(url), "package.json" | "pom.xml") => { - replacement = replacement.replace(AUTHOR_URL_PLACEHOLDER, url); - } - (None, "package.json") => { - replacement = replacement.replace(AUTHOR_URL_PLACEHOLDER_JS, ""); - } - (None, "pom.xml") => { - replacement = replacement.replace(AUTHOR_URL_PLACEHOLDER_JAVA, ""); - } - _ => {} - } - - if generate_opts.author_name.is_none() - && generate_opts.author_email.is_none() - && generate_opts.author_url.is_none() - { - match filename { - "package.json" => { - if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_JS) { - if let Some(end_idx) = replacement[start_idx..] - .find("},") - .map(|i| i + start_idx + 2) - { - replacement.replace_range(start_idx..end_idx, ""); - } - } - } - "pom.xml" => { - if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_JAVA) { - if let Some(end_idx) = replacement[start_idx..] - .find("") - .map(|i| i + start_idx + 12) - { - replacement.replace_range(start_idx..end_idx, ""); - } - } - } - _ => {} - } - } else if generate_opts.author_name.is_none() && generate_opts.author_email.is_none() { - match filename { - "pyproject.toml" => { - if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_PY) { - if let Some(end_idx) = replacement[start_idx..] - .find("}]") - .map(|i| i + start_idx + 2) - { - replacement.replace_range(start_idx..end_idx, ""); - } - } - } - "grammar.js" => { - if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_GRAMMAR) { - if let Some(end_idx) = replacement[start_idx..] - .find(" \n") - .map(|i| i + start_idx + 1) - { - replacement.replace_range(start_idx..end_idx, ""); - } - } - } - "Cargo.toml" => { - if let Some(start_idx) = replacement.find(AUTHOR_BLOCK_RS) { - if let Some(end_idx) = replacement[start_idx..] - .find("\"]") - .map(|i| i + start_idx + 2) - { - replacement.replace_range(start_idx..end_idx, ""); - } - } - } - _ => {} - } - } - - if let Some(license) = generate_opts.license { - replacement = replacement.replace(PARSER_LICENSE_PLACEHOLDER, license); - } else { - replacement = replacement.replace(PARSER_LICENSE_PLACEHOLDER, "MIT"); - } - - if let Some(description) = generate_opts.description { - replacement = replacement.replace(PARSER_DESCRIPTION_PLACEHOLDER, description); - } else { - replacement = replacement.replace( - PARSER_DESCRIPTION_PLACEHOLDER, - &format!( - "{} grammar for tree-sitter", - generate_opts.camel_parser_name, - ), - ); - } - - if let Some(repository) = generate_opts.repository { - replacement = replacement - .replace( - PARSER_URL_STRIPPED_PLACEHOLDER, - &repository.replace("https://", "").to_lowercase(), - ) - .replace(PARSER_URL_PLACEHOLDER, &repository.to_lowercase()); - } else { - replacement = replacement - .replace( - PARSER_URL_STRIPPED_PLACEHOLDER, - &format!( - "github.com/tree-sitter/tree-sitter-{}", - language_name.to_lowercase() - ), - ) - .replace( - PARSER_URL_PLACEHOLDER, - &format!( - "https://github.com/tree-sitter/tree-sitter-{}", - language_name.to_lowercase() - ), - ); - } - - if let Some(namespace) = generate_opts.namespace { - replacement = replacement - .replace( - PARSER_NS_CLEANED_PLACEHOLDER, - &namespace.replace(['-', '_'], ""), - ) - .replace(PARSER_NS_PLACEHOLDER, namespace); - } else { - replacement = replacement - .replace(PARSER_NS_CLEANED_PLACEHOLDER, "io.github.treesitter") - .replace(PARSER_NS_PLACEHOLDER, "io.github.tree-sitter"); - } - - if let Some(funding_url) = generate_opts.funding { - match filename { - "pyproject.toml" | "package.json" => { - replacement = replacement.replace(FUNDING_URL_PLACEHOLDER, funding_url); - } - _ => {} - } - } else { - match filename { - "package.json" => { - replacement = replacement.replace(" \"funding\": \"FUNDING_URL\",\n", ""); - } - "pyproject.toml" => { - replacement = replacement.replace("Funding = \"FUNDING_URL\"\n", ""); - } - _ => {} - } - } - - if filename == "build.zig.zon" { - let id = thread_rng().gen_range(1u32..0xFFFF_FFFFu32); - let checksum = crc32(format!("tree_sitter_{language_name}").as_bytes()); - replacement = replacement.replace( - PARSER_FINGERPRINT_PLACEHOLDER, - #[cfg(target_endian = "little")] - &format!("0x{checksum:x}{id:x}"), - #[cfg(target_endian = "big")] - &format!("0x{id:x}{checksum:x}"), - ); - } - - write_file(path, replacement)?; - Ok(()) -} - -fn create_dir(path: &Path) -> Result<()> { - fs::create_dir_all(path) - .with_context(|| format!("Failed to create {:?}", path.to_string_lossy())) -} - -#[derive(PartialEq, Eq, Debug)] -enum PathState

-where - P: AsRef, -{ - Exists(P), - Missing(P), -} - -#[allow(dead_code)] -impl

PathState

-where - P: AsRef, -{ - fn exists(&self, mut action: impl FnMut(&Path) -> Result<()>) -> Result<&Self> { - if let Self::Exists(path) = self { - action(path.as_ref())?; - } - Ok(self) - } - - fn missing(&self, mut action: impl FnMut(&Path) -> Result<()>) -> Result<&Self> { - if let Self::Missing(path) = self { - action(path.as_ref())?; - } - Ok(self) - } - - fn apply(&self, mut action: impl FnMut(&Path) -> Result<()>) -> Result<&Self> { - action(self.as_path())?; - Ok(self) - } - - fn apply_state(&self, mut action: impl FnMut(&Self) -> Result<()>) -> Result<&Self> { - action(self)?; - Ok(self) - } - - fn as_path(&self) -> &Path { - match self { - Self::Exists(path) | Self::Missing(path) => path.as_ref(), - } - } -} - -fn missing_path(path: P, mut action: F) -> Result> -where - P: AsRef, - F: FnMut(&Path) -> Result<()>, -{ - let path_ref = path.as_ref(); - if !path_ref.exists() { - action(path_ref)?; - Ok(PathState::Missing(path)) - } else { - Ok(PathState::Exists(path)) - } -} - -fn missing_path_else( - path: P, - allow_update: bool, - mut action: T, - mut else_action: F, -) -> Result> -where - P: AsRef, - T: FnMut(&Path) -> Result<()>, - F: FnMut(&Path) -> Result<()>, -{ - let path_ref = path.as_ref(); - if !path_ref.exists() { - action(path_ref)?; - Ok(PathState::Missing(path)) - } else { - if allow_update { - else_action(path_ref)?; - } - Ok(PathState::Exists(path)) - } -} diff --git a/crates/cli/src/input.rs b/crates/cli/src/input.rs deleted file mode 100644 index 5ab82087..00000000 --- a/crates/cli/src/input.rs +++ /dev/null @@ -1,187 +0,0 @@ -use std::{ - fs, - io::{Read, Write}, - path::{Path, PathBuf}, - sync::{ - atomic::{AtomicUsize, Ordering}, - mpsc, Arc, - }, -}; - -use anyhow::{anyhow, bail, Context, Result}; -use glob::glob; - -use crate::test::{parse_tests, TestEntry}; - -pub enum CliInput { - Paths(Vec), - Test { - name: String, - contents: Vec, - languages: Vec>, - }, - Stdin(Vec), -} - -pub fn get_input( - paths_file: Option<&Path>, - paths: Option>, - test_number: Option, - cancellation_flag: &Arc, -) -> Result { - if let Some(paths_file) = paths_file { - return Ok(CliInput::Paths( - fs::read_to_string(paths_file) - .with_context(|| format!("Failed to read paths file {}", paths_file.display()))? - .trim() - .lines() - .map(PathBuf::from) - .collect::>(), - )); - } - - if let Some(test_number) = test_number { - let current_dir = std::env::current_dir().unwrap(); - let test_dir = current_dir.join("test").join("corpus"); - - if !test_dir.exists() { - return Err(anyhow!( - "Test corpus directory not found in current directory, see https://tree-sitter.github.io/tree-sitter/creating-parsers/5-writing-tests" - )); - } - - let test_entry = parse_tests(&test_dir)?; - let mut test_num = 0; - let Some((name, contents, languages)) = - get_test_info(&test_entry, test_number.max(1) - 1, &mut test_num) - else { - return Err(anyhow!("Failed to fetch contents of test #{test_number}")); - }; - - return Ok(CliInput::Test { - name, - contents, - languages, - }); - } - - if let Some(paths) = paths { - let mut result = Vec::new(); - - let mut incorporate_path = |path: PathBuf, positive| { - if positive { - result.push(path); - } else if let Some(index) = result.iter().position(|p| *p == path) { - result.remove(index); - } - }; - - for mut path in paths { - let mut positive = true; - if path.starts_with("!") { - positive = false; - path = path.strip_prefix("!").unwrap().to_path_buf(); - } - - if path.exists() { - incorporate_path(path, positive); - } else { - let Some(path_str) = path.to_str() else { - bail!("Invalid path: {}", path.display()); - }; - let paths = glob(path_str) - .with_context(|| format!("Invalid glob pattern {}", path.display()))?; - for path in paths { - incorporate_path(path?, positive); - } - } - } - - if result.is_empty() { - return Err(anyhow!( - "No files were found at or matched by the provided pathname/glob" - )); - } - - return Ok(CliInput::Paths(result)); - } - - let reader_flag = cancellation_flag.clone(); - let (tx, rx) = mpsc::channel(); - - // Spawn a thread to read from stdin, until ctrl-c or EOF is received - std::thread::spawn(move || { - let mut input = Vec::new(); - let stdin = std::io::stdin(); - let mut handle = stdin.lock(); - - // Read in chunks, so we can check the ctrl-c flag - loop { - if reader_flag.load(Ordering::Relaxed) == 1 { - break; - } - let mut buffer = [0; 1024]; - match handle.read(&mut buffer) { - Ok(0) | Err(_) => break, - Ok(n) => input.extend_from_slice(&buffer[..n]), - } - } - - // Signal to the main thread that we're done - tx.send(input).ok(); - }); - - loop { - // If we've received a ctrl-c signal, exit - if cancellation_flag.load(Ordering::Relaxed) == 1 { - bail!("\n"); - } - - // If we're done receiving input from stdin, return it - if let Ok(input) = rx.try_recv() { - return Ok(CliInput::Stdin(input)); - } - - std::thread::sleep(std::time::Duration::from_millis(50)); - } -} - -#[allow(clippy::type_complexity)] -pub fn get_test_info( - test_entry: &TestEntry, - target_test: u32, - test_num: &mut u32, -) -> Option<(String, Vec, Vec>)> { - match test_entry { - TestEntry::Example { - name, - input, - attributes, - .. - } => { - if *test_num == target_test { - return Some((name.clone(), input.clone(), attributes.languages.clone())); - } - *test_num += 1; - } - TestEntry::Group { children, .. } => { - for child in children { - if let Some((name, input, languages)) = get_test_info(child, target_test, test_num) - { - return Some((name, input, languages)); - } - } - } - } - - None -} - -/// Writes `contents` to a temporary file and returns the path to that file. -pub fn get_tmp_source_file(contents: &[u8]) -> Result { - let parse_path = std::env::temp_dir().join(".tree-sitter-temp"); - let mut parse_file = std::fs::File::create(&parse_path)?; - parse_file.write_all(contents)?; - - Ok(parse_path) -} diff --git a/crates/cli/src/logger.rs b/crates/cli/src/logger.rs deleted file mode 100644 index 41b11906..00000000 --- a/crates/cli/src/logger.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::io::Write; - -use anstyle::{AnsiColor, Color, Style}; -use log::{Level, LevelFilter, Log, Metadata, Record}; - -pub fn paint(color: Option>, text: &str) -> String { - let style = Style::new().fg_color(color.map(Into::into)); - format!("{style}{text}{style:#}") -} - -struct Logger; - -impl Log for Logger { - fn enabled(&self, _: &Metadata) -> bool { - true - } - - fn log(&self, record: &Record) { - match record.level() { - Level::Error => eprintln!( - "{} {}", - paint(Some(AnsiColor::Red), "Error:"), - record.args() - ), - Level::Warn => eprintln!( - "{} {}", - paint(Some(AnsiColor::Yellow), "Warning:"), - record.args() - ), - Level::Info | Level::Debug => eprintln!("{}", record.args()), - Level::Trace => eprintln!( - "[{}] {}", - record - .module_path() - .unwrap_or_default() - .trim_start_matches("rust_tree_sitter_cli::"), - record.args() - ), - } - } - - fn flush(&self) { - let mut stderr = std::io::stderr().lock(); - let _ = stderr.flush(); - } -} - -pub fn init() { - log::set_boxed_logger(Box::new(Logger {})).unwrap(); - log::set_max_level(LevelFilter::Info); -} - -pub fn enable_debug() { - log::set_max_level(LevelFilter::Debug); -} diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs deleted file mode 100644 index fbf75b8e..00000000 --- a/crates/cli/src/main.rs +++ /dev/null @@ -1,2162 +0,0 @@ -use std::{ - collections::HashSet, - env, fs, - path::{Path, PathBuf}, -}; - -use anstyle::{AnsiColor, Color, Style}; -use anyhow::{anyhow, Context, Result}; -use clap::{crate_authors, Args, Command, FromArgMatches as _, Subcommand, ValueEnum}; -use clap_complete::generate; -use dialoguer::{theme::ColorfulTheme, Confirm, FuzzySelect, Input, MultiSelect}; -use heck::ToUpperCamelCase; -use log::{error, info, warn}; -use regex::Regex; -use semver::Version as SemverVersion; -use tree_sitter::{ffi, Parser, Point}; -use tree_sitter_cli::{ - fuzz::{ - fuzz_language_corpus, FuzzOptions, EDIT_COUNT, ITERATION_COUNT, LOG_ENABLED, - LOG_GRAPH_ENABLED, START_SEED, - }, - highlight::{self, HighlightOptions}, - init::{generate_grammar_files, JsonConfigOpts, TREE_SITTER_JSON_SCHEMA}, - input::{get_input, get_tmp_source_file, CliInput}, - logger, - parse::{self, ParseDebugType, ParseFileOptions, ParseOutput, ParseTheme}, - playground, - query::{self, QueryFileOptions}, - tags::{self, TagsOptions}, - test::{self, TestOptions, TestStats, TestSummary}, - test_highlight, test_tags, util, - version::{self, BumpLevel}, - wasm, -}; -use tree_sitter_config::Config; -use tree_sitter_generate::OptLevel; -use tree_sitter_highlight::Highlighter; -use tree_sitter_loader::{self as loader, Bindings, TreeSitterJSON}; -use tree_sitter_tags::TagsContext; - -const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); -const BUILD_SHA: Option<&'static str> = option_env!("BUILD_SHA"); -const DEFAULT_GENERATE_ABI_VERSION: usize = 15; - -#[derive(Subcommand)] -#[command(about="Generates and tests parsers", author=crate_authors!("\n"), styles=get_styles())] -enum Commands { - /// Generate a default config file - InitConfig(InitConfig), - /// Initialize a grammar repository - Init(Init), - /// Generate a parser - Generate(Generate), - /// Compile a parser - Build(Build), - /// Parse files - Parse(Parse), - /// Run a parser's tests - Test(Test), - /// Display or increment the version of a grammar - Version(Version), - /// Fuzz a parser - Fuzz(Fuzz), - /// Search files using a syntax tree query - Query(Query), - /// Highlight a file - Highlight(Highlight), - /// Generate a list of tags - Tags(Tags), - /// Start local playground for a parser in the browser - Playground(Playground), - /// Print info about all known language parsers - DumpLanguages(DumpLanguages), - /// Generate shell completions - Complete(Complete), -} - -#[derive(Args)] -struct InitConfig; - -#[derive(Args)] -#[command(alias = "i")] -struct Init { - /// Update outdated files - #[arg(long, short)] - pub update: bool, - /// The path to the tree-sitter grammar directory - #[arg(long, short = 'p')] - pub grammar_path: Option, -} - -#[derive(Args)] -#[command(alias = "gen", alias = "g")] -struct Generate { - /// The path to the grammar file - #[arg(index = 1)] - pub grammar_path: Option, - /// Show debug log during generation - #[arg(long, short)] - pub log: bool, - #[arg( - long = "abi", - value_name = "VERSION", - env = "TREE_SITTER_ABI_VERSION", - help = format!(concat!( - "Select the language ABI version to generate (default {}).\n", - "Use --abi=latest to generate the newest supported version ({}).", - ), - DEFAULT_GENERATE_ABI_VERSION, - tree_sitter::LANGUAGE_VERSION, - ) - )] - pub abi_version: Option, - /// Only generate `grammar.json` and `node-types.json` - #[arg(long)] - pub no_parser: bool, - /// Deprecated: use the `build` command - #[arg(long, short = 'b')] - pub build: bool, - /// Deprecated: use the `build` command - #[arg(long, short = '0')] - pub debug_build: bool, - /// Deprecated: use the `build` command - #[arg(long, value_name = "PATH")] - pub libdir: Option, - /// The path to output the generated source files - #[arg(long, short, value_name = "DIRECTORY")] - pub output: Option, - /// Produce a report of the states for the given rule, use `-` to report every rule - #[arg(long, conflicts_with = "json", conflicts_with = "json_summary")] - pub report_states_for_rule: Option, - /// Deprecated: use --json-summary - #[arg( - long, - conflicts_with = "json_summary", - conflicts_with = "report_states_for_rule" - )] - pub json: bool, - /// Report conflicts in a JSON format - #[arg( - long, - conflicts_with = "json", - conflicts_with = "report_states_for_rule" - )] - pub json_summary: bool, - /// The name or path of the JavaScript runtime to use for generating parsers - #[cfg(not(feature = "qjs-rt"))] - #[arg( - long, - value_name = "EXECUTABLE", - env = "TREE_SITTER_JS_RUNTIME", - default_value = "node" - )] - pub js_runtime: Option, - - #[cfg(feature = "qjs-rt")] - #[arg( - long, - value_name = "EXECUTABLE", - env = "TREE_SITTER_JS_RUNTIME", - default_value = "node" - )] - /// The name or path of the JavaScript runtime to use for generating parsers, specify `native` - /// to use the native `QuickJS` runtime - pub js_runtime: Option, - - /// Disable optimizations when generating the parser. Currently, this only affects - /// the merging of compatible parse states. - #[arg(long)] - pub disable_optimizations: bool, -} - -#[derive(Args)] -#[command(alias = "b")] -struct Build { - /// Build a Wasm module instead of a dynamic library - #[arg(short, long)] - pub wasm: bool, - /// The path to output the compiled file - #[arg(short, long)] - pub output: Option, - /// The path to the grammar directory - #[arg(index = 1, num_args = 1)] - pub path: Option, - /// Make the parser reuse the same allocator as the library - #[arg(long)] - pub reuse_allocator: bool, - /// Compile a parser in debug mode - #[arg(long, short = '0')] - pub debug: bool, -} - -#[derive(Args)] -#[command(alias = "p")] -struct Parse { - /// The path to a file with paths to source file(s) - #[arg(long = "paths")] - pub paths_file: Option, - /// The source file(s) to use - #[arg(num_args=1..)] - pub paths: Option>, - /// The path to the tree-sitter grammar directory, implies --rebuild - #[arg(long, short = 'p', conflicts_with = "rebuild")] - pub grammar_path: Option, - /// The path to the parser's dynamic library - #[arg(long, short = 'l')] - pub lib_path: Option, - /// If `--lib-path` is used, the name of the language used to extract the - /// library's language function - #[arg(long)] - pub lang_name: Option, - /// Select a language by the scope instead of a file extension - #[arg(long)] - pub scope: Option, - /// Show parsing debug log - #[arg(long, short = 'd')] // TODO: Rework once clap adds `default_missing_value_t` - #[allow(clippy::option_option)] - pub debug: Option>, - /// Compile a parser in debug mode - #[arg(long, short = '0')] - pub debug_build: bool, - /// Produce the log.html file with debug graphs - #[arg(long, short = 'D')] - pub debug_graph: bool, - /// Compile parsers to Wasm instead of native dynamic libraries - #[arg(long, hide = cfg!(not(feature = "wasm")))] - pub wasm: bool, - /// Output the parse data with graphviz dot - #[arg(long = "dot")] - pub output_dot: bool, - /// Output the parse data in XML format - #[arg(long = "xml", short = 'x')] - pub output_xml: bool, - /// Output the parse data in a pretty-printed CST format - #[arg(long = "cst", short = 'c')] - pub output_cst: bool, - /// Show parsing statistic - #[arg(long, short, conflicts_with = "json", conflicts_with = "json_summary")] - pub stat: bool, - /// Interrupt the parsing process by timeout (µs) - #[arg(long)] - pub timeout: Option, - /// Measure execution time - #[arg(long, short)] - pub time: bool, - /// Suppress main output - #[arg(long, short)] - pub quiet: bool, - #[allow(clippy::doc_markdown)] - /// Apply edits in the format: \"row,col|position delcount insert_text\", can be supplied - /// multiple times - #[arg( - long, - num_args = 1.., - )] - pub edits: Option>, - /// The encoding of the input files - #[arg(long)] - pub encoding: Option, - /// Open `log.html` in the default browser, if `--debug-graph` is supplied - #[arg(long)] - pub open_log: bool, - /// Deprecated: use --json-summary - #[arg(long, conflicts_with = "json_summary", conflicts_with = "stat")] - pub json: bool, - /// Output parsing results in a JSON format - #[arg(long, short = 'j', conflicts_with = "json", conflicts_with = "stat")] - pub json_summary: bool, - /// The path to an alternative config.json file - #[arg(long)] - pub config_path: Option, - /// Parse the contents of a specific test - #[arg(long, short = 'n')] - #[clap(conflicts_with = "paths", conflicts_with = "paths_file")] - pub test_number: Option, - /// Force rebuild the parser - #[arg(short, long)] - pub rebuild: bool, - /// Omit ranges in the output - #[arg(long)] - pub no_ranges: bool, -} - -#[derive(ValueEnum, Clone)] -pub enum Encoding { - Utf8, - Utf16LE, - Utf16BE, -} - -#[derive(Args)] -#[command(alias = "t")] -struct Test { - /// Only run corpus test cases whose name matches the given regex - #[arg(long, short)] - pub include: Option, - /// Only run corpus test cases whose name does not match the given regex - #[arg(long, short)] - pub exclude: Option, - /// Only run corpus test cases from a given filename - #[arg(long)] - pub file_name: Option, - /// The path to the tree-sitter grammar directory, implies --rebuild - #[arg(long, short = 'p', conflicts_with = "rebuild")] - pub grammar_path: Option, - /// The path to the parser's dynamic library - #[arg(long, short = 'l')] - pub lib_path: Option, - /// If `--lib-path` is used, the name of the language used to extract the - /// library's language function - #[arg(long)] - pub lang_name: Option, - /// Update all syntax trees in corpus files with current parser output - #[arg(long, short)] - pub update: bool, - /// Show parsing debug log - #[arg(long, short = 'd')] - pub debug: bool, - /// Compile a parser in debug mode - #[arg(long, short = '0')] - pub debug_build: bool, - /// Produce the log.html file with debug graphs - #[arg(long, short = 'D')] - pub debug_graph: bool, - /// Compile parsers to Wasm instead of native dynamic libraries - #[arg(long, hide = cfg!(not(feature = "wasm")))] - pub wasm: bool, - /// Open `log.html` in the default browser, if `--debug-graph` is supplied - #[arg(long)] - pub open_log: bool, - /// The path to an alternative config.json file - #[arg(long)] - pub config_path: Option, - /// Force showing fields in test diffs - #[arg(long)] - pub show_fields: bool, - /// Show parsing statistics - #[arg(long)] - pub stat: Option, - /// Force rebuild the parser - #[arg(short, long)] - pub rebuild: bool, - /// Show only the pass-fail overview tree - #[arg(long)] - pub overview_only: bool, - /// Output the test summary in a JSON format - #[arg(long)] - pub json_summary: bool, -} - -#[derive(Args)] -#[command(alias = "publish")] -/// Display or increment the version of a grammar -struct Version { - /// The version to bump to - #[arg( - conflicts_with = "bump", - long_help = "\ - The version to bump to\n\ - \n\ - Examples:\n \ - tree-sitter version: display the current version\n \ - tree-sitter version : bump to specified version\n \ - tree-sitter version --bump : automatic bump" - )] - pub version: Option, - /// The path to the tree-sitter grammar directory - #[arg(long, short = 'p')] - pub grammar_path: Option, - /// Automatically bump from the current version - #[arg(long, value_enum, conflicts_with = "version")] - pub bump: Option, -} - -#[derive(Args)] -#[command(alias = "f")] -struct Fuzz { - /// List of test names to skip - #[arg(long, short)] - pub skip: Option>, - /// Subdirectory to the language - #[arg(long)] - pub subdir: Option, - /// The path to the tree-sitter grammar directory, implies --rebuild - #[arg(long, short = 'p', conflicts_with = "rebuild")] - pub grammar_path: Option, - /// The path to the parser's dynamic library - #[arg(long)] - pub lib_path: Option, - /// If `--lib-path` is used, the name of the language used to extract the - /// library's language function - #[arg(long)] - pub lang_name: Option, - /// Maximum number of edits to perform per fuzz test - #[arg(long)] - pub edits: Option, - /// Number of fuzzing iterations to run per test - #[arg(long)] - pub iterations: Option, - /// Only fuzz corpus test cases whose name matches the given regex - #[arg(long, short)] - pub include: Option, - /// Only fuzz corpus test cases whose name does not match the given regex - #[arg(long, short)] - pub exclude: Option, - /// Enable logging of graphs and input - #[arg(long)] - pub log_graphs: bool, - /// Enable parser logging - #[arg(long, short)] - pub log: bool, - /// Force rebuild the parser - #[arg(short, long)] - pub rebuild: bool, -} - -#[derive(Args)] -#[command(alias = "q")] -struct Query { - /// Path to a file with queries - #[arg(index = 1, required = true)] - query_path: PathBuf, - /// The path to the tree-sitter grammar directory, implies --rebuild - #[arg(long, short = 'p', conflicts_with = "rebuild")] - pub grammar_path: Option, - /// The path to the parser's dynamic library - #[arg(long, short = 'l')] - pub lib_path: Option, - /// If `--lib-path` is used, the name of the language used to extract the - /// library's language function - #[arg(long)] - pub lang_name: Option, - /// Measure execution time - #[arg(long, short)] - pub time: bool, - /// Suppress main output - #[arg(long, short)] - pub quiet: bool, - /// The path to a file with paths to source file(s) - #[arg(long = "paths")] - pub paths_file: Option, - /// The source file(s) to use - #[arg(index = 2, num_args=1..)] - pub paths: Option>, - /// The range of byte offsets in which the query will be executed - #[arg(long)] - pub byte_range: Option, - /// The range of rows in which the query will be executed - #[arg(long)] - pub row_range: Option, - /// The range of byte offsets in which the query will be executed. Only the matches that are fully contained within the provided - /// byte range will be returned. - #[arg(long)] - pub containing_byte_range: Option, - /// The range of rows in which the query will be executed. Only the matches that are fully contained within the provided row range - /// will be returned. - #[arg(long)] - pub containing_row_range: Option, - /// Select a language by the scope instead of a file extension - #[arg(long)] - pub scope: Option, - /// Order by captures instead of matches - #[arg(long, short)] - pub captures: bool, - /// Whether to run query tests or not - #[arg(long)] - pub test: bool, - /// The path to an alternative config.json file - #[arg(long)] - pub config_path: Option, - /// Query the contents of a specific test - #[arg(long, short = 'n')] - #[clap(conflicts_with = "paths", conflicts_with = "paths_file")] - pub test_number: Option, - /// Force rebuild the parser - #[arg(short, long)] - pub rebuild: bool, -} - -#[derive(Args)] -#[command(alias = "hi")] -struct Highlight { - /// Generate highlighting as an HTML document - #[arg(long, short = 'H')] - pub html: bool, - /// When generating HTML, use css classes rather than inline styles - #[arg(long)] - pub css_classes: bool, - /// Check that highlighting captures conform strictly to standards - #[arg(long)] - pub check: bool, - /// The path to a file with captures - #[arg(long)] - pub captures_path: Option, - /// The paths to files with queries - #[arg(long, num_args = 1..)] - pub query_paths: Option>, - /// Select a language by the scope instead of a file extension - #[arg(long)] - pub scope: Option, - /// Measure execution time - #[arg(long, short)] - pub time: bool, - /// Suppress main output - #[arg(long, short)] - pub quiet: bool, - /// The path to a file with paths to source file(s) - #[arg(long = "paths")] - pub paths_file: Option, - /// The source file(s) to use - #[arg(num_args = 1..)] - pub paths: Option>, - /// The path to the tree-sitter grammar directory, implies --rebuild - #[arg(long, short = 'p', conflicts_with = "rebuild")] - pub grammar_path: Option, - /// The path to an alternative config.json file - #[arg(long)] - pub config_path: Option, - /// Highlight the contents of a specific test - #[arg(long, short = 'n')] - #[clap(conflicts_with = "paths", conflicts_with = "paths_file")] - pub test_number: Option, - /// Force rebuild the parser - #[arg(short, long)] - pub rebuild: bool, -} - -#[derive(Args)] -struct Tags { - /// Select a language by the scope instead of a file extension - #[arg(long)] - pub scope: Option, - /// Measure execution time - #[arg(long, short)] - pub time: bool, - /// Suppress main output - #[arg(long, short)] - pub quiet: bool, - /// The path to a file with paths to source file(s) - #[arg(long = "paths")] - pub paths_file: Option, - /// The source file(s) to use - #[arg(num_args = 1..)] - pub paths: Option>, - /// The path to the tree-sitter grammar directory, implies --rebuild - #[arg(long, short = 'p', conflicts_with = "rebuild")] - pub grammar_path: Option, - /// The path to an alternative config.json file - #[arg(long)] - pub config_path: Option, - /// Generate tags from the contents of a specific test - #[arg(long, short = 'n')] - #[clap(conflicts_with = "paths", conflicts_with = "paths_file")] - pub test_number: Option, - /// Force rebuild the parser - #[arg(short, long)] - pub rebuild: bool, -} - -#[derive(Args)] -#[command(alias = "play", alias = "pg", alias = "web-ui")] -struct Playground { - /// Don't open in default browser - #[arg(long, short)] - pub quiet: bool, - /// Path to the directory containing the grammar and Wasm files - #[arg(long)] - pub grammar_path: Option, - /// Export playground files to specified directory instead of serving them - #[arg(long, short)] - pub export: Option, -} - -#[derive(Args)] -#[command(alias = "langs")] -struct DumpLanguages { - /// The path to an alternative config.json file - #[arg(long)] - pub config_path: Option, -} - -#[derive(Args)] -#[command(alias = "comp")] -struct Complete { - /// The shell to generate completions for - #[arg(long, short, value_enum)] - pub shell: Shell, -} - -#[derive(ValueEnum, Clone)] -pub enum Shell { - Bash, - Elvish, - Fish, - PowerShell, - Zsh, - Nushell, -} - -/// Complete `action` if the wasm feature is enabled, otherwise return an error -macro_rules! checked_wasm { - ($action:block) => { - #[cfg(feature = "wasm")] - { - $action - } - #[cfg(not(feature = "wasm"))] - { - Err(anyhow!("--wasm flag specified, but this build of tree-sitter-cli does not include the wasm feature"))?; - } - }; -} - -impl InitConfig { - fn run() -> Result<()> { - if let Ok(Some(config_path)) = Config::find_config_file() { - return Err(anyhow!( - "Remove your existing config file first: {}", - config_path.to_string_lossy() - )); - } - let mut config = Config::initial()?; - config.add(tree_sitter_loader::Config::initial())?; - config.add(tree_sitter_cli::highlight::ThemeConfig::default())?; - config.save()?; - info!( - "Saved initial configuration to {}", - config.location.display() - ); - Ok(()) - } -} - -impl Init { - fn run(self, current_dir: &Path) -> Result<()> { - let configure_json = !current_dir.join("tree-sitter.json").exists(); - - let (language_name, json_config_opts) = if configure_json { - let mut opts = JsonConfigOpts::default(); - - let name = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Parser name") - .validate_with(|input: &String| { - if input.chars().all(|c| c.is_ascii_lowercase() || c.is_ascii_digit() || c == '_') { - Ok(()) - } else { - Err("The name must be lowercase and contain only letters, digits, and underscores") - } - }) - .interact_text() - }; - - let camelcase_name = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("CamelCase name") - .default(name.to_upper_camel_case()) - .validate_with(|input: &String| { - if input - .chars() - .all(|c| c.is_ascii_alphabetic() || c.is_ascii_digit() || c == '_') - { - Ok(()) - } else { - Err("The name must contain only letters, digits, and underscores") - } - }) - .interact_text() - }; - - let title = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Title (human-readable name)") - .default(name.to_upper_camel_case()) - .interact_text() - }; - - let description = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Description") - .default(format!( - "{} grammar for tree-sitter", - name.to_upper_camel_case() - )) - .show_default(false) - .allow_empty(true) - .interact_text() - }; - - let repository = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Repository URL") - .allow_empty(true) - .default(format!("https://github.com/tree-sitter/tree-sitter-{name}")) - .show_default(false) - .interact_text() - }; - - let funding = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Funding URL") - .allow_empty(true) - .interact_text() - .map(|e| Some(e.trim().to_string())) - }; - - let scope = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("TextMate scope") - .default(format!("source.{name}")) - .validate_with(|input: &String| { - if input.starts_with("source.") || input.starts_with("text.") { - Ok(()) - } else { - Err("The scope must start with 'source.' or 'text.'") - } - }) - .interact_text() - }; - - let file_types = |name: &str| { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("File types (space-separated)") - .default(name.to_string()) - .interact_text() - .map(|ft| { - let mut set = HashSet::new(); - for ext in ft.split(' ') { - let ext = ext.trim(); - if !ext.is_empty() { - set.insert(ext.to_string()); - } - } - set.into_iter().collect::>() - }) - }; - - let initial_version = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Version") - .default(SemverVersion::new(0, 1, 0)) - .interact_text() - }; - - let license = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("License") - .default("MIT".to_string()) - .allow_empty(true) - .interact() - }; - - let author = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Author name") - .interact_text() - }; - - let email = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Author email") - .allow_empty(true) - .interact_text() - .map(|e| (!e.trim().is_empty()).then_some(e)) - }; - - let url = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Author URL") - .allow_empty(true) - .interact_text() - .map(|e| Some(e.trim().to_string())) - }; - - let namespace = || { - Input::::with_theme(&ColorfulTheme::default()) - .with_prompt("Package namespace") - .default("io.github.tree-sitter".to_string()) - .allow_empty(true) - .interact() - }; - - let bindings = || { - let languages = Bindings::default().languages(); - - let enabled = MultiSelect::new() - .with_prompt("Bindings") - .items_checked(&languages) - .interact()? - .into_iter() - .map(|i| languages[i].0); - - let out = Bindings::with_enabled_languages(enabled) - .expect("unexpected unsupported language"); - anyhow::Ok(out) - }; - - let choices = [ - "name", - "camelcase", - "title", - "description", - "repository", - "funding", - "scope", - "file_types", - "version", - "license", - "author", - "email", - "url", - "namespace", - "bindings", - "exit", - ]; - - macro_rules! set_choice { - ($choice:expr) => { - match $choice { - "name" => opts.name = name()?, - "camelcase" => opts.camelcase = camelcase_name(&opts.name)?, - "title" => opts.title = title(&opts.name)?, - "description" => opts.description = description(&opts.name)?, - "repository" => opts.repository = Some(repository(&opts.name)?), - "funding" => opts.funding = funding()?, - "scope" => opts.scope = scope(&opts.name)?, - "file_types" => opts.file_types = file_types(&opts.name)?, - "version" => opts.version = initial_version()?, - "license" => opts.license = license()?, - "author" => opts.author = author()?, - "email" => opts.email = email()?, - "url" => opts.url = url()?, - "namespace" => opts.namespace = Some(namespace()?), - "bindings" => opts.bindings = bindings()?, - "exit" => break, - _ => unreachable!(), - } - }; - } - - // Initial configuration - for choice in choices.iter().take(choices.len() - 1) { - set_choice!(*choice); - } - - // Loop for editing the configuration - loop { - info!( - "Your current configuration:\n{}", - serde_json::to_string_pretty(&opts)? - ); - - if Confirm::with_theme(&ColorfulTheme::default()) - .with_prompt("Does the config above look correct?") - .interact()? - { - break; - } - - let idx = FuzzySelect::with_theme(&ColorfulTheme::default()) - .with_prompt("Which field would you like to change?") - .items(&choices) - .interact()?; - - set_choice!(choices[idx]); - } - - (opts.name.clone(), Some(opts)) - } else { - let old_config = fs::read_to_string(current_dir.join("tree-sitter.json")) - .with_context(|| "Failed to read tree-sitter.json")?; - - let mut json = serde_json::from_str::(&old_config)?; - if json.schema.is_none() { - json.schema = Some(TREE_SITTER_JSON_SCHEMA.to_string()); - } - - let new_config = format!("{}\n", serde_json::to_string_pretty(&json)?); - // Write the re-serialized config back, as newly added optional boolean fields - // will be included with explicit `false`s rather than implict `null`s - if self.update && !old_config.trim().eq(new_config.trim()) { - info!("Updating tree-sitter.json"); - fs::write( - current_dir.join("tree-sitter.json"), - serde_json::to_string_pretty(&json)?, - ) - .with_context(|| "Failed to write tree-sitter.json")?; - } - - (json.grammars.swap_remove(0).name, None) - }; - - generate_grammar_files( - current_dir, - &language_name, - self.update, - json_config_opts.as_ref(), - )?; - - Ok(()) - } -} - -impl Generate { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - if self.log { - logger::enable_debug(); - } - let abi_version = - self.abi_version - .as_ref() - .map_or(DEFAULT_GENERATE_ABI_VERSION, |version| { - if version == "latest" { - tree_sitter::LANGUAGE_VERSION - } else { - version.parse().expect("invalid abi version flag") - } - }); - - let json_summary = if self.json { - warn!("--json is deprecated, use --json-summary instead"); - true - } else { - self.json_summary - }; - - if let Err(err) = tree_sitter_generate::generate_parser_in_directory( - current_dir, - self.output.as_deref(), - self.grammar_path.as_deref(), - abi_version, - self.report_states_for_rule.as_deref(), - self.js_runtime.as_deref(), - !self.no_parser, - if self.disable_optimizations { - OptLevel::empty() - } else { - OptLevel::default() - }, - ) { - if json_summary { - eprintln!("{}", serde_json::to_string_pretty(&err)?); - // Exit early to prevent errors from being printed a second time in the caller - std::process::exit(1); - } else { - // Removes extra context associated with the error - Err(anyhow!(err.to_string())).with_context(|| "Error when generating parser")?; - } - } - if self.build { - warn!("--build is deprecated, use the `build` command"); - if let Some(path) = self.libdir { - loader = loader::Loader::with_parser_lib_path(path); - } - loader.debug_build(self.debug_build); - loader.languages_at_path(current_dir)?; - } - Ok(()) - } -} - -impl Build { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - let grammar_path = current_dir.join(self.path.unwrap_or_default()); - - loader.debug_build(self.debug); - - if self.wasm { - let output_path = self.output.map(|path| current_dir.join(path)); - wasm::compile_language_to_wasm(&loader, &grammar_path, current_dir, output_path)?; - } else { - let output_path = if let Some(ref path) = self.output { - let path = Path::new(path); - let full_path = if path.is_absolute() { - path.to_path_buf() - } else { - current_dir.join(path) - }; - let parent_path = full_path - .parent() - .context("Output path must have a parent")?; - let name = full_path - .file_name() - .context("Ouput path must have a filename")?; - fs::create_dir_all(parent_path).context("Failed to create output path")?; - let mut canon_path = parent_path.canonicalize().context("Invalid output path")?; - canon_path.push(name); - canon_path - } else { - let file_name = grammar_path - .file_stem() - .unwrap() - .to_str() - .unwrap() - .strip_prefix("tree-sitter-") - .unwrap_or("parser"); - current_dir - .join(file_name) - .with_extension(env::consts::DLL_EXTENSION) - }; - - let flags: &[&str] = match (self.reuse_allocator, self.debug) { - (true, true) => &["TREE_SITTER_REUSE_ALLOCATOR", "TREE_SITTER_DEBUG"], - (true, false) => &["TREE_SITTER_REUSE_ALLOCATOR"], - (false, true) => &["TREE_SITTER_DEBUG"], - (false, false) => &[], - }; - - loader.force_rebuild(true); - - loader - .compile_parser_at_path(&grammar_path, output_path, flags) - .context("Failed to compile parser")?; - } - Ok(()) - } -} - -impl Parse { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - let config = Config::load(self.config_path)?; - let color = env::var("NO_COLOR").map_or(true, |v| v != "1"); - let json_summary = if self.json { - warn!("--json is deprecated, use --json-summary instead"); - true - } else { - self.json_summary - }; - let output = if self.output_dot { - ParseOutput::Dot - } else if self.output_xml { - ParseOutput::Xml - } else if self.output_cst { - ParseOutput::Cst - } else if self.quiet || json_summary { - ParseOutput::Quiet - } else { - ParseOutput::Normal - }; - - let parse_theme = if color { - config - .get::() - .with_context(|| "Failed to parse CST theme")? - .parse_theme - .unwrap_or_default() - .into() - } else { - ParseTheme::empty() - }; - - let encoding = self.encoding.map(|e| match e { - Encoding::Utf8 => ffi::TSInputEncodingUTF8, - Encoding::Utf16LE => ffi::TSInputEncodingUTF16LE, - Encoding::Utf16BE => ffi::TSInputEncodingUTF16BE, - }); - - let time = self.time; - let edits = self.edits.unwrap_or_default(); - let cancellation_flag = util::cancel_on_signal(); - let mut parser = Parser::new(); - - loader.debug_build(self.debug_build); - loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - - if self.wasm { - checked_wasm!({ - let engine = tree_sitter::wasmtime::Engine::default(); - parser - .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) - .unwrap(); - loader.use_wasm(&engine); - }); - } - - let timeout = self.timeout.unwrap_or_default(); - - let mut has_error = false; - let loader_config = config.get()?; - loader.find_all_languages(&loader_config)?; - - let should_track_stats = self.stat; - let mut stats = parse::ParseStats::default(); - let debug: ParseDebugType = match self.debug { - None => ParseDebugType::Quiet, - Some(None) => ParseDebugType::Normal, - Some(Some(specifier)) => specifier, - }; - - let mut options = ParseFileOptions { - edits: &edits - .iter() - .map(std::string::String::as_str) - .collect::>(), - output, - print_time: time, - timeout, - stats: &mut stats, - debug, - debug_graph: self.debug_graph, - cancellation_flag: Some(&cancellation_flag), - encoding, - open_log: self.open_log, - no_ranges: self.no_ranges, - parse_theme: &parse_theme, - }; - - let mut update_stats = |stats: &mut parse::ParseStats| { - let parse_result = stats.parse_summaries.last().unwrap(); - if should_track_stats || json_summary { - stats.cumulative_stats.total_parses += 1; - if parse_result.successful { - stats.cumulative_stats.successful_parses += 1; - } - if let (Some(duration), Some(bytes)) = (parse_result.duration, parse_result.bytes) { - stats.cumulative_stats.total_bytes += bytes; - stats.cumulative_stats.total_duration += duration; - } - } - - has_error |= !parse_result.successful; - }; - - if self.lib_path.is_none() && self.lang_name.is_some() { - warn!("--lang-name` specified without --lib-path. This argument will be ignored."); - } - let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir); - - let input = get_input( - self.paths_file.as_deref(), - self.paths, - self.test_number, - &cancellation_flag, - )?; - match input { - CliInput::Paths(paths) => { - let max_path_length = paths - .iter() - .map(|p| p.to_string_lossy().chars().count()) - .max() - .unwrap_or(0); - options.stats.source_count = paths.len(); - - for path in &paths { - let path = Path::new(&path); - let language = loader - .select_language( - Some(path), - current_dir, - self.scope.as_deref(), - lib_info.as_ref(), - ) - .with_context(|| { - anyhow!("Failed to load language for path \"{}\"", path.display()) - })?; - - parse::parse_file_at_path( - &mut parser, - &language, - path, - &path.display().to_string(), - max_path_length, - &mut options, - )?; - update_stats(options.stats); - } - } - - CliInput::Test { - name, - contents, - languages: language_names, - } => { - let path = get_tmp_source_file(&contents)?; - let languages = loader.languages_at_path(current_dir)?; - - let language = if let Some(ref lib_path) = self.lib_path { - &loader - .select_language( - None, - current_dir, - self.scope.as_deref(), - lib_info.as_ref(), - ) - .with_context(|| { - anyhow!( - "Failed to load language for path \"{}\"", - lib_path.display() - ) - })? - } else { - &languages - .iter() - .find(|(_, n)| language_names.contains(&Box::from(n.as_str()))) - .or_else(|| languages.first()) - .map(|(l, _)| l.clone()) - .ok_or_else(|| anyhow!("No language found"))? - }; - - parse::parse_file_at_path( - &mut parser, - language, - &path, - &name, - name.chars().count(), - &mut options, - )?; - update_stats(&mut stats); - fs::remove_file(path)?; - } - - CliInput::Stdin(contents) => { - // Place user input and parser output on separate lines - println!(); - - let path = get_tmp_source_file(&contents)?; - let name = "stdin"; - let language = loader.select_language( - None, - current_dir, - self.scope.as_deref(), - lib_info.as_ref(), - )?; - - parse::parse_file_at_path( - &mut parser, - &language, - &path, - name, - name.chars().count(), - &mut options, - )?; - update_stats(&mut stats); - fs::remove_file(path)?; - } - } - - if should_track_stats { - println!("\n{}", stats.cumulative_stats); - } - if json_summary { - println!("{}", serde_json::to_string_pretty(&stats)?); - } - - if has_error { - return Err(anyhow!("")); - } - - Ok(()) - } -} - -/// In case an error is encountered, prints out the contents of `test_summary` and -/// propagates the error -fn check_test( - test_result: Result<()>, - test_summary: &TestSummary, - json_summary: bool, -) -> Result<()> { - if let Err(e) = test_result { - if json_summary { - let json_summary = serde_json::to_string_pretty(test_summary) - .expect("Failed to encode summary to JSON"); - println!("{json_summary}"); - } else { - println!("{test_summary}"); - } - - Err(e)?; - } - - Ok(()) -} - -impl Test { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - let config = Config::load(self.config_path)?; - let color = env::var("NO_COLOR").map_or(true, |v| v != "1"); - let stat = self.stat.unwrap_or_default(); - - loader.debug_build(self.debug_build); - loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - - let mut parser = Parser::new(); - - if self.wasm { - checked_wasm!({ - let engine = tree_sitter::wasmtime::Engine::default(); - parser - .set_wasm_store(tree_sitter::WasmStore::new(&engine).unwrap()) - .unwrap(); - loader.use_wasm(&engine); - }); - } - - if self.lib_path.is_none() && self.lang_name.is_some() { - warn!("--lang-name` specified without --lib-path. This argument will be ignored."); - } - let languages = loader.languages_at_path(current_dir)?; - let language = if let Some(ref lib_path) = self.lib_path { - let lib_info = - get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir); - &loader - .select_language(None, current_dir, None, lib_info.as_ref()) - .with_context(|| { - anyhow!( - "Failed to load language for path \"{}\"", - lib_path.display() - ) - })? - } else { - &languages - .first() - .ok_or_else(|| anyhow!("No language found"))? - .0 - }; - parser.set_language(language)?; - - let test_dir = current_dir.join("test"); - let mut test_summary = TestSummary::new( - color, - stat, - self.update, - self.overview_only, - self.json_summary, - ); - - // Run the corpus tests. Look for them in `test/corpus`. - let test_corpus_dir = test_dir.join("corpus"); - if test_corpus_dir.is_dir() { - let opts = TestOptions { - path: test_corpus_dir, - debug: self.debug, - debug_graph: self.debug_graph, - include: self.include, - exclude: self.exclude, - file_name: self.file_name, - update: self.update, - open_log: self.open_log, - languages: languages.iter().map(|(l, n)| (n.as_str(), l)).collect(), - color, - show_fields: self.show_fields, - overview_only: self.overview_only, - }; - - check_test( - test::run_tests_at_path(&mut parser, &opts, &mut test_summary), - &test_summary, - self.json_summary, - )?; - test_summary.test_num = 1; - } - - // Check that all of the queries are valid. - let query_dir = current_dir.join("queries"); - check_test( - test::check_queries_at_path(language, &query_dir), - &test_summary, - self.json_summary, - )?; - test_summary.test_num = 1; - - // Run the syntax highlighting tests. - let test_highlight_dir = test_dir.join("highlight"); - if test_highlight_dir.is_dir() { - let mut highlighter = Highlighter::new(); - highlighter.parser = parser; - check_test( - test_highlight::test_highlights( - &loader, - &config.get()?, - &mut highlighter, - &test_highlight_dir, - &mut test_summary, - ), - &test_summary, - self.json_summary, - )?; - parser = highlighter.parser; - test_summary.test_num = 1; - } - - let test_tag_dir = test_dir.join("tags"); - if test_tag_dir.is_dir() { - let mut tags_context = TagsContext::new(); - tags_context.parser = parser; - check_test( - test_tags::test_tags( - &loader, - &config.get()?, - &mut tags_context, - &test_tag_dir, - &mut test_summary, - ), - &test_summary, - self.json_summary, - )?; - test_summary.test_num = 1; - } - - // For the rest of the queries, find their tests and run them - for entry in walkdir::WalkDir::new(&query_dir) - .into_iter() - .filter_map(|e| e.ok()) - .filter(|e| e.file_type().is_file()) - { - let stem = entry - .path() - .file_stem() - .map(|s| s.to_str().unwrap_or_default()) - .unwrap_or_default(); - if stem != "highlights" && stem != "tags" { - let entries = walkdir::WalkDir::new(test_dir.join(stem)) - .into_iter() - .filter_map(|e| { - let entry = e.ok()?; - if entry.file_type().is_file() { - Some(entry) - } else { - None - } - }) - .collect::>(); - if !entries.is_empty() { - test_summary.query_results.add_group(stem); - } - - test_summary.test_num = 1; - let opts = QueryFileOptions::default(); - for entry in &entries { - let path = entry.path(); - check_test( - query::query_file_at_path( - language, - path, - &path.display().to_string(), - path, - &opts, - Some(&mut test_summary), - ), - &test_summary, - self.json_summary, - )?; - } - if !entries.is_empty() { - test_summary.query_results.pop_traversal(); - } - } - } - test_summary.test_num = 1; - - if self.json_summary { - let json_summary = serde_json::to_string_pretty(&test_summary) - .expect("Failed to encode test summary to JSON"); - println!("{json_summary}"); - } else { - println!("{test_summary}"); - } - - Ok(()) - } -} - -impl Version { - fn run(self, current_dir: PathBuf) -> Result<()> { - Ok(version::Version::new(self.version, current_dir, self.bump).run()?) - } -} - -impl Fuzz { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - loader.sanitize_build(true); - loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - - if self.lib_path.is_none() && self.lang_name.is_some() { - warn!("--lang-name` specified without --lib-path. This argument will be ignored."); - } - let languages = loader.languages_at_path(current_dir)?; - let (language, language_name) = if let Some(ref lib_path) = self.lib_path { - let lib_info = get_lib_info(Some(lib_path), self.lang_name.as_ref(), current_dir) - .with_context(|| anyhow!("No language name found for {}", lib_path.display()))?; - let lang_name = lib_info.1.to_string(); - &( - loader - .select_language(None, current_dir, None, Some(&lib_info)) - .with_context(|| { - anyhow!( - "Failed to load language for path \"{}\"", - lib_path.display() - ) - })?, - lang_name, - ) - } else { - languages - .first() - .ok_or_else(|| anyhow!("No language found"))? - }; - - let mut fuzz_options = FuzzOptions { - skipped: self.skip, - subdir: self.subdir, - edits: self.edits.unwrap_or(*EDIT_COUNT), - iterations: self.iterations.unwrap_or(*ITERATION_COUNT), - include: self.include, - exclude: self.exclude, - log_graphs: self.log_graphs || *LOG_GRAPH_ENABLED, - log: self.log || *LOG_ENABLED, - }; - - fuzz_language_corpus( - language, - language_name, - *START_SEED, - current_dir, - &mut fuzz_options, - ); - Ok(()) - } -} - -impl Query { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - let config = Config::load(self.config_path)?; - let loader_config = config.get()?; - loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - loader.find_all_languages(&loader_config)?; - let query_path = Path::new(&self.query_path); - - let byte_range = parse_range(&self.byte_range, |x| x)?; - let point_range = parse_range(&self.row_range, |row| Point::new(row, 0))?; - let containing_byte_range = parse_range(&self.containing_byte_range, |x| x)?; - let containing_point_range = - parse_range(&self.containing_row_range, |row| Point::new(row, 0))?; - - let cancellation_flag = util::cancel_on_signal(); - - if self.lib_path.is_none() && self.lang_name.is_some() { - warn!("--lang-name specified without --lib-path. This argument will be ignored."); - } - let lib_info = get_lib_info(self.lib_path.as_ref(), self.lang_name.as_ref(), current_dir); - - let input = get_input( - self.paths_file.as_deref(), - self.paths, - self.test_number, - &cancellation_flag, - )?; - - match input { - CliInput::Paths(paths) => { - let language = loader.select_language( - Some(Path::new(&paths[0])), - current_dir, - self.scope.as_deref(), - lib_info.as_ref(), - )?; - - let opts = QueryFileOptions { - ordered_captures: self.captures, - byte_range, - point_range, - containing_byte_range, - containing_point_range, - quiet: self.quiet, - print_time: self.time, - stdin: false, - }; - for path in paths { - query::query_file_at_path( - &language, - &path, - &path.display().to_string(), - query_path, - &opts, - None, - )?; - } - } - CliInput::Test { - name, - contents, - languages: language_names, - } => { - let path = get_tmp_source_file(&contents)?; - let languages = loader.languages_at_path(current_dir)?; - let language = if let Some(ref lib_path) = self.lib_path { - &loader - .select_language(None, current_dir, None, lib_info.as_ref()) - .with_context(|| { - anyhow!( - "Failed to load language for path \"{}\"", - lib_path.display() - ) - })? - } else { - &languages - .iter() - .find(|(_, n)| language_names.contains(&Box::from(n.as_str()))) - .or_else(|| languages.first()) - .map(|(l, _)| l.clone()) - .ok_or_else(|| anyhow!("No language found"))? - }; - let opts = QueryFileOptions { - ordered_captures: self.captures, - byte_range, - point_range, - containing_byte_range, - containing_point_range, - quiet: self.quiet, - print_time: self.time, - stdin: true, - }; - query::query_file_at_path(language, &path, &name, query_path, &opts, None)?; - fs::remove_file(path)?; - } - CliInput::Stdin(contents) => { - // Place user input and query output on separate lines - println!(); - - let path = get_tmp_source_file(&contents)?; - let language = - loader.select_language(None, current_dir, None, lib_info.as_ref())?; - let opts = QueryFileOptions { - ordered_captures: self.captures, - byte_range, - point_range, - containing_byte_range, - containing_point_range, - quiet: self.quiet, - print_time: self.time, - stdin: true, - }; - query::query_file_at_path(&language, &path, "stdin", query_path, &opts, None)?; - fs::remove_file(path)?; - } - } - - Ok(()) - } -} - -impl Highlight { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - let config = Config::load(self.config_path)?; - let theme_config: tree_sitter_cli::highlight::ThemeConfig = config.get()?; - loader.configure_highlights(&theme_config.theme.highlight_names); - let loader_config = config.get()?; - loader.find_all_languages(&loader_config)?; - loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - let languages = loader.languages_at_path(current_dir)?; - - let cancellation_flag = util::cancel_on_signal(); - - let (mut language, mut language_configuration) = (None, None); - if let Some(scope) = self.scope.as_deref() { - if let Some((lang, lang_config)) = loader.language_configuration_for_scope(scope)? { - language = Some(lang); - language_configuration = Some(lang_config); - } - if language.is_none() { - return Err(anyhow!("Unknown scope '{scope}'")); - } - } - - let options = HighlightOptions { - theme: theme_config.theme, - check: self.check, - captures_path: self.captures_path, - inline_styles: !self.css_classes, - html: self.html, - quiet: self.quiet, - print_time: self.time, - cancellation_flag: cancellation_flag.clone(), - }; - - let input = get_input( - self.paths_file.as_deref(), - self.paths, - self.test_number, - &cancellation_flag, - )?; - match input { - CliInput::Paths(paths) => { - let print_name = paths.len() > 1; - for path in paths { - let (language, language_config) = - match (language.clone(), language_configuration) { - (Some(l), Some(lc)) => (l, lc), - _ => { - if let Some((lang, lang_config)) = - loader.language_configuration_for_file_name(&path)? - { - (lang, lang_config) - } else { - warn!( - "{}", - util::lang_not_found_for_path(&path, &loader_config) - ); - continue; - } - } - }; - - if let Some(highlight_config) = - language_config.highlight_config(language, self.query_paths.as_deref())? - { - highlight::highlight( - &loader, - &path, - &path.display().to_string(), - highlight_config, - print_name, - &options, - )?; - } else { - warn!( - "No syntax highlighting config found for path {}", - path.display() - ); - } - } - } - - CliInput::Test { - name, - contents, - languages: language_names, - } => { - let path = get_tmp_source_file(&contents)?; - - let language = languages - .iter() - .find(|(_, n)| language_names.contains(&Box::from(n.as_str()))) - .or_else(|| languages.first()) - .map(|(l, _)| l.clone()) - .ok_or_else(|| anyhow!("No language found in current path"))?; - let language_config = loader - .get_language_configuration_in_current_path() - .ok_or_else(|| anyhow!("No language configuration found in current path"))?; - - if let Some(highlight_config) = - language_config.highlight_config(language, self.query_paths.as_deref())? - { - highlight::highlight(&loader, &path, &name, highlight_config, false, &options)?; - } else { - warn!("No syntax highlighting config found for test {name}"); - } - fs::remove_file(path)?; - } - - CliInput::Stdin(contents) => { - // Place user input and highlight output on separate lines - println!(); - - let path = get_tmp_source_file(&contents)?; - - let (language, language_config) = - if let (Some(l), Some(lc)) = (language.clone(), language_configuration) { - (l, lc) - } else { - let language = languages - .first() - .map(|(l, _)| l.clone()) - .ok_or_else(|| anyhow!("No language found in current path"))?; - let language_configuration = loader - .get_language_configuration_in_current_path() - .ok_or_else(|| { - anyhow!("No language configuration found in current path") - })?; - (language, language_configuration) - }; - - if let Some(highlight_config) = - language_config.highlight_config(language, self.query_paths.as_deref())? - { - highlight::highlight( - &loader, - &path, - "stdin", - highlight_config, - false, - &options, - )?; - } else { - warn!( - "No syntax highlighting config found for path {}", - current_dir.display() - ); - } - fs::remove_file(path)?; - } - } - - Ok(()) - } -} - -impl Tags { - fn run(self, mut loader: loader::Loader, current_dir: &Path) -> Result<()> { - let config = Config::load(self.config_path)?; - let loader_config = config.get()?; - loader.find_all_languages(&loader_config)?; - loader.force_rebuild(self.rebuild || self.grammar_path.is_some()); - - let cancellation_flag = util::cancel_on_signal(); - - let (mut language, mut language_configuration) = (None, None); - if let Some(scope) = self.scope.as_deref() { - if let Some((lang, lang_config)) = loader.language_configuration_for_scope(scope)? { - language = Some(lang); - language_configuration = Some(lang_config); - } - if language.is_none() { - return Err(anyhow!("Unknown scope '{scope}'")); - } - } - - let options = TagsOptions { - scope: self.scope, - quiet: self.quiet, - print_time: self.time, - cancellation_flag: cancellation_flag.clone(), - }; - - let input = get_input( - self.paths_file.as_deref(), - self.paths, - self.test_number, - &cancellation_flag, - )?; - match input { - CliInput::Paths(paths) => { - let indent = paths.len() > 1; - for path in paths { - let (language, language_config) = - match (language.clone(), language_configuration) { - (Some(l), Some(lc)) => (l, lc), - _ => { - if let Some((lang, lang_config)) = - loader.language_configuration_for_file_name(&path)? - { - (lang, lang_config) - } else { - warn!( - "{}", - util::lang_not_found_for_path(&path, &loader_config) - ); - continue; - } - } - }; - - if let Some(tags_config) = language_config.tags_config(language)? { - tags::generate_tags( - &path, - &path.display().to_string(), - tags_config, - indent, - &options, - )?; - } else { - warn!("No tags config found for path {}", path.display()); - } - } - } - - CliInput::Test { - name, - contents, - languages: language_names, - } => { - let path = get_tmp_source_file(&contents)?; - - let languages = loader.languages_at_path(current_dir)?; - let language = languages - .iter() - .find(|(_, n)| language_names.contains(&Box::from(n.as_str()))) - .or_else(|| languages.first()) - .map(|(l, _)| l.clone()) - .ok_or_else(|| anyhow!("No language found in current path"))?; - let language_config = loader - .get_language_configuration_in_current_path() - .ok_or_else(|| anyhow!("No language configuration found in current path"))?; - - if let Some(tags_config) = language_config.tags_config(language)? { - tags::generate_tags(&path, &name, tags_config, false, &options)?; - } else { - warn!("No tags config found for test {name}"); - } - fs::remove_file(path)?; - } - - CliInput::Stdin(contents) => { - // Place user input and tags output on separate lines - println!(); - - let path = get_tmp_source_file(&contents)?; - - let (language, language_config) = - if let (Some(l), Some(lc)) = (language.clone(), language_configuration) { - (l, lc) - } else { - let languages = loader.languages_at_path(current_dir)?; - let language = languages - .first() - .map(|(l, _)| l.clone()) - .ok_or_else(|| anyhow!("No language found in current path"))?; - let language_configuration = loader - .get_language_configuration_in_current_path() - .ok_or_else(|| { - anyhow!("No language configuration found in current path") - })?; - (language, language_configuration) - }; - - if let Some(tags_config) = language_config.tags_config(language)? { - tags::generate_tags(&path, "stdin", tags_config, false, &options)?; - } else { - warn!("No tags config found for path {}", current_dir.display()); - } - fs::remove_file(path)?; - } - } - - Ok(()) - } -} - -impl Playground { - fn run(self, current_dir: &Path) -> Result<()> { - let grammar_path = self.grammar_path.as_deref().map_or(current_dir, Path::new); - - if let Some(export_path) = self.export { - playground::export(grammar_path, &export_path)?; - } else { - let open_in_browser = !self.quiet; - playground::serve(grammar_path, open_in_browser)?; - } - - Ok(()) - } -} - -impl DumpLanguages { - fn run(self, mut loader: loader::Loader) -> Result<()> { - let config = Config::load(self.config_path)?; - let loader_config = config.get()?; - loader.find_all_languages(&loader_config)?; - for (configuration, language_path) in loader.get_all_language_configurations() { - info!( - concat!( - "name: {}\n", - "scope: {}\n", - "parser: {:?}\n", - "highlights: {:?}\n", - "file_types: {:?}\n", - "content_regex: {:?}\n", - "injection_regex: {:?}\n", - ), - configuration.language_name, - configuration.scope.as_ref().unwrap_or(&String::new()), - language_path, - configuration.highlights_filenames, - configuration.file_types, - configuration.content_regex, - configuration.injection_regex, - ); - } - Ok(()) - } -} - -impl Complete { - fn run(self, cli: &mut Command) { - let name = cli.get_name().to_string(); - let mut stdout = std::io::stdout(); - - match self.shell { - Shell::Bash => generate(clap_complete::shells::Bash, cli, &name, &mut stdout), - Shell::Elvish => generate(clap_complete::shells::Elvish, cli, &name, &mut stdout), - Shell::Fish => generate(clap_complete::shells::Fish, cli, &name, &mut stdout), - Shell::PowerShell => { - generate(clap_complete::shells::PowerShell, cli, &name, &mut stdout); - } - Shell::Zsh => generate(clap_complete::shells::Zsh, cli, &name, &mut stdout), - Shell::Nushell => generate(clap_complete_nushell::Nushell, cli, &name, &mut stdout), - } - } -} - -fn main() { - let result = run(); - if let Err(err) = &result { - // Ignore BrokenPipe errors - if let Some(error) = err.downcast_ref::() { - if error.kind() == std::io::ErrorKind::BrokenPipe { - return; - } - } - if !err.to_string().is_empty() { - error!("{err:?}"); - } - std::process::exit(1); - } -} - -fn run() -> Result<()> { - logger::init(); - - let version = BUILD_SHA.map_or_else( - || BUILD_VERSION.to_string(), - |build_sha| format!("{BUILD_VERSION} ({build_sha})"), - ); - - let cli = Command::new("tree-sitter") - .help_template(concat!( - "\n", - "{before-help}{name} {version}\n", - "{author-with-newline}{about-with-newline}\n", - "{usage-heading} {usage}\n", - "\n", - "{all-args}{after-help}\n", - "\n" - )) - .version(version) - .subcommand_required(true) - .arg_required_else_help(true) - .disable_help_subcommand(true) - .disable_colored_help(false); - let mut cli = Commands::augment_subcommands(cli); - - let command = Commands::from_arg_matches(&cli.clone().get_matches())?; - - let current_dir = match &command { - Commands::Init(Init { grammar_path, .. }) - | Commands::Parse(Parse { grammar_path, .. }) - | Commands::Test(Test { grammar_path, .. }) - | Commands::Version(Version { grammar_path, .. }) - | Commands::Fuzz(Fuzz { grammar_path, .. }) - | Commands::Query(Query { grammar_path, .. }) - | Commands::Highlight(Highlight { grammar_path, .. }) - | Commands::Tags(Tags { grammar_path, .. }) - | Commands::Playground(Playground { grammar_path, .. }) => grammar_path, - Commands::Build(_) - | Commands::Generate(_) - | Commands::InitConfig(_) - | Commands::DumpLanguages(_) - | Commands::Complete(_) => &None, - } - .as_ref() - .map_or_else(|| env::current_dir().unwrap(), |p| p.clone()); - - let loader = loader::Loader::new()?; - - match command { - Commands::InitConfig(_) => InitConfig::run()?, - Commands::Init(init_options) => init_options.run(¤t_dir)?, - Commands::Generate(generate_options) => generate_options.run(loader, ¤t_dir)?, - Commands::Build(build_options) => build_options.run(loader, ¤t_dir)?, - Commands::Parse(parse_options) => parse_options.run(loader, ¤t_dir)?, - Commands::Test(test_options) => test_options.run(loader, ¤t_dir)?, - Commands::Version(version_options) => version_options.run(current_dir)?, - Commands::Fuzz(fuzz_options) => fuzz_options.run(loader, ¤t_dir)?, - Commands::Query(query_options) => query_options.run(loader, ¤t_dir)?, - Commands::Highlight(highlight_options) => highlight_options.run(loader, ¤t_dir)?, - Commands::Tags(tags_options) => tags_options.run(loader, ¤t_dir)?, - Commands::Playground(playground_options) => playground_options.run(¤t_dir)?, - Commands::DumpLanguages(dump_options) => dump_options.run(loader)?, - Commands::Complete(complete_options) => complete_options.run(&mut cli), - } - - Ok(()) -} - -#[must_use] -const fn get_styles() -> clap::builder::Styles { - clap::builder::Styles::styled() - .usage( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Yellow))), - ) - .header( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Yellow))), - ) - .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green)))) - .invalid( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Red))), - ) - .error( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Red))), - ) - .valid( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Green))), - ) - .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White)))) -} - -/// Utility to extract the shared library path and language function name from user-provided -/// arguments if present. -fn get_lib_info<'a>( - lib_path: Option<&'a PathBuf>, - language_name: Option<&'a String>, - current_dir: &Path, -) -> Option<(PathBuf, &'a str)> { - if let Some(lib_path) = lib_path { - let absolute_lib_path = if lib_path.is_absolute() { - lib_path.clone() - } else { - current_dir.join(lib_path) - }; - // Use the user-specified name if present, otherwise try to derive it from - // the lib path - match ( - language_name.map(|s| s.as_str()), - lib_path.file_stem().and_then(|s| s.to_str()), - ) { - (Some(name), _) | (None, Some(name)) => Some((absolute_lib_path, name)), - _ => None, - } - } else { - None - } -} - -/// Parse a range string of the form "start:end" into an optional Range. -fn parse_range( - range_str: &Option, - make: impl Fn(usize) -> T, -) -> Result>> { - if let Some(range) = range_str.as_ref() { - let err_msg = format!("Invalid range '{range}', expected 'start:end'"); - let mut parts = range.split(':'); - - let Some(part) = parts.next() else { - Err(anyhow!(err_msg))? - }; - let Ok(start) = part.parse::() else { - Err(anyhow!(err_msg))? - }; - - let Some(part) = parts.next() else { - Err(anyhow!(err_msg))? - }; - let Ok(end) = part.parse::() else { - Err(anyhow!(err_msg))? - }; - - Ok(Some(make(start)..make(end))) - } else { - Ok(None) - } -} diff --git a/crates/cli/src/parse.rs b/crates/cli/src/parse.rs deleted file mode 100644 index 3551f556..00000000 --- a/crates/cli/src/parse.rs +++ /dev/null @@ -1,1141 +0,0 @@ -use std::{ - fmt, fs, - io::{self, Write}, - ops::ControlFlow, - path::{Path, PathBuf}, - sync::atomic::{AtomicUsize, Ordering}, - time::{Duration, Instant}, -}; - -use anstyle::{AnsiColor, Color, RgbColor}; -use anyhow::{anyhow, Context, Result}; -use clap::ValueEnum; -use log::info; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use tree_sitter::{ - ffi, InputEdit, Language, LogType, ParseOptions, ParseState, Parser, Point, Range, Tree, - TreeCursor, -}; - -use crate::{fuzz::edits::Edit, logger::paint, util}; - -#[derive(Debug, Default, Serialize, JsonSchema)] -pub struct Stats { - pub successful_parses: usize, - pub total_parses: usize, - pub total_bytes: usize, - pub total_duration: Duration, -} - -impl fmt::Display for Stats { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let duration_us = self.total_duration.as_micros(); - let success_rate = if self.total_parses > 0 { - format!( - "{:.2}%", - ((self.successful_parses as f64) / (self.total_parses as f64)) * 100.0, - ) - } else { - "N/A".to_string() - }; - let duration_str = match (self.total_parses, duration_us) { - (0, _) => "N/A".to_string(), - (_, 0) => "0 bytes/ms".to_string(), - (_, _) => format!( - "{} bytes/ms", - ((self.total_bytes as u128) * 1_000) / duration_us - ), - }; - writeln!( - f, - "Total parses: {}; successful parses: {}; failed parses: {}; success percentage: {success_rate}; average speed: {duration_str}", - self.total_parses, - self.successful_parses, - self.total_parses - self.successful_parses, - ) - } -} - -/// Sets the color used in the output of `tree-sitter parse --cst` -#[derive(Debug, Copy, Clone)] -pub struct ParseTheme { - /// The color of node kinds - pub node_kind: Option, - /// The color of text associated with a node - pub node_text: Option, - /// The color of node fields - pub field: Option, - /// The color of the range information for unnamed nodes - pub row_color: Option, - /// The color of the range information for named nodes - pub row_color_named: Option, - /// The color of extra nodes - pub extra: Option, - /// The color of ERROR nodes - pub error: Option, - /// The color of MISSING nodes and their associated text - pub missing: Option, - /// The color of newline characters - pub line_feed: Option, - /// The color of backticks - pub backtick: Option, - /// The color of literals - pub literal: Option, -} - -impl ParseTheme { - const GRAY: Color = Color::Rgb(RgbColor(118, 118, 118)); - const LIGHT_GRAY: Color = Color::Rgb(RgbColor(166, 172, 181)); - const ORANGE: Color = Color::Rgb(RgbColor(255, 153, 51)); - const YELLOW: Color = Color::Rgb(RgbColor(219, 219, 173)); - const GREEN: Color = Color::Rgb(RgbColor(101, 192, 67)); - - #[must_use] - pub const fn empty() -> Self { - Self { - node_kind: None, - node_text: None, - field: None, - row_color: None, - row_color_named: None, - extra: None, - error: None, - missing: None, - line_feed: None, - backtick: None, - literal: None, - } - } -} - -impl Default for ParseTheme { - fn default() -> Self { - Self { - node_kind: Some(AnsiColor::BrightCyan.into()), - node_text: Some(Self::GRAY), - field: Some(AnsiColor::Blue.into()), - row_color: Some(AnsiColor::White.into()), - row_color_named: Some(AnsiColor::BrightCyan.into()), - extra: Some(AnsiColor::BrightMagenta.into()), - error: Some(AnsiColor::Red.into()), - missing: Some(Self::ORANGE), - line_feed: Some(Self::LIGHT_GRAY), - backtick: Some(Self::GREEN), - literal: Some(Self::YELLOW), - } - } -} - -#[derive(Debug, Copy, Clone, Deserialize, Serialize)] -pub struct Rgb(pub u8, pub u8, pub u8); - -impl From for RgbColor { - fn from(val: Rgb) -> Self { - Self(val.0, val.1, val.2) - } -} - -#[derive(Debug, Copy, Clone, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct Config { - pub parse_theme: Option, -} - -#[derive(Debug, Copy, Clone, Default, Deserialize, Serialize)] -#[serde(rename_all = "kebab-case")] -pub struct ParseThemeRaw { - pub node_kind: Option, - pub node_text: Option, - pub field: Option, - pub row_color: Option, - pub row_color_named: Option, - pub extra: Option, - pub error: Option, - pub missing: Option, - pub line_feed: Option, - pub backtick: Option, - pub literal: Option, -} - -impl From for ParseTheme { - fn from(value: ParseThemeRaw) -> Self { - let val_or_default = |val: Option, default: Option| -> Option { - val.map_or(default, |v| Some(Color::Rgb(v.into()))) - }; - let default = Self::default(); - - Self { - node_kind: val_or_default(value.node_kind, default.node_kind), - node_text: val_or_default(value.node_text, default.node_text), - field: val_or_default(value.field, default.field), - row_color: val_or_default(value.row_color, default.row_color), - row_color_named: val_or_default(value.row_color_named, default.row_color_named), - extra: val_or_default(value.extra, default.extra), - error: val_or_default(value.error, default.error), - missing: val_or_default(value.missing, default.missing), - line_feed: val_or_default(value.line_feed, default.line_feed), - backtick: val_or_default(value.backtick, default.backtick), - literal: val_or_default(value.literal, default.literal), - } - } -} - -#[derive(Copy, Clone, PartialEq, Eq)] -pub enum ParseOutput { - Normal, - Quiet, - Xml, - Cst, - Dot, -} - -/// A position in a multi-line text document, in terms of rows and columns. -/// -/// Rows and columns are zero-based. -/// -/// This serves as a serializable wrapper for `Point` -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize)] -pub struct ParsePoint { - pub row: usize, - pub column: usize, -} - -impl From for ParsePoint { - fn from(value: Point) -> Self { - Self { - row: value.row, - column: value.column, - } - } -} - -#[derive(Serialize, Default, Debug, Clone)] -pub struct ParseSummary { - pub file: PathBuf, - pub successful: bool, - pub start: Option, - pub end: Option, - pub duration: Option, - pub bytes: Option, -} - -impl ParseSummary { - #[must_use] - pub fn new(path: &Path) -> Self { - Self { - file: path.to_path_buf(), - successful: false, - ..Default::default() - } - } -} - -#[derive(Serialize, Debug)] -pub struct ParseStats { - pub parse_summaries: Vec, - pub cumulative_stats: Stats, - pub source_count: usize, -} - -impl Default for ParseStats { - fn default() -> Self { - Self { - parse_summaries: Vec::new(), - cumulative_stats: Stats::default(), - source_count: 1, - } - } -} - -#[derive(Serialize, ValueEnum, Debug, Copy, Clone, Default, Eq, PartialEq)] -pub enum ParseDebugType { - #[default] - Quiet, - Normal, - Pretty, -} - -pub struct ParseFileOptions<'a> { - pub edits: &'a [&'a str], - pub output: ParseOutput, - pub stats: &'a mut ParseStats, - pub print_time: bool, - pub timeout: u64, - pub debug: ParseDebugType, - pub debug_graph: bool, - pub cancellation_flag: Option<&'a AtomicUsize>, - pub encoding: Option, - pub open_log: bool, - pub no_ranges: bool, - pub parse_theme: &'a ParseTheme, -} - -#[derive(Copy, Clone)] -pub struct ParseResult { - pub successful: bool, - pub bytes: usize, - pub duration: Option, -} - -pub fn parse_file_at_path( - parser: &mut Parser, - language: &Language, - path: &Path, - name: &str, - max_path_length: usize, - opts: &mut ParseFileOptions, -) -> Result<()> { - let mut _log_session = None; - parser.set_language(language)?; - let mut source_code = fs::read(path).with_context(|| format!("Error reading {name:?}"))?; - - // Render an HTML graph if `--debug-graph` was passed - if opts.debug_graph { - _log_session = Some(util::log_graphs(parser, "log.html", opts.open_log)?); - } - // Log to stderr if `--debug` was passed - else if opts.debug != ParseDebugType::Quiet { - let mut curr_version: usize = 0; - let use_color = std::env::var("NO_COLOR").map_or(true, |v| v != "1"); - let debug = opts.debug; - parser.set_logger(Some(Box::new(move |log_type, message| { - if debug == ParseDebugType::Normal { - if log_type == LogType::Lex { - write!(&mut io::stderr(), " ").unwrap(); - } - writeln!(&mut io::stderr(), "{message}").unwrap(); - } else { - let colors = &[ - AnsiColor::White, - AnsiColor::Red, - AnsiColor::Blue, - AnsiColor::Green, - AnsiColor::Cyan, - AnsiColor::Yellow, - ]; - if message.starts_with("process version:") { - let comma_idx = message.find(',').unwrap(); - curr_version = message["process version:".len()..comma_idx] - .parse() - .unwrap(); - } - let color = if use_color { - Some(colors[curr_version]) - } else { - None - }; - let mut out = if log_type == LogType::Lex { - " ".to_string() - } else { - String::new() - }; - out += &paint(color, message); - writeln!(&mut io::stderr(), "{out}").unwrap(); - } - }))); - } - - let parse_time = Instant::now(); - - #[inline(always)] - fn is_utf16_le_bom(bom_bytes: &[u8]) -> bool { - bom_bytes == [0xFF, 0xFE] - } - - #[inline(always)] - fn is_utf16_be_bom(bom_bytes: &[u8]) -> bool { - bom_bytes == [0xFE, 0xFF] - } - - let encoding = match opts.encoding { - None if source_code.len() >= 2 => { - if is_utf16_le_bom(&source_code[0..2]) { - Some(ffi::TSInputEncodingUTF16LE) - } else if is_utf16_be_bom(&source_code[0..2]) { - Some(ffi::TSInputEncodingUTF16BE) - } else { - None - } - } - _ => opts.encoding, - }; - - // If the `--cancel` flag was passed, then cancel the parse - // when the user types a newline. - // - // Additionally, if the `--time` flag was passed, end the parse - // after the specified number of microseconds. - let start_time = Instant::now(); - let progress_callback = &mut |_: &ParseState| { - if let Some(cancellation_flag) = opts.cancellation_flag { - if cancellation_flag.load(Ordering::SeqCst) != 0 { - return ControlFlow::Break(()); - } - } - - if opts.timeout > 0 && start_time.elapsed().as_micros() > opts.timeout as u128 { - return ControlFlow::Break(()); - } - - ControlFlow::Continue(()) - }; - - let parse_opts = ParseOptions::new().progress_callback(progress_callback); - - let tree = match encoding { - Some(encoding) if encoding == ffi::TSInputEncodingUTF16LE => { - let source_code_utf16 = source_code - .chunks_exact(2) - .map(|chunk| u16::from_le_bytes([chunk[0], chunk[1]])) - .collect::>(); - parser.parse_utf16_le_with_options( - &mut |i, _| { - if i < source_code_utf16.len() { - &source_code_utf16[i..] - } else { - &[] - } - }, - None, - Some(parse_opts), - ) - } - Some(encoding) if encoding == ffi::TSInputEncodingUTF16BE => { - let source_code_utf16 = source_code - .chunks_exact(2) - .map(|chunk| u16::from_be_bytes([chunk[0], chunk[1]])) - .collect::>(); - parser.parse_utf16_be_with_options( - &mut |i, _| { - if i < source_code_utf16.len() { - &source_code_utf16[i..] - } else { - &[] - } - }, - None, - Some(parse_opts), - ) - } - _ => parser.parse_with_options( - &mut |i, _| { - if i < source_code.len() { - &source_code[i..] - } else { - &[] - } - }, - None, - Some(parse_opts), - ), - }; - let parse_duration = parse_time.elapsed(); - - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - - if let Some(mut tree) = tree { - if opts.debug_graph && !opts.edits.is_empty() { - info!("BEFORE:\n{}", String::from_utf8_lossy(&source_code)); - } - - let edit_time = Instant::now(); - for (i, edit) in opts.edits.iter().enumerate() { - let edit = parse_edit_flag(&source_code, edit)?; - perform_edit(&mut tree, &mut source_code, &edit)?; - tree = parser.parse(&source_code, Some(&tree)).unwrap(); - - if opts.debug_graph { - info!("AFTER {i}:\n{}", String::from_utf8_lossy(&source_code)); - } - } - let edit_duration = edit_time.elapsed(); - - parser.stop_printing_dot_graphs(); - - let parse_duration_ms = parse_duration.as_micros() as f64 / 1e3; - let edit_duration_ms = edit_duration.as_micros() as f64 / 1e3; - let mut cursor = tree.walk(); - - if opts.output == ParseOutput::Normal { - let mut needs_newline = false; - let mut indent_level = 0; - let mut did_visit_children = false; - loop { - let node = cursor.node(); - let is_named = node.is_named(); - if did_visit_children { - if is_named { - stdout.write_all(b")")?; - needs_newline = true; - } - if cursor.goto_next_sibling() { - did_visit_children = false; - } else if cursor.goto_parent() { - did_visit_children = true; - indent_level -= 1; - } else { - break; - } - } else { - if is_named { - if needs_newline { - stdout.write_all(b"\n")?; - } - for _ in 0..indent_level { - stdout.write_all(b" ")?; - } - let start = node.start_position(); - let end = node.end_position(); - if let Some(field_name) = cursor.field_name() { - write!(&mut stdout, "{field_name}: ")?; - } - write!(&mut stdout, "({}", node.kind())?; - if !opts.no_ranges { - write!( - &mut stdout, - " [{}, {}] - [{}, {}]", - start.row, start.column, end.row, end.column - )?; - } - needs_newline = true; - } - if cursor.goto_first_child() { - did_visit_children = false; - indent_level += 1; - } else { - did_visit_children = true; - } - } - } - cursor.reset(tree.root_node()); - println!(); - } - - if opts.output == ParseOutput::Cst { - render_cst(&source_code, &tree, &mut cursor, opts, &mut stdout)?; - } - - if opts.output == ParseOutput::Xml { - let mut needs_newline = false; - let mut indent_level = 2; - let mut did_visit_children = false; - let mut had_named_children = false; - let mut tags = Vec::<&str>::new(); - - // If we're parsing the first file, write the header - if opts.stats.parse_summaries.is_empty() { - writeln!(&mut stdout, "")?; - writeln!(&mut stdout, "")?; - } - writeln!(&mut stdout, " ", path.display())?; - - loop { - let node = cursor.node(); - let is_named = node.is_named(); - if did_visit_children { - if is_named { - let tag = tags.pop(); - if had_named_children { - for _ in 0..indent_level { - stdout.write_all(b" ")?; - } - } - write!(&mut stdout, "", tag.expect("there is a tag"))?; - // we only write a line in the case where it's the last sibling - if let Some(parent) = node.parent() { - if parent.child(parent.child_count() as u32 - 1).unwrap() == node { - stdout.write_all(b"\n")?; - } - } - needs_newline = true; - } - if cursor.goto_next_sibling() { - did_visit_children = false; - had_named_children = false; - } else if cursor.goto_parent() { - did_visit_children = true; - had_named_children = is_named; - indent_level -= 1; - if !is_named && needs_newline { - stdout.write_all(b"\n")?; - for _ in 0..indent_level { - stdout.write_all(b" ")?; - } - } - } else { - break; - } - } else { - if is_named { - if needs_newline { - stdout.write_all(b"\n")?; - } - for _ in 0..indent_level { - stdout.write_all(b" ")?; - } - write!(&mut stdout, "<{}", node.kind())?; - if let Some(field_name) = cursor.field_name() { - write!(&mut stdout, " field=\"{field_name}\"")?; - } - let start = node.start_position(); - let end = node.end_position(); - write!(&mut stdout, " srow=\"{}\"", start.row)?; - write!(&mut stdout, " scol=\"{}\"", start.column)?; - write!(&mut stdout, " erow=\"{}\"", end.row)?; - write!(&mut stdout, " ecol=\"{}\"", end.column)?; - write!(&mut stdout, ">")?; - tags.push(node.kind()); - needs_newline = true; - } - if cursor.goto_first_child() { - did_visit_children = false; - had_named_children = false; - indent_level += 1; - } else { - did_visit_children = true; - let start = node.start_byte(); - let end = node.end_byte(); - let value = - std::str::from_utf8(&source_code[start..end]).expect("has a string"); - if !is_named && needs_newline { - stdout.write_all(b"\n")?; - for _ in 0..indent_level { - stdout.write_all(b" ")?; - } - } - write!(&mut stdout, "{}", html_escape::encode_text(value))?; - } - } - } - writeln!(&mut stdout)?; - writeln!(&mut stdout, " ")?; - - // If we parsed the last file, write the closing tag for the `sources` header - if opts.stats.parse_summaries.len() == opts.stats.source_count - 1 { - writeln!(&mut stdout, "")?; - } - cursor.reset(tree.root_node()); - } - - if opts.output == ParseOutput::Dot { - util::print_tree_graph(&tree, "log.html", opts.open_log).unwrap(); - } - - let mut first_error = None; - let mut earliest_node_with_error = None; - 'outer: loop { - let node = cursor.node(); - if node.has_error() { - if earliest_node_with_error.is_none() { - earliest_node_with_error = Some(node); - } - if node.is_error() || node.is_missing() { - first_error = Some(node); - break; - } - - // If there's no more children, even though some outer node has an error, - // then that means that the first error is hidden, but the later error could be - // visible. So, we walk back up to the child of the first node with an error, - // and then check its siblings for errors. - if !cursor.goto_first_child() { - let earliest = earliest_node_with_error.unwrap(); - while cursor.goto_parent() { - if cursor.node().parent().is_some_and(|p| p == earliest) { - while cursor.goto_next_sibling() { - let sibling = cursor.node(); - if sibling.is_error() || sibling.is_missing() { - first_error = Some(sibling); - break 'outer; - } - if sibling.has_error() && cursor.goto_first_child() { - continue 'outer; - } - } - break; - } - } - break; - } - } else if !cursor.goto_next_sibling() { - break; - } - } - - if first_error.is_some() || opts.print_time { - let path = path.to_string_lossy(); - write!( - &mut stdout, - "{:width$}\tParse: {parse_duration_ms:>7.2} ms\t{:>6} bytes/ms", - name, - (source_code.len() as u128 * 1_000_000) / parse_duration.as_nanos(), - width = max_path_length - )?; - if let Some(node) = first_error { - let node_kind = node.kind(); - let mut node_text = String::with_capacity(node_kind.len()); - for c in node_kind.chars() { - if let Some(escaped) = escape_invisible(c) { - node_text += escaped; - } else { - node_text.push(c); - } - } - write!(&mut stdout, "\t(")?; - if node.is_missing() { - if node.is_named() { - write!(&mut stdout, "MISSING {node_text}")?; - } else { - write!(&mut stdout, "MISSING \"{node_text}\"")?; - } - } else { - write!(&mut stdout, "{node_text}")?; - } - - let start = node.start_position(); - let end = node.end_position(); - write!( - &mut stdout, - " [{}, {}] - [{}, {}])", - start.row, start.column, end.row, end.column - )?; - } - if !opts.edits.is_empty() { - write!( - &mut stdout, - "\n{:width$}\tEdit: {edit_duration_ms:>7.2} ms", - " ".repeat(path.len()), - width = max_path_length, - )?; - } - writeln!(&mut stdout)?; - } - - opts.stats.parse_summaries.push(ParseSummary { - file: path.to_path_buf(), - successful: first_error.is_none(), - start: Some(tree.root_node().start_position().into()), - end: Some(tree.root_node().end_position().into()), - duration: Some(parse_duration), - bytes: Some(source_code.len()), - }); - - return Ok(()); - } - parser.stop_printing_dot_graphs(); - - if opts.print_time { - let duration = parse_time.elapsed(); - let duration_ms = duration.as_micros() as f64 / 1e3; - writeln!( - &mut stdout, - "{:width$}\tParse: {duration_ms:>7.2} ms\t(timed out)", - path.to_str().unwrap(), - width = max_path_length - )?; - } - - opts.stats.parse_summaries.push(ParseSummary { - file: path.to_path_buf(), - successful: false, - start: None, - end: None, - duration: None, - bytes: Some(source_code.len()), - }); - - Ok(()) -} - -const fn escape_invisible(c: char) -> Option<&'static str> { - Some(match c { - '\n' => "\\n", - '\r' => "\\r", - '\t' => "\\t", - '\0' => "\\0", - '\\' => "\\\\", - '\x0b' => "\\v", - '\x0c' => "\\f", - _ => return None, - }) -} - -const fn escape_delimiter(c: char) -> Option<&'static str> { - Some(match c { - '`' => "\\`", - '\"' => "\\\"", - _ => return None, - }) -} - -pub fn render_cst<'a, 'b: 'a>( - source_code: &[u8], - tree: &'b Tree, - cursor: &mut TreeCursor<'a>, - opts: &ParseFileOptions, - out: &mut impl Write, -) -> Result<()> { - let lossy_source_code = String::from_utf8_lossy(source_code); - let total_width = lossy_source_code - .lines() - .enumerate() - .map(|(row, col)| (row as f64).log10() as usize + (col.len() as f64).log10() as usize + 1) - .max() - .unwrap_or(1); - let mut indent_level = usize::from(!opts.no_ranges); - let mut did_visit_children = false; - let mut in_error = false; - loop { - if did_visit_children { - if cursor.goto_next_sibling() { - did_visit_children = false; - } else if cursor.goto_parent() { - did_visit_children = true; - indent_level -= 1; - if !cursor.node().has_error() { - in_error = false; - } - } else { - break; - } - } else { - cst_render_node( - opts, - cursor, - source_code, - out, - total_width, - indent_level, - in_error, - )?; - if cursor.goto_first_child() { - did_visit_children = false; - indent_level += 1; - if cursor.node().has_error() { - in_error = true; - } - } else { - did_visit_children = true; - } - } - } - cursor.reset(tree.root_node()); - Ok(()) -} - -fn render_node_text(source: &str) -> String { - source - .chars() - .fold(String::with_capacity(source.len()), |mut acc, c| { - if let Some(esc) = escape_invisible(c) { - acc.push_str(esc); - } else if let Some(esc) = escape_delimiter(c) { - acc.push_str(esc); - } else { - acc.push(c); - } - acc - }) -} - -fn write_node_text( - opts: &ParseFileOptions, - out: &mut impl Write, - cursor: &TreeCursor, - is_named: bool, - source: &str, - color: Option + Copy>, - text_info: (usize, usize), -) -> Result<()> { - let (total_width, indent_level) = text_info; - let (quote, quote_color) = if is_named { - ('`', opts.parse_theme.backtick) - } else { - ('\"', color.map(|c| c.into())) - }; - - if !is_named { - write!( - out, - "{}{}{}", - paint(quote_color, &String::from(quote)), - paint(color, &render_node_text(source)), - paint(quote_color, &String::from(quote)), - )?; - } else { - let multiline = source.contains('\n'); - for (i, line) in source.split_inclusive('\n').enumerate() { - if line.is_empty() { - break; - } - let mut node_range = cursor.node().range(); - // For each line of text, adjust the row by shifting it down `i` rows, - // and adjust the column by setting it to the length of *this* line. - node_range.start_point.row += i; - node_range.end_point.row = node_range.start_point.row; - node_range.end_point.column = line.len() - + if i == 0 { - node_range.start_point.column - } else { - 0 - }; - let formatted_line = render_line_feed(line, opts); - write!( - out, - "{}{}{}{}{}{}", - if multiline { "\n" } else { " " }, - if multiline && !opts.no_ranges { - render_node_range(opts, cursor, is_named, true, total_width, node_range) - } else { - String::new() - }, - if multiline { - " ".repeat(indent_level + 1) - } else { - String::new() - }, - paint(quote_color, &String::from(quote)), - paint(color, &render_node_text(&formatted_line)), - paint(quote_color, &String::from(quote)), - )?; - } - } - - Ok(()) -} - -fn render_line_feed(source: &str, opts: &ParseFileOptions) -> String { - if cfg!(windows) { - source.replace("\r\n", &paint(opts.parse_theme.line_feed, "\r\n")) - } else { - source.replace('\n', &paint(opts.parse_theme.line_feed, "\n")) - } -} - -fn render_node_range( - opts: &ParseFileOptions, - cursor: &TreeCursor, - is_named: bool, - is_multiline: bool, - total_width: usize, - range: Range, -) -> String { - let has_field_name = cursor.field_name().is_some(); - let range_color = if is_named && !is_multiline && !has_field_name { - opts.parse_theme.row_color_named - } else { - opts.parse_theme.row_color - }; - - let remaining_width_start = (total_width - - (range.start_point.row as f64).log10() as usize - - (range.start_point.column as f64).log10() as usize) - .max(1); - let remaining_width_end = (total_width - - (range.end_point.row as f64).log10() as usize - - (range.end_point.column as f64).log10() as usize) - .max(1); - paint( - range_color, - &format!( - "{}:{}{:remaining_width_start$}- {}:{}{:remaining_width_end$}", - range.start_point.row, - range.start_point.column, - ' ', - range.end_point.row, - range.end_point.column, - ' ', - ), - ) -} - -fn cst_render_node( - opts: &ParseFileOptions, - cursor: &TreeCursor, - source_code: &[u8], - out: &mut impl Write, - total_width: usize, - indent_level: usize, - in_error: bool, -) -> Result<()> { - let node = cursor.node(); - let is_named = node.is_named(); - if !opts.no_ranges { - write!( - out, - "{}", - render_node_range(opts, cursor, is_named, false, total_width, node.range()) - )?; - } - write!( - out, - "{}{}", - " ".repeat(indent_level), - if in_error && !node.has_error() { - " " - } else { - "" - } - )?; - if is_named { - if let Some(field_name) = cursor.field_name() { - write!( - out, - "{}", - paint(opts.parse_theme.field, &format!("{field_name}: ")) - )?; - } - - if node.has_error() || node.is_error() { - write!(out, "{}", paint(opts.parse_theme.error, "•"))?; - } - - let kind_color = if node.is_error() { - opts.parse_theme.error - } else if node.is_extra() || node.parent().is_some_and(|p| p.is_extra() && !p.is_error()) { - opts.parse_theme.extra - } else { - opts.parse_theme.node_kind - }; - write!(out, "{}", paint(kind_color, node.kind()))?; - - if node.child_count() == 0 { - // Node text from a pattern or external scanner - write_node_text( - opts, - out, - cursor, - is_named, - &String::from_utf8_lossy(&source_code[node.start_byte()..node.end_byte()]), - opts.parse_theme.node_text, - (total_width, indent_level), - )?; - } - } else if node.is_missing() { - write!(out, "{}: ", paint(opts.parse_theme.missing, "MISSING"))?; - write!(out, "\"{}\"", paint(opts.parse_theme.missing, node.kind()))?; - } else { - // Terminal literals, like "fn" - write_node_text( - opts, - out, - cursor, - is_named, - node.kind(), - opts.parse_theme.literal, - (total_width, indent_level), - )?; - } - writeln!(out)?; - - Ok(()) -} - -pub fn perform_edit(tree: &mut Tree, input: &mut Vec, edit: &Edit) -> Result { - let start_byte = edit.position; - let old_end_byte = edit.position + edit.deleted_length; - let new_end_byte = edit.position + edit.inserted_text.len(); - let start_position = position_for_offset(input, start_byte)?; - let old_end_position = position_for_offset(input, old_end_byte)?; - input.splice(start_byte..old_end_byte, edit.inserted_text.iter().copied()); - let new_end_position = position_for_offset(input, new_end_byte)?; - let edit = InputEdit { - start_byte, - old_end_byte, - new_end_byte, - start_position, - old_end_position, - new_end_position, - }; - tree.edit(&edit); - Ok(edit) -} - -fn parse_edit_flag(source_code: &[u8], flag: &str) -> Result { - let error = || { - anyhow!(concat!( - "Invalid edit string '{}'. ", - "Edit strings must match the pattern ' '" - ), flag) - }; - - // Three whitespace-separated parts: - // * edit position - // * deleted length - // * inserted text - let mut parts = flag.split(' '); - let position = parts.next().ok_or_else(error)?; - let deleted_length = parts.next().ok_or_else(error)?; - let inserted_text = parts.collect::>().join(" ").into_bytes(); - - // Position can either be a byte_offset or row,column pair, separated by a comma - let position = if position == "$" { - source_code.len() - } else if position.contains(',') { - let mut parts = position.split(','); - let row = parts.next().ok_or_else(error)?; - let row = row.parse::().map_err(|_| error())?; - let column = parts.next().ok_or_else(error)?; - let column = column.parse::().map_err(|_| error())?; - offset_for_position(source_code, Point { row, column })? - } else { - position.parse::().map_err(|_| error())? - }; - - // Deleted length must be a byte count. - let deleted_length = deleted_length.parse::().map_err(|_| error())?; - - Ok(Edit { - position, - deleted_length, - inserted_text, - }) -} - -pub fn offset_for_position(input: &[u8], position: Point) -> Result { - let mut row = 0; - let mut offset = 0; - let mut iter = memchr::memchr_iter(b'\n', input); - loop { - if let Some(pos) = iter.next() { - if row < position.row { - row += 1; - offset = pos; - continue; - } - } - offset += 1; - break; - } - if position.row - row > 0 { - return Err(anyhow!("Failed to address a row: {}", position.row)); - } - if let Some(pos) = iter.next() { - if (pos - offset < position.column) || (input[offset] == b'\n' && position.column > 0) { - return Err(anyhow!("Failed to address a column: {}", position.column)); - } - } else if input.len() - offset < position.column { - return Err(anyhow!("Failed to address a column over the end")); - } - Ok(offset + position.column) -} - -pub fn position_for_offset(input: &[u8], offset: usize) -> Result { - if offset > input.len() { - return Err(anyhow!("Failed to address an offset: {offset}")); - } - let mut result = Point { row: 0, column: 0 }; - let mut last = 0; - for pos in memchr::memchr_iter(b'\n', &input[..offset]) { - result.row += 1; - last = pos; - } - result.column = if result.row > 0 { - offset - last - 1 - } else { - offset - }; - Ok(result) -} diff --git a/crates/cli/src/playground.html b/crates/cli/src/playground.html deleted file mode 100644 index 147516ac..00000000 --- a/crates/cli/src/playground.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - tree-sitter THE_LANGUAGE_NAME - - - - - - - - -

- - - - - - - - - diff --git a/crates/cli/src/query.rs b/crates/cli/src/query.rs deleted file mode 100644 index 54674115..00000000 --- a/crates/cli/src/query.rs +++ /dev/null @@ -1,174 +0,0 @@ -use std::{ - fs, - io::{self, Write}, - ops::Range, - path::Path, - time::Instant, -}; - -use anyhow::{Context, Result}; -use log::warn; -use streaming_iterator::StreamingIterator; -use tree_sitter::{Language, Parser, Point, Query, QueryCursor}; - -use crate::{ - query_testing::{self, to_utf8_point}, - test::{TestInfo, TestOutcome, TestResult, TestSummary}, -}; - -#[derive(Default)] -pub struct QueryFileOptions { - pub ordered_captures: bool, - pub byte_range: Option>, - pub point_range: Option>, - pub containing_byte_range: Option>, - pub containing_point_range: Option>, - pub quiet: bool, - pub print_time: bool, - pub stdin: bool, -} - -pub fn query_file_at_path( - language: &Language, - path: &Path, - name: &str, - query_path: &Path, - opts: &QueryFileOptions, - test_summary: Option<&mut TestSummary>, -) -> Result<()> { - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - - let query_source = fs::read_to_string(query_path) - .with_context(|| format!("Error reading query file {}", query_path.display()))?; - let query = Query::new(language, &query_source).with_context(|| "Query compilation failed")?; - - let mut query_cursor = QueryCursor::new(); - if let Some(ref range) = opts.byte_range { - query_cursor.set_byte_range(range.clone()); - } - if let Some(ref range) = opts.point_range { - query_cursor.set_point_range(range.clone()); - } - if let Some(ref range) = opts.containing_byte_range { - query_cursor.set_containing_byte_range(range.clone()); - } - if let Some(ref range) = opts.containing_point_range { - query_cursor.set_containing_point_range(range.clone()); - } - - let mut parser = Parser::new(); - parser.set_language(language)?; - - let mut results = Vec::new(); - let should_test = test_summary.is_some(); - - if !should_test && !opts.stdin { - writeln!(&mut stdout, "{name}")?; - } - - let source_code = - fs::read(path).with_context(|| format!("Error reading source file {}", path.display()))?; - let tree = parser.parse(&source_code, None).unwrap(); - - let start = Instant::now(); - if opts.ordered_captures { - let mut captures = query_cursor.captures(&query, tree.root_node(), source_code.as_slice()); - while let Some((mat, capture_index)) = captures.next() { - let capture = mat.captures[*capture_index]; - let capture_name = &query.capture_names()[capture.index as usize]; - if !opts.quiet && !should_test { - writeln!( - &mut stdout, - " pattern: {:>2}, capture: {} - {capture_name}, start: {}, end: {}, text: `{}`", - mat.pattern_index, - capture.index, - capture.node.start_position(), - capture.node.end_position(), - capture.node.utf8_text(&source_code).unwrap_or("") - )?; - } - if should_test { - results.push(query_testing::CaptureInfo { - name: (*capture_name).to_string(), - start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), - end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), - }); - } - } - } else { - let mut matches = query_cursor.matches(&query, tree.root_node(), source_code.as_slice()); - while let Some(m) = matches.next() { - if !opts.quiet && !should_test { - writeln!(&mut stdout, " pattern: {}", m.pattern_index)?; - } - for capture in m.captures { - let start = capture.node.start_position(); - let end = capture.node.end_position(); - let capture_name = &query.capture_names()[capture.index as usize]; - if !opts.quiet && !should_test { - if end.row == start.row { - writeln!( - &mut stdout, - " capture: {} - {capture_name}, start: {start}, end: {end}, text: `{}`", - capture.index, - capture.node.utf8_text(&source_code).unwrap_or("") - )?; - } else { - writeln!( - &mut stdout, - " capture: {capture_name}, start: {start}, end: {end}", - )?; - } - } - if should_test { - results.push(query_testing::CaptureInfo { - name: (*capture_name).to_string(), - start: to_utf8_point(capture.node.start_position(), source_code.as_slice()), - end: to_utf8_point(capture.node.end_position(), source_code.as_slice()), - }); - } - } - } - } - if query_cursor.did_exceed_match_limit() { - warn!("Query exceeded maximum number of in-progress captures!"); - } - if should_test { - let path_name = if opts.stdin { - "stdin" - } else { - Path::new(&path).file_name().unwrap().to_str().unwrap() - }; - // Invariant: `test_summary` will always be `Some` when `should_test` is true - let test_summary = test_summary.unwrap(); - match query_testing::assert_expected_captures(&results, path, &mut parser, language) { - Ok(assertion_count) => { - test_summary.query_results.add_case(TestResult { - name: path_name.to_string(), - info: TestInfo::AssertionTest { - outcome: TestOutcome::AssertionPassed { assertion_count }, - test_num: test_summary.test_num, - }, - }); - } - Err(e) => { - test_summary.query_results.add_case(TestResult { - name: path_name.to_string(), - info: TestInfo::AssertionTest { - outcome: TestOutcome::AssertionFailed { - error: e.to_string(), - }, - test_num: test_summary.test_num, - }, - }); - return Err(e); - } - } - } - if opts.print_time { - writeln!(&mut stdout, "{:?}", start.elapsed())?; - } - - Ok(()) -} diff --git a/crates/cli/src/tags.rs b/crates/cli/src/tags.rs deleted file mode 100644 index 2d205c04..00000000 --- a/crates/cli/src/tags.rs +++ /dev/null @@ -1,78 +0,0 @@ -use std::{ - fs, - io::{self, Write}, - path::Path, - str, - sync::{atomic::AtomicUsize, Arc}, - time::Instant, -}; - -use anyhow::Result; -use tree_sitter_tags::{TagsConfiguration, TagsContext}; - -pub struct TagsOptions { - pub scope: Option, - pub quiet: bool, - pub print_time: bool, - pub cancellation_flag: Arc, -} - -pub fn generate_tags( - path: &Path, - name: &str, - config: &TagsConfiguration, - indent: bool, - opts: &TagsOptions, -) -> Result<()> { - let mut context = TagsContext::new(); - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - - let indent_str = if indent { - if !opts.quiet { - writeln!(&mut stdout, "{name}")?; - } - "\t" - } else { - "" - }; - - let source = fs::read(path)?; - let start = Instant::now(); - for tag in context - .generate_tags(config, &source, Some(&opts.cancellation_flag))? - .0 - { - let tag = tag?; - if !opts.quiet { - write!( - &mut stdout, - "{indent_str}{:<10}\t | {:<8}\t{} {} - {} `{}`", - str::from_utf8(&source[tag.name_range]).unwrap_or(""), - &config.syntax_type_name(tag.syntax_type_id), - if tag.is_definition { "def" } else { "ref" }, - tag.span.start, - tag.span.end, - str::from_utf8(&source[tag.line_range]).unwrap_or(""), - )?; - if let Some(docs) = tag.docs { - if docs.len() > 120 { - write!(&mut stdout, "\t{:?}...", docs.get(0..120).unwrap_or(""))?; - } else { - write!(&mut stdout, "\t{:?}", &docs)?; - } - } - writeln!(&mut stdout)?; - } - } - - if opts.print_time { - writeln!( - &mut stdout, - "{indent_str}time: {}ms", - start.elapsed().as_millis(), - )?; - } - - Ok(()) -} diff --git a/crates/cli/src/templates/PARSER_NAME.pc.in b/crates/cli/src/templates/PARSER_NAME.pc.in deleted file mode 100644 index e92fc803..00000000 --- a/crates/cli/src/templates/PARSER_NAME.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ - -Name: tree-sitter-PARSER_NAME -Description: @PROJECT_DESCRIPTION@ -URL: @PROJECT_HOMEPAGE_URL@ -Version: @PROJECT_VERSION@ -Libs: -L${libdir} -ltree-sitter-PARSER_NAME -Cflags: -I${includedir} diff --git a/crates/cli/src/templates/__init__.py b/crates/cli/src/templates/__init__.py deleted file mode 100644 index 784887a7..00000000 --- a/crates/cli/src/templates/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -"""PARSER_DESCRIPTION""" - -from importlib.resources import files as _files - -from ._binding import language - - -def _get_query(name, file): - try: - query = _files(f"{__package__}") / file - globals()[name] = query.read_text() - except FileNotFoundError: - globals()[name] = None - return globals()[name] - - -def __getattr__(name): - if name == "HIGHLIGHTS_QUERY": - return _get_query("HIGHLIGHTS_QUERY", "HIGHLIGHTS_QUERY_PATH") - if name == "INJECTIONS_QUERY": - return _get_query("INJECTIONS_QUERY", "INJECTIONS_QUERY_PATH") - if name == "LOCALS_QUERY": - return _get_query("LOCALS_QUERY", "LOCALS_QUERY_PATH") - if name == "TAGS_QUERY": - return _get_query("TAGS_QUERY", "TAGS_QUERY_PATH") - - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") - - -__all__ = [ - "language", - "HIGHLIGHTS_QUERY", - "INJECTIONS_QUERY", - "LOCALS_QUERY", - "TAGS_QUERY", -] - - -def __dir__(): - return sorted(__all__ + [ - "__all__", "__builtins__", "__cached__", "__doc__", "__file__", - "__loader__", "__name__", "__package__", "__path__", "__spec__", - ]) diff --git a/crates/cli/src/templates/__init__.pyi b/crates/cli/src/templates/__init__.pyi deleted file mode 100644 index 5c88ff6c..00000000 --- a/crates/cli/src/templates/__init__.pyi +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Final -from typing_extensions import CapsuleType - -HIGHLIGHTS_QUERY: Final[str] | None -"""The syntax highlighting query for this grammar.""" - -INJECTIONS_QUERY: Final[str] | None -"""The language injection query for this grammar.""" - -LOCALS_QUERY: Final[str] | None -"""The local variable query for this grammar.""" - -TAGS_QUERY: Final[str] | None -"""The symbol tagging query for this grammar.""" - -def language() -> CapsuleType: - """The tree-sitter language function for this grammar.""" diff --git a/crates/cli/src/templates/_cargo.toml b/crates/cli/src/templates/_cargo.toml deleted file mode 100644 index 74712694..00000000 --- a/crates/cli/src/templates/_cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "tree-sitter-PARSER_NAME" -description = "PARSER_DESCRIPTION" -version = "PARSER_VERSION" -authors = ["PARSER_AUTHOR_NAME PARSER_AUTHOR_EMAIL"] -license = "PARSER_LICENSE" -readme = "README.md" -keywords = ["incremental", "parsing", "tree-sitter", "PARSER_NAME"] -categories = ["parser-implementations", "parsing", "text-editors"] -repository = "PARSER_URL" -edition = "2021" -autoexamples = false - -build = "bindings/rust/build.rs" -include = [ - "bindings/rust/*", - "grammar.js", - "queries/*", - "src/*", - "tree-sitter.json", - "/LICENSE", -] - -[lib] -path = "bindings/rust/lib.rs" - -[dependencies] -tree-sitter-language = "0.1" - -[build-dependencies] -cc = "1.2" - -[dev-dependencies] -tree-sitter = "RUST_BINDING_VERSION" diff --git a/crates/cli/src/templates/binding.java b/crates/cli/src/templates/binding.java deleted file mode 100644 index 704064a0..00000000 --- a/crates/cli/src/templates/binding.java +++ /dev/null @@ -1,65 +0,0 @@ -package PARSER_NS_CLEANED.jtreesitter.LOWER_PARSER_NAME; - -import java.lang.foreign.*; - -public final class PARSER_CLASS_NAME { - private static final ValueLayout VOID_PTR = - ValueLayout.ADDRESS.withTargetLayout(MemoryLayout.sequenceLayout(Long.MAX_VALUE, ValueLayout.JAVA_BYTE)); - private static final FunctionDescriptor FUNC_DESC = FunctionDescriptor.of(VOID_PTR); - private static final Linker LINKER = Linker.nativeLinker(); - private static final PARSER_CLASS_NAME INSTANCE = new PARSER_CLASS_NAME(); - - private final Arena arena = Arena.ofAuto(); - private volatile SymbolLookup lookup = null; - - private PARSER_CLASS_NAME() {} - - /** - * Get the tree-sitter language for this grammar. - */ - public static MemorySegment language() { - if (INSTANCE.lookup == null) - INSTANCE.lookup = INSTANCE.findLibrary(); - return language(INSTANCE.lookup); - } - - /** - * Get the tree-sitter language for this grammar. - * - * The {@linkplain Arena} used in the {@code lookup} - * must not be closed while the language is being used. - */ - public static MemorySegment language(SymbolLookup lookup) { - return call(lookup, "tree_sitter_PARSER_NAME"); - } - - private SymbolLookup findLibrary() { - try { - var library = System.mapLibraryName("tree-sitter-KEBAB_PARSER_NAME"); - return SymbolLookup.libraryLookup(library, arena); - } catch (IllegalArgumentException ex1) { - try { - System.loadLibrary("tree-sitter-KEBAB_PARSER_NAME"); - return SymbolLookup.loaderLookup(); - } catch (UnsatisfiedLinkError ex2) { - ex1.addSuppressed(ex2); - throw ex1; - } - } - } - - private static UnsatisfiedLinkError unresolved(String name) { - return new UnsatisfiedLinkError("Unresolved symbol: %s".formatted(name)); - } - - @SuppressWarnings("SameParameterValue") - private static MemorySegment call(SymbolLookup lookup, String name) throws UnsatisfiedLinkError { - var address = lookup.find(name).orElseThrow(() -> unresolved(name)); - try { - var function = LINKER.downcallHandle(address, FUNC_DESC); - return (MemorySegment) function.invokeExact(); - } catch (Throwable e) { - throw new RuntimeException("Call to %s failed".formatted(name), e); - } - } -} diff --git a/crates/cli/src/templates/binding_test.js b/crates/cli/src/templates/binding_test.js deleted file mode 100644 index 7a91a84d..00000000 --- a/crates/cli/src/templates/binding_test.js +++ /dev/null @@ -1,11 +0,0 @@ -import assert from "node:assert"; -import { test } from "node:test"; -import Parser from "tree-sitter"; - -test("can load grammar", () => { - const parser = new Parser(); - assert.doesNotReject(async () => { - const { default: language } = await import("./index.js"); - parser.setLanguage(language); - }); -}); diff --git a/crates/cli/src/templates/build.rs b/crates/cli/src/templates/build.rs deleted file mode 100644 index e3fffe4b..00000000 --- a/crates/cli/src/templates/build.rs +++ /dev/null @@ -1,56 +0,0 @@ -fn main() { - let src_dir = std::path::Path::new("src"); - - let mut c_config = cc::Build::new(); - c_config.std("c11").include(src_dir); - - #[cfg(target_env = "msvc")] - c_config.flag("-utf-8"); - - if std::env::var("TARGET").unwrap() == "wasm32-unknown-unknown" { - let Ok(wasm_headers) = std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); - }; - let Ok(wasm_src) = - std::env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(std::path::PathBuf::from) - else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); - }; - - c_config.include(&wasm_headers); - c_config.files([ - wasm_src.join("stdio.c"), - wasm_src.join("stdlib.c"), - wasm_src.join("string.c"), - ]); - } - - let parser_path = src_dir.join("parser.c"); - c_config.file(&parser_path); - println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); - - let scanner_path = src_dir.join("scanner.c"); - if scanner_path.exists() { - c_config.file(&scanner_path); - println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); - } - - c_config.compile("tree-sitter-KEBAB_PARSER_NAME"); - - println!("cargo:rustc-check-cfg=cfg(with_highlights_query)"); - if !"HIGHLIGHTS_QUERY_PATH".is_empty() && std::path::Path::new("HIGHLIGHTS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_highlights_query"); - } - println!("cargo:rustc-check-cfg=cfg(with_injections_query)"); - if !"INJECTIONS_QUERY_PATH".is_empty() && std::path::Path::new("INJECTIONS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_injections_query"); - } - println!("cargo:rustc-check-cfg=cfg(with_locals_query)"); - if !"LOCALS_QUERY_PATH".is_empty() && std::path::Path::new("LOCALS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_locals_query"); - } - println!("cargo:rustc-check-cfg=cfg(with_tags_query)"); - if !"TAGS_QUERY_PATH".is_empty() && std::path::Path::new("TAGS_QUERY_PATH").exists() { - println!("cargo:rustc-cfg=with_tags_query"); - } -} diff --git a/crates/cli/src/templates/build.zig b/crates/cli/src/templates/build.zig deleted file mode 100644 index c2428289..00000000 --- a/crates/cli/src/templates/build.zig +++ /dev/null @@ -1,93 +0,0 @@ -const std = @import("std"); - -pub fn build(b: *std.Build) !void { - const target = b.standardTargetOptions(.{}); - const optimize = b.standardOptimizeOption(.{}); - - const shared = b.option(bool, "build-shared", "Build a shared library") orelse true; - const reuse_alloc = b.option(bool, "reuse-allocator", "Reuse the library allocator") orelse false; - - const library_name = "tree-sitter-PARSER_NAME"; - - const lib: *std.Build.Step.Compile = b.addLibrary(.{ - .name = library_name, - .linkage = if (shared) .dynamic else .static, - .root_module = b.createModule(.{ - .target = target, - .optimize = optimize, - .link_libc = true, - .pic = if (shared) true else null, - }), - }); - - lib.addCSourceFile(.{ - .file = b.path("src/parser.c"), - .flags = &.{"-std=c11"}, - }); - if (fileExists(b, "src/scanner.c")) { - lib.addCSourceFile(.{ - .file = b.path("src/scanner.c"), - .flags = &.{"-std=c11"}, - }); - } - - if (reuse_alloc) { - lib.root_module.addCMacro("TREE_SITTER_REUSE_ALLOCATOR", ""); - } - if (optimize == .Debug) { - lib.root_module.addCMacro("TREE_SITTER_DEBUG", ""); - } - - lib.addIncludePath(b.path("src")); - - b.installArtifact(lib); - b.installFile("src/node-types.json", "node-types.json"); - - if (fileExists(b, "queries")) { - b.installDirectory(.{ - .source_dir = b.path("queries"), - .install_dir = .prefix, - .install_subdir = "queries", - .include_extensions = &.{"scm"}, - }); - } - - const module = b.addModule(library_name, .{ - .root_source_file = b.path("bindings/zig/root.zig"), - .target = target, - .optimize = optimize, - }); - module.linkLibrary(lib); - - const tests = b.addTest(.{ - .root_module = b.createModule(.{ - .root_source_file = b.path("bindings/zig/test.zig"), - .target = target, - .optimize = optimize, - }), - }); - tests.root_module.addImport(library_name, module); - - // HACK: fetch tree-sitter dependency only when testing this module - if (b.pkg_hash.len == 0) { - var args = try std.process.argsWithAllocator(b.allocator); - defer args.deinit(); - while (args.next()) |a| { - if (std.mem.eql(u8, a, "test")) { - const ts_dep = b.lazyDependency("tree_sitter", .{}) orelse continue; - tests.root_module.addImport("tree-sitter", ts_dep.module("tree-sitter")); - break; - } - } - } - - const run_tests = b.addRunArtifact(tests); - const test_step = b.step("test", "Run unit tests"); - test_step.dependOn(&run_tests.step); -} - -inline fn fileExists(b: *std.Build, filename: []const u8) bool { - const dir = b.build_root.handle; - dir.access(filename, .{}) catch return false; - return true; -} diff --git a/crates/cli/src/templates/build.zig.zon b/crates/cli/src/templates/build.zig.zon deleted file mode 100644 index 0d542675..00000000 --- a/crates/cli/src/templates/build.zig.zon +++ /dev/null @@ -1,21 +0,0 @@ -.{ - .name = .tree_sitter_PARSER_NAME, - .fingerprint = PARSER_FINGERPRINT, - .version = "PARSER_VERSION", - .dependencies = .{ - .tree_sitter = .{ - .url = "git+https://github.com/tree-sitter/zig-tree-sitter#b4b72c903e69998fc88e27e154a5e3cc9166551b", - .hash = "tree_sitter-0.25.0-8heIf51vAQConvVIgvm-9mVIbqh7yabZYqPXfOpS3YoG", - .lazy = true, - }, - }, - .paths = .{ - "build.zig", - "build.zig.zon", - "bindings/zig", - "src", - "queries", - "LICENSE", - "README.md", - }, -} diff --git a/crates/cli/src/templates/cmakelists.cmake b/crates/cli/src/templates/cmakelists.cmake deleted file mode 100644 index 06acbc8f..00000000 --- a/crates/cli/src/templates/cmakelists.cmake +++ /dev/null @@ -1,76 +0,0 @@ -cmake_minimum_required(VERSION 3.13) - -project(tree-sitter-KEBAB_PARSER_NAME - VERSION "PARSER_VERSION" - DESCRIPTION "PARSER_DESCRIPTION" - HOMEPAGE_URL "PARSER_URL" - LANGUAGES C) - -option(BUILD_SHARED_LIBS "Build using shared libraries" ON) -option(TREE_SITTER_REUSE_ALLOCATOR "Reuse the library allocator" OFF) - -set(TREE_SITTER_ABI_VERSION ABI_VERSION_MAX CACHE STRING "Tree-sitter ABI version") -if(NOT ${TREE_SITTER_ABI_VERSION} MATCHES "^[0-9]+$") - unset(TREE_SITTER_ABI_VERSION CACHE) - message(FATAL_ERROR "TREE_SITTER_ABI_VERSION must be an integer") -endif() - -include(GNUInstallDirs) - -find_program(TREE_SITTER_CLI tree-sitter DOC "Tree-sitter CLI") - -add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" - "${CMAKE_CURRENT_SOURCE_DIR}/src/node-types.json" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/grammar.js" - COMMAND "${TREE_SITTER_CLI}" generate grammar.js --no-parser - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generating grammar.json") - -add_custom_command(OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/parser.c" - BYPRODUCTS "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/parser.h" - "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/alloc.h" - "${CMAKE_CURRENT_SOURCE_DIR}/src/tree_sitter/array.h" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/grammar.json" - COMMAND "${TREE_SITTER_CLI}" generate src/grammar.json - --abi=${TREE_SITTER_ABI_VERSION} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generating parser.c") - -add_library(tree-sitter-KEBAB_PARSER_NAME src/parser.c) -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/scanner.c) - target_sources(tree-sitter-KEBAB_PARSER_NAME PRIVATE src/scanner.c) -endif() -target_include_directories(tree-sitter-KEBAB_PARSER_NAME - PRIVATE src - INTERFACE $ - $) - -target_compile_definitions(tree-sitter-KEBAB_PARSER_NAME PRIVATE - $<$:TREE_SITTER_REUSE_ALLOCATOR> - $<$:TREE_SITTER_DEBUG>) - -set_target_properties(tree-sitter-KEBAB_PARSER_NAME - PROPERTIES - C_STANDARD 11 - POSITION_INDEPENDENT_CODE ON - SOVERSION "${TREE_SITTER_ABI_VERSION}.${PROJECT_VERSION_MAJOR}" - DEFINE_SYMBOL "") - -configure_file(bindings/c/tree-sitter-KEBAB_PARSER_NAME.pc.in - "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-KEBAB_PARSER_NAME.pc" @ONLY) - -install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bindings/c/tree_sitter" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - FILES_MATCHING PATTERN "*.h") -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter-KEBAB_PARSER_NAME.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -install(TARGETS tree-sitter-KEBAB_PARSER_NAME - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") - -file(GLOB QUERIES queries/*.scm) -install(FILES ${QUERIES} - DESTINATION "${CMAKE_INSTALL_DATADIR}/tree-sitter/queries/KEBAB_PARSER_NAME") - -add_custom_target(ts-test "${TREE_SITTER_CLI}" test - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "tree-sitter test") diff --git a/crates/cli/src/templates/gitattributes b/crates/cli/src/templates/gitattributes deleted file mode 100644 index 027ac707..00000000 --- a/crates/cli/src/templates/gitattributes +++ /dev/null @@ -1,46 +0,0 @@ -* text=auto eol=lf - -# Generated source files -src/*.json linguist-generated -src/parser.c linguist-generated -src/tree_sitter/* linguist-generated - -# C bindings -bindings/c/** linguist-generated -CMakeLists.txt linguist-generated -Makefile linguist-generated - -# Rust bindings -bindings/rust/* linguist-generated -Cargo.toml linguist-generated -Cargo.lock linguist-generated - -# Node.js bindings -bindings/node/* linguist-generated -binding.gyp linguist-generated -package.json linguist-generated -package-lock.json linguist-generated - -# Python bindings -bindings/python/** linguist-generated -setup.py linguist-generated -pyproject.toml linguist-generated - -# Go bindings -bindings/go/* linguist-generated -go.mod linguist-generated -go.sum linguist-generated - -# Swift bindings -bindings/swift/** linguist-generated -Package.swift linguist-generated -Package.resolved linguist-generated - -# Zig bindings -bindings/zig/* linguist-generated -build.zig linguist-generated -build.zig.zon linguist-generated - -# Java bindings -pom.xml linguist-generated -bindings/java/** linguist-generated diff --git a/crates/cli/src/templates/go.mod b/crates/cli/src/templates/go.mod deleted file mode 100644 index 93436c82..00000000 --- a/crates/cli/src/templates/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module PARSER_URL_STRIPPED - -go 1.22 - -require github.com/tree-sitter/go-tree-sitter v0.24.0 diff --git a/crates/cli/src/templates/index.d.ts b/crates/cli/src/templates/index.d.ts deleted file mode 100644 index 24576d32..00000000 --- a/crates/cli/src/templates/index.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -type BaseNode = { - type: string; - named: boolean; -}; - -type ChildNode = { - multiple: boolean; - required: boolean; - types: BaseNode[]; -}; - -type NodeInfo = - | (BaseNode & { - subtypes: BaseNode[]; - }) - | (BaseNode & { - fields: { [name: string]: ChildNode }; - children: ChildNode[]; - }); - -/** - * The tree-sitter language object for this grammar. - * - * @see {@linkcode https://tree-sitter.github.io/node-tree-sitter/interfaces/Parser.Language.html Parser.Language} - * - * @example - * import Parser from "tree-sitter"; - * import CAMEL_PARSER_NAME from "tree-sitter-KEBAB_PARSER_NAME"; - * - * const parser = new Parser(); - * parser.setLanguage(CAMEL_PARSER_NAME); - */ -declare const binding: { - /** - * The inner language object. - * @private - */ - language: unknown; - - /** - * The content of the `node-types.json` file for this grammar. - * - * @see {@linkplain https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types Static Node Types} - */ - nodeTypeInfo: NodeInfo[]; - - /** The syntax highlighting query for this grammar. */ - HIGHLIGHTS_QUERY?: string; - - /** The language injection query for this grammar. */ - INJECTIONS_QUERY?: string; - - /** The local variable query for this grammar. */ - LOCALS_QUERY?: string; - - /** The symbol tagging query for this grammar. */ - TAGS_QUERY?: string; -}; - -export default binding; diff --git a/crates/cli/src/templates/index.js b/crates/cli/src/templates/index.js deleted file mode 100644 index b3edc2e3..00000000 --- a/crates/cli/src/templates/index.js +++ /dev/null @@ -1,37 +0,0 @@ -import { readFileSync } from "node:fs"; -import { fileURLToPath } from "node:url"; - -const root = fileURLToPath(new URL("../..", import.meta.url)); - -const binding = typeof process.versions.bun === "string" - // Support `bun build --compile` by being statically analyzable enough to find the .node file at build-time - ? await import(`${root}/prebuilds/${process.platform}-${process.arch}/tree-sitter-KEBAB_PARSER_NAME.node`) - : (await import("node-gyp-build")).default(root); - -try { - const nodeTypes = await import(`${root}/src/node-types.json`, { with: { type: "json" } }); - binding.nodeTypeInfo = nodeTypes.default; -} catch { } - -const queries = [ - ["HIGHLIGHTS_QUERY", `${root}/HIGHLIGHTS_QUERY_PATH`], - ["INJECTIONS_QUERY", `${root}/INJECTIONS_QUERY_PATH`], - ["LOCALS_QUERY", `${root}/LOCALS_QUERY_PATH`], - ["TAGS_QUERY", `${root}/TAGS_QUERY_PATH`], -]; - -for (const [prop, path] of queries) { - Object.defineProperty(binding, prop, { - configurable: true, - enumerable: true, - get() { - delete binding[prop]; - try { - binding[prop] = readFileSync(path, "utf8"); - } catch { } - return binding[prop]; - } - }); -} - -export default binding; diff --git a/crates/cli/src/templates/lib.rs b/crates/cli/src/templates/lib.rs deleted file mode 100644 index 1e8c9ca3..00000000 --- a/crates/cli/src/templates/lib.rs +++ /dev/null @@ -1,60 +0,0 @@ -//! This crate provides TITLE_PARSER_NAME language support for the [tree-sitter] parsing library. -//! -//! Typically, you will use the [`LANGUAGE`] constant to add this language to a -//! tree-sitter [`Parser`], and then use the parser to parse some code: -//! -//! ``` -//! let code = r#" -//! "#; -//! let mut parser = tree_sitter::Parser::new(); -//! let language = tree_sitter_PARSER_NAME::LANGUAGE; -//! parser -//! .set_language(&language.into()) -//! .expect("Error loading TITLE_PARSER_NAME parser"); -//! let tree = parser.parse(code, None).unwrap(); -//! assert!(!tree.root_node().has_error()); -//! ``` -//! -//! [`Parser`]: https://docs.rs/tree-sitter/RUST_BINDING_VERSION/tree_sitter/struct.Parser.html -//! [tree-sitter]: https://tree-sitter.github.io/ - -use tree_sitter_language::LanguageFn; - -extern "C" { - fn tree_sitter_PARSER_NAME() -> *const (); -} - -/// The tree-sitter [`LanguageFn`] for this grammar. -pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_PARSER_NAME) }; - -/// The content of the [`node-types.json`] file for this grammar. -/// -/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types -pub const NODE_TYPES: &str = include_str!("../../src/node-types.json"); - -#[cfg(with_highlights_query)] -/// The syntax highlighting query for this grammar. -pub const HIGHLIGHTS_QUERY: &str = include_str!("../../HIGHLIGHTS_QUERY_PATH"); - -#[cfg(with_injections_query)] -/// The language injection query for this grammar. -pub const INJECTIONS_QUERY: &str = include_str!("../../INJECTIONS_QUERY_PATH"); - -#[cfg(with_locals_query)] -/// The local variable query for this grammar. -pub const LOCALS_QUERY: &str = include_str!("../../LOCALS_QUERY_PATH"); - -#[cfg(with_tags_query)] -/// The symbol tagging query for this grammar. -pub const TAGS_QUERY: &str = include_str!("../../TAGS_QUERY_PATH"); - -#[cfg(test)] -mod tests { - #[test] - fn test_can_load_grammar() { - let mut parser = tree_sitter::Parser::new(); - parser - .set_language(&super::LANGUAGE.into()) - .expect("Error loading TITLE_PARSER_NAME parser"); - } -} diff --git a/crates/cli/src/templates/makefile b/crates/cli/src/templates/makefile deleted file mode 100644 index b42dab97..00000000 --- a/crates/cli/src/templates/makefile +++ /dev/null @@ -1,115 +0,0 @@ -LANGUAGE_NAME := tree-sitter-KEBAB_PARSER_NAME -HOMEPAGE_URL := PARSER_URL -VERSION := PARSER_VERSION - -# repository -SRC_DIR := src - -TS ?= tree-sitter - -# install directory layout -PREFIX ?= /usr/local -DATADIR ?= $(PREFIX)/share -INCLUDEDIR ?= $(PREFIX)/include -LIBDIR ?= $(PREFIX)/lib -BINDIR ?= $(PREFIX)/bin -PCLIBDIR ?= $(LIBDIR)/pkgconfig - -# source/object files -PARSER := $(SRC_DIR)/parser.c -EXTRAS := $(filter-out $(PARSER),$(wildcard $(SRC_DIR)/*.c)) -OBJS := $(patsubst %.c,%.o,$(PARSER) $(EXTRAS)) - -# flags -ARFLAGS ?= rcs -override CFLAGS += -I$(SRC_DIR) -std=c11 -fPIC - -# ABI versioning -SONAME_MAJOR = $(shell sed -n 's/\#define LANGUAGE_VERSION //p' $(PARSER)) -SONAME_MINOR = $(word 1,$(subst ., ,$(VERSION))) - -# OS-specific bits -MACHINE := $(shell $(CC) -dumpmachine) - -ifneq ($(findstring darwin,$(MACHINE)),) - SOEXT = dylib - SOEXTVER_MAJOR = $(SONAME_MAJOR).$(SOEXT) - SOEXTVER = $(SONAME_MAJOR).$(SONAME_MINOR).$(SOEXT) - LINKSHARED = -dynamiclib -Wl,-install_name,$(LIBDIR)/lib$(LANGUAGE_NAME).$(SOEXTVER),-rpath,@executable_path/../Frameworks -else ifneq ($(findstring mingw32,$(MACHINE)),) - SOEXT = dll - LINKSHARED += -s -shared -Wl,--out-implib,lib$(LANGUAGE_NAME).dll.a -else - SOEXT = so - SOEXTVER_MAJOR = $(SOEXT).$(SONAME_MAJOR) - SOEXTVER = $(SOEXT).$(SONAME_MAJOR).$(SONAME_MINOR) - LINKSHARED = -shared -Wl,-soname,lib$(LANGUAGE_NAME).$(SOEXTVER) -ifneq ($(filter $(shell uname),FreeBSD NetBSD DragonFly),) - PCLIBDIR := $(PREFIX)/libdata/pkgconfig -endif -endif - -all: lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) $(LANGUAGE_NAME).pc - -lib$(LANGUAGE_NAME).a: $(OBJS) - $(AR) $(ARFLAGS) $@ $^ - -lib$(LANGUAGE_NAME).$(SOEXT): $(OBJS) - $(CC) $(LDFLAGS) $(LINKSHARED) $^ $(LDLIBS) -o $@ -ifneq ($(STRIP),) - $(STRIP) $@ -endif - -ifneq ($(findstring mingw32,$(MACHINE)),) -lib$(LANGUAGE_NAME).dll.a: lib$(LANGUAGE_NAME).$(SOEXT) -endif - -$(LANGUAGE_NAME).pc: bindings/c/$(LANGUAGE_NAME).pc.in - sed -e 's|@PROJECT_VERSION@|$(VERSION)|' \ - -e 's|@CMAKE_INSTALL_LIBDIR@|$(LIBDIR:$(PREFIX)/%=%)|' \ - -e 's|@CMAKE_INSTALL_INCLUDEDIR@|$(INCLUDEDIR:$(PREFIX)/%=%)|' \ - -e 's|@PROJECT_DESCRIPTION@|$(DESCRIPTION)|' \ - -e 's|@PROJECT_HOMEPAGE_URL@|$(HOMEPAGE_URL)|' \ - -e 's|@CMAKE_INSTALL_PREFIX@|$(PREFIX)|' $< > $@ - -$(SRC_DIR)/grammar.json: grammar.js - $(TS) generate --no-parser $^ - -$(PARSER): $(SRC_DIR)/grammar.json - $(TS) generate $^ - -install: all - install -d '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/KEBAB_PARSER_NAME '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter '$(DESTDIR)$(PCLIBDIR)' '$(DESTDIR)$(LIBDIR)' - install -m644 bindings/c/tree_sitter/$(LANGUAGE_NAME).h '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h - install -m644 $(LANGUAGE_NAME).pc '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc - install -m644 lib$(LANGUAGE_NAME).a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a - install -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) -ifneq ($(findstring mingw32,$(MACHINE)),) - install -d '$(DESTDIR)$(BINDIR)' - install -m755 lib$(LANGUAGE_NAME).dll '$(DESTDIR)$(BINDIR)'/lib$(LANGUAGE_NAME).dll - install -m755 lib$(LANGUAGE_NAME).dll.a '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).dll.a -else - install -m755 lib$(LANGUAGE_NAME).$(SOEXT) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) - cd '$(DESTDIR)$(LIBDIR)' && ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER) lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) - cd '$(DESTDIR)$(LIBDIR)' && ln -sf lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) lib$(LANGUAGE_NAME).$(SOEXT) -endif -ifneq ($(wildcard queries/*.scm),) - install -m644 queries/*.scm '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/KEBAB_PARSER_NAME -endif - -uninstall: - $(RM) '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).a \ - '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER) \ - '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXTVER_MAJOR) \ - '$(DESTDIR)$(LIBDIR)'/lib$(LANGUAGE_NAME).$(SOEXT) \ - '$(DESTDIR)$(INCLUDEDIR)'/tree_sitter/$(LANGUAGE_NAME).h \ - '$(DESTDIR)$(PCLIBDIR)'/$(LANGUAGE_NAME).pc - $(RM) -r '$(DESTDIR)$(DATADIR)'/tree-sitter/queries/KEBAB_PARSER_NAME - -clean: - $(RM) $(OBJS) $(LANGUAGE_NAME).pc lib$(LANGUAGE_NAME).a lib$(LANGUAGE_NAME).$(SOEXT) lib$(LANGUAGE_NAME).dll.a - -test: - $(TS) test - -.PHONY: all install uninstall clean test diff --git a/crates/cli/src/templates/package.swift b/crates/cli/src/templates/package.swift deleted file mode 100644 index f5562891..00000000 --- a/crates/cli/src/templates/package.swift +++ /dev/null @@ -1,41 +0,0 @@ -// swift-tools-version:5.3 - -import Foundation -import PackageDescription - -var sources = ["src/parser.c"] -if FileManager.default.fileExists(atPath: "src/scanner.c") { - sources.append("src/scanner.c") -} - -let package = Package( - name: "PARSER_CLASS_NAME", - products: [ - .library(name: "PARSER_CLASS_NAME", targets: ["PARSER_CLASS_NAME"]), - ], - dependencies: [ - .package(name: "SwiftTreeSitter", url: "https://github.com/tree-sitter/swift-tree-sitter", from: "0.9.0"), - ], - targets: [ - .target( - name: "PARSER_CLASS_NAME", - dependencies: [], - path: ".", - sources: sources, - resources: [ - .copy("queries") - ], - publicHeadersPath: "bindings/swift", - cSettings: [.headerSearchPath("src")] - ), - .testTarget( - name: "PARSER_CLASS_NAMETests", - dependencies: [ - "SwiftTreeSitter", - "PARSER_CLASS_NAME", - ], - path: "bindings/swift/PARSER_CLASS_NAMETests" - ) - ], - cLanguageStandard: .c11 -) diff --git a/crates/cli/src/templates/pom.xml b/crates/cli/src/templates/pom.xml deleted file mode 100644 index 661fe42b..00000000 --- a/crates/cli/src/templates/pom.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - 4.0.0 - PARSER_NS - jtreesitter-KEBAB_PARSER_NAME - JTreeSitter CAMEL_PARSER_NAME - PARSER_VERSION - PARSER_DESCRIPTION - PARSER_URL - - - PARSER_LICENSE - https://spdx.org/licenses/PARSER_LICENSE.html - - - - - PARSER_AUTHOR_NAME - PARSER_AUTHOR_EMAIL - PARSER_AUTHOR_URL - - - - PARSER_URL - scm:git:git://PARSER_URL_STRIPPED.git - scm:git:ssh://PARSER_URL_STRIPPED.git - - - 23 - UTF-8 - true - true - false - true - - - - io.github.tree-sitter - jtreesitter - 0.26.0 - true - - - org.junit.jupiter - junit-jupiter-api - 6.0.1 - test - - - - bindings/java/main - bindings/java/test - - - maven-surefire-plugin - 3.5.4 - - - ${project.build.directory}/reports/surefire - - --enable-native-access=ALL-UNNAMED - - - - maven-javadoc-plugin - 3.12.0 - - - - jar - - - - - public - true - true - all,-missing - - - - maven-source-plugin - 3.3.1 - - - - jar-no-fork - - - - - - maven-gpg-plugin - 3.2.8 - - - verify - - sign - - - true - - --no-tty - --pinentry-mode - loopback - - - - - - - io.github.mavenplugins - central-publishing-maven-plugin - 1.1.1 - - - deploy - - publish - - - validated - ${publish.auto} - ${publish.skip} - ${project.artifactId}-${project.version}.zip - ${project.artifactId}-${project.version}.zip - - - - true - - - - - - ci - - - env.CI - true - - - - false - true - false - - - - diff --git a/crates/cli/src/templates/root.zig b/crates/cli/src/templates/root.zig deleted file mode 100644 index 0e8f24bd..00000000 --- a/crates/cli/src/templates/root.zig +++ /dev/null @@ -1,5 +0,0 @@ -extern fn tree_sitter_PARSER_NAME() callconv(.c) *const anyopaque; - -pub fn language() *const anyopaque { - return tree_sitter_PARSER_NAME(); -} diff --git a/crates/cli/src/templates/setup.py b/crates/cli/src/templates/setup.py deleted file mode 100644 index bcf184b7..00000000 --- a/crates/cli/src/templates/setup.py +++ /dev/null @@ -1,77 +0,0 @@ -from os import path -from sysconfig import get_config_var - -from setuptools import Extension, find_packages, setup -from setuptools.command.build import build -from setuptools.command.build_ext import build_ext -from setuptools.command.egg_info import egg_info -from wheel.bdist_wheel import bdist_wheel - - -class Build(build): - def run(self): - if path.isdir("queries"): - dest = path.join(self.build_lib, "tree_sitter_PARSER_NAME", "queries") - self.copy_tree("queries", dest) - super().run() - - -class BuildExt(build_ext): - def build_extension(self, ext: Extension): - if self.compiler.compiler_type != "msvc": - ext.extra_compile_args = ["-std=c11", "-fvisibility=hidden"] - else: - ext.extra_compile_args = ["/std:c11", "/utf-8"] - if path.exists("src/scanner.c"): - ext.sources.append("src/scanner.c") - if ext.py_limited_api: - ext.define_macros.append(("Py_LIMITED_API", "0x030A0000")) - super().build_extension(ext) - - -class BdistWheel(bdist_wheel): - def get_tag(self): - python, abi, platform = super().get_tag() - if python.startswith("cp") and not get_config_var("Py_GIL_DISABLED"): - python, abi = "cp310", "abi3" - return python, abi, platform - - -class EggInfo(egg_info): - def find_sources(self): - super().find_sources() - self.filelist.recursive_include("queries", "*.scm") - self.filelist.include("src/tree_sitter/*.h") - - -setup( - packages=find_packages("bindings/python"), - package_dir={"": "bindings/python"}, - package_data={ - "tree_sitter_LOWER_PARSER_NAME": ["*.pyi", "py.typed"], - "tree_sitter_LOWER_PARSER_NAME.queries": ["*.scm"], - }, - ext_package="tree_sitter_LOWER_PARSER_NAME", - ext_modules=[ - Extension( - name="_binding", - sources=[ - "bindings/python/tree_sitter_LOWER_PARSER_NAME/binding.c", - "src/parser.c", - ], - define_macros=[ - ("PY_SSIZE_T_CLEAN", None), - ("TREE_SITTER_HIDE_SYMBOLS", None), - ], - include_dirs=["src"], - py_limited_api=not get_config_var("Py_GIL_DISABLED"), - ) - ], - cmdclass={ - "build": Build, - "build_ext": BuildExt, - "bdist_wheel": BdistWheel, - "egg_info": EggInfo, - }, - zip_safe=False -) diff --git a/crates/cli/src/templates/test.java b/crates/cli/src/templates/test.java deleted file mode 100644 index 8bf81ea0..00000000 --- a/crates/cli/src/templates/test.java +++ /dev/null @@ -1,12 +0,0 @@ -import io.github.treesitter.jtreesitter.Language; -import PARSER_NS_CLEANED.jtreesitter.LOWER_PARSER_NAME.PARSER_CLASS_NAME; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -public class PARSER_CLASS_NAMETest { - @Test - public void testCanLoadLanguage() { - assertDoesNotThrow(() -> new Language(PARSER_CLASS_NAME.language())); - } -} diff --git a/crates/cli/src/templates/test.zig b/crates/cli/src/templates/test.zig deleted file mode 100644 index af84322f..00000000 --- a/crates/cli/src/templates/test.zig +++ /dev/null @@ -1,17 +0,0 @@ -const testing = @import("std").testing; - -const ts = @import("tree-sitter"); -const root = @import("tree-sitter-PARSER_NAME"); -const Language = ts.Language; -const Parser = ts.Parser; - -test "can load grammar" { - const parser = Parser.create(); - defer parser.destroy(); - - const lang: *const ts.Language = Language.fromRaw(root.language()); - defer lang.destroy(); - - try testing.expectEqual(void{}, parser.setLanguage(lang)); - try testing.expectEqual(lang, parser.getLanguage()); -} diff --git a/crates/cli/src/templates/test_binding.py b/crates/cli/src/templates/test_binding.py deleted file mode 100644 index a832c368..00000000 --- a/crates/cli/src/templates/test_binding.py +++ /dev/null @@ -1,12 +0,0 @@ -from unittest import TestCase - -from tree_sitter import Language, Parser -import tree_sitter_LOWER_PARSER_NAME - - -class TestLanguage(TestCase): - def test_can_load_grammar(self): - try: - Parser(Language(tree_sitter_LOWER_PARSER_NAME.language())) - except Exception: - self.fail("Error loading TITLE_PARSER_NAME grammar") diff --git a/crates/cli/src/test.rs b/crates/cli/src/test.rs deleted file mode 100644 index b568e4a3..00000000 --- a/crates/cli/src/test.rs +++ /dev/null @@ -1,2427 +0,0 @@ -use std::{ - collections::BTreeMap, - ffi::OsStr, - fmt::Display as _, - fs, - io::{self, Write}, - path::{Path, PathBuf}, - str, - sync::LazyLock, - time::Duration, -}; - -use anstyle::AnsiColor; -use anyhow::{anyhow, Context, Result}; -use clap::ValueEnum; -use indoc::indoc; -use regex::{ - bytes::{Regex as ByteRegex, RegexBuilder as ByteRegexBuilder}, - Regex, -}; -use schemars::{JsonSchema, Schema, SchemaGenerator}; -use serde::Serialize; -use similar::{ChangeTag, TextDiff}; -use tree_sitter::{format_sexp, Language, LogType, Parser, Query, Tree}; -use walkdir::WalkDir; - -use super::util; -use crate::{ - logger::paint, - parse::{ - render_cst, ParseDebugType, ParseFileOptions, ParseOutput, ParseStats, ParseTheme, Stats, - }, -}; - -static HEADER_REGEX: LazyLock = LazyLock::new(|| { - ByteRegexBuilder::new( - r"^(?x) - (?P(?:=+){3,}) - (?P[^=\r\n][^\r\n]*)? - \r?\n - (?P(?:([^=\r\n]|\s+:)[^\r\n]*\r?\n)+) - ===+ - (?P[^=\r\n][^\r\n]*)?\r?\n", - ) - .multi_line(true) - .build() - .unwrap() -}); - -static DIVIDER_REGEX: LazyLock = LazyLock::new(|| { - ByteRegexBuilder::new(r"^(?P(?:-+){3,})(?P[^-\r\n][^\r\n]*)?\r?\n") - .multi_line(true) - .build() - .unwrap() -}); - -static COMMENT_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"(?m)^\s*;.*$").unwrap()); - -static WHITESPACE_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"\s+").unwrap()); - -static SEXP_FIELD_REGEX: LazyLock = LazyLock::new(|| Regex::new(r" \w+: \(").unwrap()); - -static POINT_REGEX: LazyLock = - LazyLock::new(|| Regex::new(r"\s*\[\s*\d+\s*,\s*\d+\s*\]\s*").unwrap()); - -#[derive(Debug, PartialEq, Eq)] -pub enum TestEntry { - Group { - name: String, - children: Vec, - file_path: Option, - }, - Example { - name: String, - input: Vec, - output: String, - header_delim_len: usize, - divider_delim_len: usize, - has_fields: bool, - attributes_str: String, - attributes: TestAttributes, - file_name: Option, - }, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct TestAttributes { - pub skip: bool, - pub platform: bool, - pub fail_fast: bool, - pub error: bool, - pub cst: bool, - pub languages: Vec>, -} - -impl Default for TestEntry { - fn default() -> Self { - Self::Group { - name: String::new(), - children: Vec::new(), - file_path: None, - } - } -} - -impl Default for TestAttributes { - fn default() -> Self { - Self { - skip: false, - platform: true, - fail_fast: false, - error: false, - cst: false, - languages: vec!["".into()], - } - } -} - -#[derive(ValueEnum, Default, Debug, Copy, Clone, PartialEq, Eq, Serialize)] -pub enum TestStats { - All, - #[default] - OutliersAndTotal, - TotalOnly, -} - -pub struct TestOptions<'a> { - pub path: PathBuf, - pub debug: bool, - pub debug_graph: bool, - pub include: Option, - pub exclude: Option, - pub file_name: Option, - pub update: bool, - pub open_log: bool, - pub languages: BTreeMap<&'a str, &'a Language>, - pub color: bool, - pub show_fields: bool, - pub overview_only: bool, -} - -/// A stateful object used to collect results from running a grammar's test suite -#[derive(Debug, Default, Serialize, JsonSchema)] -pub struct TestSummary { - // Parse test results and associated data - #[schemars(schema_with = "schema_as_array")] - #[serde(serialize_with = "serialize_as_array")] - pub parse_results: TestResultHierarchy, - pub parse_failures: Vec, - pub parse_stats: Stats, - #[schemars(skip)] - #[serde(skip)] - pub has_parse_errors: bool, - #[schemars(skip)] - #[serde(skip)] - pub parse_stat_display: TestStats, - - // Other test results - #[schemars(schema_with = "schema_as_array")] - #[serde(serialize_with = "serialize_as_array")] - pub highlight_results: TestResultHierarchy, - #[schemars(schema_with = "schema_as_array")] - #[serde(serialize_with = "serialize_as_array")] - pub tag_results: TestResultHierarchy, - #[schemars(schema_with = "schema_as_array")] - #[serde(serialize_with = "serialize_as_array")] - pub query_results: TestResultHierarchy, - - // Data used during construction - #[schemars(skip)] - #[serde(skip)] - pub test_num: usize, - // Options passed in from the CLI which control how the summary is displayed - #[schemars(skip)] - #[serde(skip)] - pub color: bool, - #[schemars(skip)] - #[serde(skip)] - pub overview_only: bool, - #[schemars(skip)] - #[serde(skip)] - pub update: bool, - #[schemars(skip)] - #[serde(skip)] - pub json: bool, -} - -impl TestSummary { - #[must_use] - pub fn new( - color: bool, - stat_display: TestStats, - parse_update: bool, - overview_only: bool, - json_summary: bool, - ) -> Self { - Self { - color, - parse_stat_display: stat_display, - update: parse_update, - overview_only, - json: json_summary, - test_num: 1, - ..Default::default() - } - } -} - -#[derive(Debug, Default, JsonSchema)] -pub struct TestResultHierarchy { - root_group: Vec, - traversal_idxs: Vec, -} - -fn serialize_as_array(results: &TestResultHierarchy, serializer: S) -> Result -where - S: serde::Serializer, -{ - results.root_group.serialize(serializer) -} - -fn schema_as_array(gen: &mut SchemaGenerator) -> Schema { - gen.subschema_for::>() -} - -/// Stores arbitrarily nested parent test groups and child cases. Supports creation -/// in DFS traversal order -impl TestResultHierarchy { - /// Signifies the start of a new group's traversal during construction. - fn push_traversal(&mut self, idx: usize) { - self.traversal_idxs.push(idx); - } - - /// Signifies the end of the current group's traversal during construction. - /// Must be paired with a prior call to [`TestResultHierarchy::add_group`]. - pub fn pop_traversal(&mut self) { - self.traversal_idxs.pop(); - } - - /// Adds a new group as a child of the current group. Caller is responsible - /// for calling [`TestResultHierarchy::pop_traversal`] once the group is done - /// being traversed. - pub fn add_group(&mut self, group_name: &str) { - let new_group_idx = self.curr_group_len(); - self.push(TestResult { - name: group_name.to_string(), - info: TestInfo::Group { - children: Vec::new(), - }, - }); - self.push_traversal(new_group_idx); - } - - /// Adds a new test example as a child of the current group. - /// Asserts that `test_case.info` is not [`TestInfo::Group`]. - pub fn add_case(&mut self, test_case: TestResult) { - assert!(!matches!(test_case.info, TestInfo::Group { .. })); - self.push(test_case); - } - - /// Adds a new `TestResult` to the current group. - fn push(&mut self, result: TestResult) { - // If there are no traversal steps, we're adding to the root - if self.traversal_idxs.is_empty() { - self.root_group.push(result); - return; - } - - #[allow(clippy::manual_let_else)] - let mut curr_group = match self.root_group[self.traversal_idxs[0]].info { - TestInfo::Group { ref mut children } => children, - _ => unreachable!(), - }; - for idx in self.traversal_idxs.iter().skip(1) { - curr_group = match curr_group[*idx].info { - TestInfo::Group { ref mut children } => children, - _ => unreachable!(), - }; - } - - curr_group.push(result); - } - - fn curr_group_len(&self) -> usize { - if self.traversal_idxs.is_empty() { - return self.root_group.len(); - } - - #[allow(clippy::manual_let_else)] - let mut curr_group = match self.root_group[self.traversal_idxs[0]].info { - TestInfo::Group { ref children } => children, - _ => unreachable!(), - }; - for idx in self.traversal_idxs.iter().skip(1) { - curr_group = match curr_group[*idx].info { - TestInfo::Group { ref children } => children, - _ => unreachable!(), - }; - } - curr_group.len() - } - - #[allow(clippy::iter_without_into_iter)] - #[must_use] - pub fn iter(&self) -> TestResultIterWithDepth<'_> { - let mut stack = Vec::with_capacity(self.root_group.len()); - for child in self.root_group.iter().rev() { - stack.push((0, child)); - } - TestResultIterWithDepth { stack } - } -} - -pub struct TestResultIterWithDepth<'a> { - stack: Vec<(usize, &'a TestResult)>, -} - -impl<'a> Iterator for TestResultIterWithDepth<'a> { - type Item = (usize, &'a TestResult); - - fn next(&mut self) -> Option { - self.stack.pop().inspect(|(depth, result)| { - if let TestInfo::Group { children } = &result.info { - for child in children.iter().rev() { - self.stack.push((depth + 1, child)); - } - } - }) - } -} - -#[derive(Debug, Serialize, JsonSchema)] -pub struct TestResult { - pub name: String, - #[schemars(flatten)] - #[serde(flatten)] - pub info: TestInfo, -} - -#[derive(Debug, Serialize, JsonSchema)] -#[schemars(untagged)] -#[serde(untagged)] -pub enum TestInfo { - Group { - children: Vec, - }, - ParseTest { - outcome: TestOutcome, - // True parse rate, adjusted parse rate - #[schemars(schema_with = "parse_rate_schema")] - #[serde(serialize_with = "serialize_parse_rates")] - parse_rate: Option<(f64, f64)>, - test_num: usize, - }, - AssertionTest { - outcome: TestOutcome, - test_num: usize, - }, -} - -fn serialize_parse_rates( - parse_rate: &Option<(f64, f64)>, - serializer: S, -) -> Result -where - S: serde::Serializer, -{ - match parse_rate { - None => serializer.serialize_none(), - Some((first, _)) => serializer.serialize_some(first), - } -} - -fn parse_rate_schema(gen: &mut SchemaGenerator) -> Schema { - gen.subschema_for::>() -} - -#[derive(Debug, Clone, Eq, PartialEq, Serialize, JsonSchema)] -pub enum TestOutcome { - // Parse outcomes - Passed, - Failed, - Updated, - Skipped, - Platform, - - // Highlight/Tag/Query outcomes - AssertionPassed { assertion_count: usize }, - AssertionFailed { error: String }, -} - -impl TestSummary { - fn fmt_parse_results(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let (count, total_adj_parse_time) = self - .parse_results - .iter() - .filter_map(|(_, result)| match result.info { - TestInfo::Group { .. } => None, - TestInfo::ParseTest { parse_rate, .. } => parse_rate, - _ => unreachable!(), - }) - .fold((0usize, 0.0f64), |(count, rate_accum), (_, adj_rate)| { - (count + 1, rate_accum + adj_rate) - }); - - let avg = total_adj_parse_time / count as f64; - let std_dev = { - let variance = self - .parse_results - .iter() - .filter_map(|(_, result)| match result.info { - TestInfo::Group { .. } => None, - TestInfo::ParseTest { parse_rate, .. } => parse_rate, - _ => unreachable!(), - }) - .map(|(_, rate_i)| (rate_i - avg).powi(2)) - .sum::() - / count as f64; - variance.sqrt() - }; - - for (depth, entry) in self.parse_results.iter() { - write!(f, "{}", " ".repeat(depth + 1))?; - match &entry.info { - TestInfo::Group { .. } => writeln!(f, "{}:", entry.name)?, - TestInfo::ParseTest { - outcome, - parse_rate, - test_num, - } => { - let (color, result_char) = match outcome { - TestOutcome::Passed => (AnsiColor::Green, "✓"), - TestOutcome::Failed => (AnsiColor::Red, "✗"), - TestOutcome::Updated => (AnsiColor::Blue, "✓"), - TestOutcome::Skipped => (AnsiColor::Yellow, "⌀"), - TestOutcome::Platform => (AnsiColor::Magenta, "⌀"), - _ => unreachable!(), - }; - let stat_display = match (self.parse_stat_display, parse_rate) { - (TestStats::TotalOnly, _) | (_, None) => String::new(), - (display, Some((true_rate, adj_rate))) => { - let mut stats = if display == TestStats::All { - format!(" ({true_rate:.3} bytes/ms)") - } else { - String::new() - }; - // 3 standard deviations below the mean, aka the "Empirical Rule" - if *adj_rate < 3.0f64.mul_add(-std_dev, avg) { - stats += &paint( - self.color.then_some(AnsiColor::Yellow), - &format!( - " -- Warning: Slow parse rate ({true_rate:.3} bytes/ms)" - ), - ); - } - stats - } - }; - writeln!( - f, - "{test_num:>3}. {result_char} {}{stat_display}", - paint(self.color.then_some(color), &entry.name), - )?; - } - TestInfo::AssertionTest { .. } => unreachable!(), - } - } - - // Parse failure info - if !self.parse_failures.is_empty() && self.update && !self.has_parse_errors { - writeln!( - f, - "\n{} update{}:\n", - self.parse_failures.len(), - if self.parse_failures.len() == 1 { - "" - } else { - "s" - } - )?; - - for (i, TestFailure { name, .. }) in self.parse_failures.iter().enumerate() { - writeln!(f, " {}. {name}", i + 1)?; - } - } else if !self.parse_failures.is_empty() && !self.overview_only { - if !self.has_parse_errors { - writeln!( - f, - "\n{} failure{}:", - self.parse_failures.len(), - if self.parse_failures.len() == 1 { - "" - } else { - "s" - } - )?; - } - - if self.color { - DiffKey.fmt(f)?; - } - for ( - i, - TestFailure { - name, - actual, - expected, - is_cst, - }, - ) in self.parse_failures.iter().enumerate() - { - if expected == "NO ERROR" { - writeln!(f, "\n {}. {name}:\n", i + 1)?; - writeln!(f, " Expected an ERROR node, but got:")?; - let actual = if *is_cst { - actual - } else { - &format_sexp(actual, 2) - }; - writeln!( - f, - " {}", - paint(self.color.then_some(AnsiColor::Red), actual) - )?; - } else { - writeln!(f, "\n {}. {name}:", i + 1)?; - if *is_cst { - writeln!( - f, - "{}", - TestDiff::new(actual, expected).with_color(self.color) - )?; - } else { - writeln!( - f, - "{}", - TestDiff::new(&format_sexp(actual, 2), &format_sexp(expected, 2)) - .with_color(self.color,) - )?; - } - } - } - } else { - writeln!(f)?; - } - - Ok(()) - } -} - -impl std::fmt::Display for TestSummary { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.fmt_parse_results(f)?; - - let mut render_assertion_results = - |name: &str, results: &TestResultHierarchy| -> std::fmt::Result { - writeln!(f, "{name}:")?; - for (depth, entry) in results.iter() { - write!(f, "{}", " ".repeat(depth + 2))?; - match &entry.info { - TestInfo::Group { .. } => writeln!(f, "{}", entry.name)?, - TestInfo::AssertionTest { outcome, test_num } => match outcome { - TestOutcome::AssertionPassed { assertion_count } => writeln!( - f, - "{:>3}. ✓ {} ({assertion_count} assertions)", - test_num, - paint(self.color.then_some(AnsiColor::Green), &entry.name) - )?, - TestOutcome::AssertionFailed { error } => { - writeln!( - f, - "{:>3}. ✗ {}", - test_num, - paint(self.color.then_some(AnsiColor::Red), &entry.name) - )?; - writeln!(f, "{} {error}", " ".repeat(depth + 1))?; - } - _ => unreachable!(), - }, - TestInfo::ParseTest { .. } => unreachable!(), - } - } - Ok(()) - }; - - if !self.highlight_results.root_group.is_empty() { - render_assertion_results("syntax highlighting", &self.highlight_results)?; - } - - if !self.tag_results.root_group.is_empty() { - render_assertion_results("tags", &self.tag_results)?; - } - - if !self.query_results.root_group.is_empty() { - render_assertion_results("queries", &self.query_results)?; - } - - write!(f, "{}", self.parse_stats)?; - - Ok(()) - } -} - -pub fn run_tests_at_path( - parser: &mut Parser, - opts: &TestOptions, - test_summary: &mut TestSummary, -) -> Result<()> { - let test_entry = parse_tests(&opts.path)?; - let mut _log_session = None; - - if opts.debug_graph { - _log_session = Some(util::log_graphs(parser, "log.html", opts.open_log)?); - } else if opts.debug { - parser.set_logger(Some(Box::new(|log_type, message| { - if log_type == LogType::Lex { - io::stderr().write_all(b" ").unwrap(); - } - writeln!(&mut io::stderr(), "{message}").unwrap(); - }))); - } - - let mut corrected_entries = Vec::new(); - run_tests( - parser, - test_entry, - opts, - test_summary, - &mut corrected_entries, - true, - )?; - - parser.stop_printing_dot_graphs(); - - if test_summary.parse_failures.is_empty() || (opts.update && !test_summary.has_parse_errors) { - Ok(()) - } else if opts.update && test_summary.has_parse_errors { - Err(anyhow!(indoc! {" - Some tests failed to parse with unexpected `ERROR` or `MISSING` nodes, as shown above, and cannot be updated automatically. - Either fix the grammar or manually update the tests if this is expected."})) - } else { - Err(anyhow!("")) - } -} - -pub fn check_queries_at_path(language: &Language, path: &Path) -> Result<()> { - if path.exists() { - for entry in WalkDir::new(path) - .into_iter() - .filter_map(std::result::Result::ok) - .filter(|e| { - e.file_type().is_file() - && e.path().extension().and_then(OsStr::to_str) == Some("scm") - && !e.path().starts_with(".") - }) - { - let filepath = entry.file_name().to_str().unwrap_or(""); - let content = fs::read_to_string(entry.path()) - .with_context(|| format!("Error reading query file {filepath:?}"))?; - Query::new(language, &content) - .with_context(|| format!("Error in query file {filepath:?}"))?; - } - } - Ok(()) -} - -pub struct DiffKey; - -impl std::fmt::Display for DiffKey { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "\ncorrect / {} / {}", - paint(Some(AnsiColor::Green), "expected"), - paint(Some(AnsiColor::Red), "unexpected") - )?; - Ok(()) - } -} - -impl DiffKey { - /// Writes [`DiffKey`] to stdout - pub fn print() { - println!("{Self}"); - } -} - -pub struct TestDiff<'a> { - pub actual: &'a str, - pub expected: &'a str, - pub color: bool, -} - -impl<'a> TestDiff<'a> { - #[must_use] - pub const fn new(actual: &'a str, expected: &'a str) -> Self { - Self { - actual, - expected, - color: true, - } - } - - #[must_use] - pub const fn with_color(mut self, color: bool) -> Self { - self.color = color; - self - } -} - -impl std::fmt::Display for TestDiff<'_> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let diff = TextDiff::from_lines(self.actual, self.expected); - for diff in diff.iter_all_changes() { - match diff.tag() { - ChangeTag::Equal => { - if self.color { - write!(f, "{diff}")?; - } else { - write!(f, " {diff}")?; - } - } - ChangeTag::Insert => { - if self.color { - write!( - f, - "{}", - paint(Some(AnsiColor::Green), diff.as_str().unwrap()) - )?; - } else { - write!(f, "+{diff}")?; - } - if diff.missing_newline() { - writeln!(f)?; - } - } - ChangeTag::Delete => { - if self.color { - write!(f, "{}", paint(Some(AnsiColor::Red), diff.as_str().unwrap()))?; - } else { - write!(f, "-{diff}")?; - } - if diff.missing_newline() { - writeln!(f)?; - } - } - } - } - - Ok(()) - } -} - -#[derive(Debug, Serialize, JsonSchema)] -pub struct TestFailure { - name: String, - actual: String, - expected: String, - is_cst: bool, -} - -impl TestFailure { - fn new(name: T, actual: U, expected: V, is_cst: bool) -> Self - where - T: Into, - U: Into, - V: Into, - { - Self { - name: name.into(), - actual: actual.into(), - expected: expected.into(), - is_cst, - } - } -} - -struct TestCorrection { - name: String, - input: String, - output: String, - attributes_str: String, - header_delim_len: usize, - divider_delim_len: usize, -} - -impl TestCorrection { - fn new( - name: T, - input: U, - output: V, - attributes_str: W, - header_delim_len: usize, - divider_delim_len: usize, - ) -> Self - where - T: Into, - U: Into, - V: Into, - W: Into, - { - Self { - name: name.into(), - input: input.into(), - output: output.into(), - attributes_str: attributes_str.into(), - header_delim_len, - divider_delim_len, - } - } -} - -/// This will return false if we want to "fail fast". It will bail and not parse any more tests. -fn run_tests( - parser: &mut Parser, - test_entry: TestEntry, - opts: &TestOptions, - test_summary: &mut TestSummary, - corrected_entries: &mut Vec, - is_root: bool, -) -> Result { - match test_entry { - TestEntry::Example { - name, - input, - output, - header_delim_len, - divider_delim_len, - has_fields, - attributes_str, - attributes, - .. - } => { - if attributes.skip { - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Skipped, - parse_rate: None, - test_num: test_summary.test_num, - }, - }); - test_summary.test_num += 1; - return Ok(true); - } - - if !attributes.platform { - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Platform, - parse_rate: None, - test_num: test_summary.test_num, - }, - }); - test_summary.test_num += 1; - return Ok(true); - } - - for (i, language_name) in attributes.languages.iter().enumerate() { - if !language_name.is_empty() { - let language = opts - .languages - .get(language_name.as_ref()) - .ok_or_else(|| anyhow!("Language not found: {language_name}"))?; - parser.set_language(language)?; - } - let start = std::time::Instant::now(); - let tree = parser.parse(&input, None).unwrap(); - let parse_rate = { - let parse_time = start.elapsed(); - let true_parse_rate = tree.root_node().byte_range().len() as f64 - / (parse_time.as_nanos() as f64 / 1_000_000.0); - let adj_parse_rate = adjusted_parse_rate(&tree, parse_time); - - test_summary.parse_stats.total_parses += 1; - test_summary.parse_stats.total_duration += parse_time; - test_summary.parse_stats.total_bytes += tree.root_node().byte_range().len(); - - Some((true_parse_rate, adj_parse_rate)) - }; - - if attributes.error { - if tree.root_node().has_error() { - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Passed, - parse_rate, - test_num: test_summary.test_num, - }, - }); - test_summary.parse_stats.successful_parses += 1; - if opts.update { - let input = String::from_utf8(input.clone()).unwrap(); - let output = if attributes.cst { - output.clone() - } else { - format_sexp(&output, 0) - }; - corrected_entries.push(TestCorrection::new( - &name, - input, - output, - &attributes_str, - header_delim_len, - divider_delim_len, - )); - } - } else { - if opts.update { - let input = String::from_utf8(input.clone()).unwrap(); - // Keep the original `expected` output if the actual output has no error - let output = if attributes.cst { - output.clone() - } else { - format_sexp(&output, 0) - }; - corrected_entries.push(TestCorrection::new( - &name, - input, - output, - &attributes_str, - header_delim_len, - divider_delim_len, - )); - } - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Failed, - parse_rate, - test_num: test_summary.test_num, - }, - }); - let actual = if attributes.cst { - render_test_cst(&input, &tree)? - } else { - tree.root_node().to_sexp() - }; - test_summary.parse_failures.push(TestFailure::new( - &name, - actual, - "NO ERROR", - attributes.cst, - )); - } - - if attributes.fail_fast { - return Ok(false); - } - } else { - let mut actual = if attributes.cst { - render_test_cst(&input, &tree)? - } else { - tree.root_node().to_sexp() - }; - if !(attributes.cst || opts.show_fields || has_fields) { - actual = strip_sexp_fields(&actual); - } - - if actual == output { - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Passed, - parse_rate, - test_num: test_summary.test_num, - }, - }); - test_summary.parse_stats.successful_parses += 1; - if opts.update { - let input = String::from_utf8(input.clone()).unwrap(); - let output = if attributes.cst { - actual - } else { - format_sexp(&output, 0) - }; - corrected_entries.push(TestCorrection::new( - &name, - input, - output, - &attributes_str, - header_delim_len, - divider_delim_len, - )); - } - } else { - if opts.update { - let input = String::from_utf8(input.clone()).unwrap(); - let (expected_output, actual_output) = if attributes.cst { - (output.clone(), actual.clone()) - } else { - (format_sexp(&output, 0), format_sexp(&actual, 0)) - }; - - // Only bail early before updating if the actual is not the output, - // sometimes users want to test cases that - // are intended to have errors, hence why this - // check isn't shown above - if actual.contains("ERROR") || actual.contains("MISSING") { - test_summary.has_parse_errors = true; - - // keep the original `expected` output if the actual output has an - // error - corrected_entries.push(TestCorrection::new( - &name, - input, - expected_output, - &attributes_str, - header_delim_len, - divider_delim_len, - )); - } else { - corrected_entries.push(TestCorrection::new( - &name, - input, - actual_output, - &attributes_str, - header_delim_len, - divider_delim_len, - )); - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Updated, - parse_rate, - test_num: test_summary.test_num, - }, - }); - } - } else { - test_summary.parse_results.add_case(TestResult { - name: name.clone(), - info: TestInfo::ParseTest { - outcome: TestOutcome::Failed, - parse_rate, - test_num: test_summary.test_num, - }, - }); - } - test_summary.parse_failures.push(TestFailure::new( - &name, - actual, - &output, - attributes.cst, - )); - - if attributes.fail_fast { - return Ok(false); - } - } - } - - if i == attributes.languages.len() - 1 { - // reset to the first language - parser.set_language(opts.languages.values().next().unwrap())?; - } - } - test_summary.test_num += 1; - } - TestEntry::Group { - name, - children, - file_path, - } => { - if children.is_empty() { - return Ok(true); - } - - let mut ran_test_in_group = false; - - let matches_filter = |name: &str, file_name: &Option, opts: &TestOptions| { - if let (Some(test_file_path), Some(filter_file_name)) = (file_name, &opts.file_name) - { - if !filter_file_name.eq(test_file_path) { - return false; - } - } - if let Some(include) = &opts.include { - include.is_match(name) - } else if let Some(exclude) = &opts.exclude { - !exclude.is_match(name) - } else { - true - } - }; - - for child in children { - if let TestEntry::Example { - ref name, - ref file_name, - ref input, - ref output, - ref attributes_str, - header_delim_len, - divider_delim_len, - .. - } = child - { - if !matches_filter(name, file_name, opts) { - if opts.update { - let input = String::from_utf8(input.clone()).unwrap(); - let output = format_sexp(output, 0); - corrected_entries.push(TestCorrection::new( - name, - input, - output, - attributes_str, - header_delim_len, - divider_delim_len, - )); - } - - test_summary.test_num += 1; - continue; - } - } - - if !ran_test_in_group && !is_root { - test_summary.parse_results.add_group(&name); - ran_test_in_group = true; - } - if !run_tests(parser, child, opts, test_summary, corrected_entries, false)? { - // fail fast - return Ok(false); - } - } - // Now that we're done traversing the children of the current group, pop - // the index - test_summary.parse_results.pop_traversal(); - - if let Some(file_path) = file_path { - if opts.update { - write_tests(&file_path, corrected_entries)?; - } - corrected_entries.clear(); - } - } - } - Ok(true) -} - -/// Convenience wrapper to render a CST for a test entry. -fn render_test_cst(input: &[u8], tree: &Tree) -> Result { - let mut rendered_cst: Vec = Vec::new(); - let mut cursor = tree.walk(); - let opts = ParseFileOptions { - edits: &[], - output: ParseOutput::Cst, - stats: &mut ParseStats::default(), - print_time: false, - timeout: 0, - debug: ParseDebugType::Quiet, - debug_graph: false, - cancellation_flag: None, - encoding: None, - open_log: false, - no_ranges: false, - parse_theme: &ParseTheme::empty(), - }; - render_cst(input, tree, &mut cursor, &opts, &mut rendered_cst)?; - Ok(String::from_utf8_lossy(&rendered_cst).trim().to_string()) -} - -// Parse time is interpreted in ns before converting to ms to avoid truncation issues -// Parse rates often have several outliers, leading to a large standard deviation. Taking -// the log of these rates serves to "flatten" out the distribution, yielding a more -// usable standard deviation for finding statistically significant slow parse rates -// NOTE: This is just a heuristic -#[must_use] -pub fn adjusted_parse_rate(tree: &Tree, parse_time: Duration) -> f64 { - f64::ln( - tree.root_node().byte_range().len() as f64 / (parse_time.as_nanos() as f64 / 1_000_000.0), - ) -} - -fn write_tests(file_path: &Path, corrected_entries: &[TestCorrection]) -> Result<()> { - let mut buffer = fs::File::create(file_path)?; - write_tests_to_buffer(&mut buffer, corrected_entries) -} - -fn write_tests_to_buffer( - buffer: &mut impl Write, - corrected_entries: &[TestCorrection], -) -> Result<()> { - for ( - i, - TestCorrection { - name, - input, - output, - attributes_str, - header_delim_len, - divider_delim_len, - }, - ) in corrected_entries.iter().enumerate() - { - if i > 0 { - writeln!(buffer)?; - } - writeln!( - buffer, - "{}\n{name}\n{}{}\n{input}\n{}\n\n{}", - "=".repeat(*header_delim_len), - if attributes_str.is_empty() { - attributes_str.clone() - } else { - format!("{attributes_str}\n") - }, - "=".repeat(*header_delim_len), - "-".repeat(*divider_delim_len), - output.trim() - )?; - } - Ok(()) -} - -pub fn parse_tests(path: &Path) -> io::Result { - let name = path - .file_stem() - .and_then(|s| s.to_str()) - .unwrap_or("") - .to_string(); - if path.is_dir() { - let mut children = Vec::new(); - for entry in fs::read_dir(path)? { - let entry = entry?; - let hidden = entry.file_name().to_str().unwrap_or("").starts_with('.'); - if !hidden { - children.push(entry.path()); - } - } - children.sort_by(|a, b| { - a.file_name() - .unwrap_or_default() - .cmp(b.file_name().unwrap_or_default()) - }); - let children = children - .iter() - .map(|path| parse_tests(path)) - .collect::>>()?; - Ok(TestEntry::Group { - name, - children, - file_path: None, - }) - } else { - let content = fs::read_to_string(path)?; - Ok(parse_test_content(name, &content, Some(path.to_path_buf()))) - } -} - -#[must_use] -pub fn strip_sexp_fields(sexp: &str) -> String { - SEXP_FIELD_REGEX.replace_all(sexp, " (").to_string() -} - -#[must_use] -pub fn strip_points(sexp: &str) -> String { - POINT_REGEX.replace_all(sexp, "").to_string() -} - -fn parse_test_content(name: String, content: &str, file_path: Option) -> TestEntry { - let mut children = Vec::new(); - let bytes = content.as_bytes(); - let mut prev_name = String::new(); - let mut prev_attributes_str = String::new(); - let mut prev_header_end = 0; - - // Find the first test header in the file, and determine if it has a - // custom suffix. If so, then this suffix will be used to identify - // all subsequent headers and divider lines in the file. - let first_suffix = HEADER_REGEX - .captures(bytes) - .and_then(|c| c.name("suffix1")) - .map(|m| String::from_utf8_lossy(m.as_bytes())); - - // Find all of the `===` test headers, which contain the test names. - // Ignore any matches whose suffix does not match the first header - // suffix in the file. - let header_matches = HEADER_REGEX.captures_iter(bytes).filter_map(|c| { - let header_delim_len = c.name("equals").map_or(80, |m| m.as_bytes().len()); - let suffix1 = c - .name("suffix1") - .map(|m| String::from_utf8_lossy(m.as_bytes())); - let suffix2 = c - .name("suffix2") - .map(|m| String::from_utf8_lossy(m.as_bytes())); - - let (mut skip, mut platform, mut fail_fast, mut error, mut cst, mut languages) = - (false, None, false, false, false, vec![]); - - let test_name_and_markers = c - .name("test_name_and_markers") - .map_or("".as_bytes(), |m| m.as_bytes()); - - let mut test_name = String::new(); - let mut attributes_str = String::new(); - - let mut seen_marker = false; - - let test_name_and_markers = str::from_utf8(test_name_and_markers).unwrap(); - for line in test_name_and_markers - .split_inclusive('\n') - .filter(|s| !s.is_empty()) - { - let trimmed_line = line.trim(); - match trimmed_line.split('(').next().unwrap() { - ":skip" => (seen_marker, skip) = (true, true), - ":platform" => { - if let Some(platforms) = trimmed_line.strip_prefix(':').and_then(|s| { - s.strip_prefix("platform(") - .and_then(|s| s.strip_suffix(')')) - }) { - seen_marker = true; - platform = Some( - platform.unwrap_or(false) || platforms.trim() == std::env::consts::OS, - ); - } - } - ":fail-fast" => (seen_marker, fail_fast) = (true, true), - ":error" => (seen_marker, error) = (true, true), - ":language" => { - if let Some(lang) = trimmed_line.strip_prefix(':').and_then(|s| { - s.strip_prefix("language(") - .and_then(|s| s.strip_suffix(')')) - }) { - seen_marker = true; - languages.push(lang.into()); - } - } - ":cst" => (seen_marker, cst) = (true, true), - _ if !seen_marker => { - test_name.push_str(line); - } - _ => {} - } - } - attributes_str.push_str(test_name_and_markers.strip_prefix(&test_name).unwrap()); - - // prefer skip over error, both shouldn't be set - if skip { - error = false; - } - - // add a default language if none are specified, will defer to the first language - if languages.is_empty() { - languages.push("".into()); - } - - if suffix1 == first_suffix && suffix2 == first_suffix { - let header_range = c.get(0).unwrap().range(); - let test_name = if test_name.is_empty() { - None - } else { - Some(test_name.trim_end().to_string()) - }; - let attributes_str = if attributes_str.is_empty() { - None - } else { - Some(attributes_str.trim_end().to_string()) - }; - Some(( - header_delim_len, - header_range, - test_name, - attributes_str, - TestAttributes { - skip, - platform: platform.unwrap_or(true), - fail_fast, - error, - cst, - languages, - }, - )) - } else { - None - } - }); - - let (mut prev_header_len, mut prev_attributes) = (80, TestAttributes::default()); - for (header_delim_len, header_range, test_name, attributes_str, attributes) in header_matches - .chain(Some(( - 80, - bytes.len()..bytes.len(), - None, - None, - TestAttributes::default(), - ))) - { - // Find the longest line of dashes following each test description. That line - // separates the input from the expected output. Ignore any matches whose suffix - // does not match the first suffix in the file. - if prev_header_end > 0 { - let divider_range = DIVIDER_REGEX - .captures_iter(&bytes[prev_header_end..header_range.start]) - .filter_map(|m| { - let divider_delim_len = m.name("hyphens").map_or(80, |m| m.as_bytes().len()); - let suffix = m - .name("suffix") - .map(|m| String::from_utf8_lossy(m.as_bytes())); - if suffix == first_suffix { - let range = m.get(0).unwrap().range(); - Some(( - divider_delim_len, - (prev_header_end + range.start)..(prev_header_end + range.end), - )) - } else { - None - } - }) - .max_by_key(|(_, range)| range.len()); - - if let Some((divider_delim_len, divider_range)) = divider_range { - if let Ok(output) = str::from_utf8(&bytes[divider_range.end..header_range.start]) { - let mut input = bytes[prev_header_end..divider_range.start].to_vec(); - - // Remove trailing newline from the input. - input.pop(); - if input.last() == Some(&b'\r') { - input.pop(); - } - - let (output, has_fields) = if prev_attributes.cst { - (output.trim().to_string(), false) - } else { - // Remove all comments - let output = COMMENT_REGEX.replace_all(output, "").to_string(); - - // Normalize the whitespace in the expected output. - let output = WHITESPACE_REGEX.replace_all(output.trim(), " "); - let output = output.replace(" )", ")"); - - // Identify if the expected output has fields indicated. If not, then - // fields will not be checked. - let has_fields = SEXP_FIELD_REGEX.is_match(&output); - - (output, has_fields) - }; - - let file_name = if let Some(ref path) = file_path { - path.file_name().map(|n| n.to_string_lossy().to_string()) - } else { - None - }; - - let t = TestEntry::Example { - name: prev_name, - input, - output, - header_delim_len: prev_header_len, - divider_delim_len, - has_fields, - attributes_str: prev_attributes_str, - attributes: prev_attributes, - file_name, - }; - - children.push(t); - } - } - } - prev_attributes = attributes; - prev_name = test_name.unwrap_or_default(); - prev_attributes_str = attributes_str.unwrap_or_default(); - prev_header_len = header_delim_len; - prev_header_end = header_range.end; - } - TestEntry::Group { - name, - children, - file_path, - } -} - -#[cfg(test)] -mod tests { - use serde_json::json; - - use crate::tests::get_language; - - use super::*; - - #[test] - fn test_parse_test_content_simple() { - let entry = parse_test_content( - "the-filename".to_string(), - r" -=============== -The first test -=============== - -a b c - ---- - -(a - (b c)) - -================ -The second test -================ -d ---- -(d) - " - .trim(), - None, - ); - - assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - children: vec![ - TestEntry::Example { - name: "The first test".to_string(), - input: b"\na b c\n".to_vec(), - output: "(a (b c))".to_string(), - header_delim_len: 15, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "The second test".to_string(), - input: b"d".to_vec(), - output: "(d)".to_string(), - header_delim_len: 16, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - ], - file_path: None, - } - ); - } - - #[test] - fn test_parse_test_content_with_dashes_in_source_code() { - let entry = parse_test_content( - "the-filename".to_string(), - r" -================== -Code with dashes -================== -abc ---- -defg ----- -hijkl -------- - -(a (b)) - -========================= -Code ending with dashes -========================= -abc ------------ -------------------- - -(c (d)) - " - .trim(), - None, - ); - - assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - children: vec![ - TestEntry::Example { - name: "Code with dashes".to_string(), - input: b"abc\n---\ndefg\n----\nhijkl".to_vec(), - output: "(a (b))".to_string(), - header_delim_len: 18, - divider_delim_len: 7, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "Code ending with dashes".to_string(), - input: b"abc\n-----------".to_vec(), - output: "(c (d))".to_string(), - header_delim_len: 25, - divider_delim_len: 19, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - ], - file_path: None, - } - ); - } - - #[test] - fn test_format_sexp() { - assert_eq!(format_sexp("", 0), ""); - assert_eq!( - format_sexp("(a b: (c) (d) e: (f (g (h (MISSING i)))))", 0), - r" -(a - b: (c) - (d) - e: (f - (g - (h - (MISSING i))))) -" - .trim() - ); - assert_eq!( - format_sexp("(program (ERROR (UNEXPECTED ' ')) (identifier))", 0), - r" -(program - (ERROR - (UNEXPECTED ' ')) - (identifier)) -" - .trim() - ); - assert_eq!( - format_sexp(r#"(source_file (MISSING ")"))"#, 0), - r#" -(source_file - (MISSING ")")) - "# - .trim() - ); - assert_eq!( - format_sexp( - r"(source_file (ERROR (UNEXPECTED 'f') (UNEXPECTED '+')))", - 0 - ), - r" -(source_file - (ERROR - (UNEXPECTED 'f') - (UNEXPECTED '+'))) -" - .trim() - ); - } - - #[test] - fn test_write_tests_to_buffer() { - let mut buffer = Vec::new(); - let corrected_entries = vec![ - TestCorrection::new( - "title 1".to_string(), - "input 1".to_string(), - "output 1".to_string(), - String::new(), - 80, - 80, - ), - TestCorrection::new( - "title 2".to_string(), - "input 2".to_string(), - "output 2".to_string(), - String::new(), - 80, - 80, - ), - ]; - write_tests_to_buffer(&mut buffer, &corrected_entries).unwrap(); - assert_eq!( - String::from_utf8(buffer).unwrap(), - r" -================================================================================ -title 1 -================================================================================ -input 1 --------------------------------------------------------------------------------- - -output 1 - -================================================================================ -title 2 -================================================================================ -input 2 --------------------------------------------------------------------------------- - -output 2 -" - .trim_start() - .to_string() - ); - } - - #[test] - fn test_parse_test_content_with_comments_in_sexp() { - let entry = parse_test_content( - "the-filename".to_string(), - r#" -================== -sexp with comment -================== -code ---- - -; Line start comment -(a (b)) - -================== -sexp with comment between -================== -code ---- - -; Line start comment -(a -; ignore this - (b) - ; also ignore this -) - -========================= -sexp with ';' -========================= -code ---- - -(MISSING ";") - "# - .trim(), - None, - ); - - assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - children: vec![ - TestEntry::Example { - name: "sexp with comment".to_string(), - input: b"code".to_vec(), - output: "(a (b))".to_string(), - header_delim_len: 18, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "sexp with comment between".to_string(), - input: b"code".to_vec(), - output: "(a (b))".to_string(), - header_delim_len: 18, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "sexp with ';'".to_string(), - input: b"code".to_vec(), - output: "(MISSING \";\")".to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - } - ], - file_path: None, - } - ); - } - - #[test] - fn test_parse_test_content_with_suffixes() { - let entry = parse_test_content( - "the-filename".to_string(), - r" -==================asdf\()[]|{}*+?^$.- -First test -==================asdf\()[]|{}*+?^$.- - -========================= -NOT A TEST HEADER -========================= -------------------------- - ----asdf\()[]|{}*+?^$.- - -(a) - -==================asdf\()[]|{}*+?^$.- -Second test -==================asdf\()[]|{}*+?^$.- - -========================= -NOT A TEST HEADER -========================= -------------------------- - ----asdf\()[]|{}*+?^$.- - -(a) - -=========================asdf\()[]|{}*+?^$.- -Test name with = symbol -=========================asdf\()[]|{}*+?^$.- - -========================= -NOT A TEST HEADER -========================= -------------------------- - ----asdf\()[]|{}*+?^$.- - -(a) - -==============================asdf\()[]|{}*+?^$.- -Test containing equals -==============================asdf\()[]|{}*+?^$.- - -=== - -------------------------------asdf\()[]|{}*+?^$.- - -(a) - -==============================asdf\()[]|{}*+?^$.- -Subsequent test containing equals -==============================asdf\()[]|{}*+?^$.- - -=== - -------------------------------asdf\()[]|{}*+?^$.- - -(a) -" - .trim(), - None, - ); - - let expected_input = b"\n=========================\n\ - NOT A TEST HEADER\n\ - =========================\n\ - -------------------------\n" - .to_vec(); - pretty_assertions::assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - children: vec![ - TestEntry::Example { - name: "First test".to_string(), - input: expected_input.clone(), - output: "(a)".to_string(), - header_delim_len: 18, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "Second test".to_string(), - input: expected_input.clone(), - output: "(a)".to_string(), - header_delim_len: 18, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "Test name with = symbol".to_string(), - input: expected_input, - output: "(a)".to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "Test containing equals".to_string(), - input: "\n===\n".into(), - output: "(a)".into(), - header_delim_len: 30, - divider_delim_len: 30, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "Subsequent test containing equals".to_string(), - input: "\n===\n".into(), - output: "(a)".into(), - header_delim_len: 30, - divider_delim_len: 30, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - } - ], - file_path: None, - } - ); - } - - #[test] - fn test_parse_test_content_with_newlines_in_test_names() { - let entry = parse_test_content( - "the-filename".to_string(), - r" -=============== -name -with -newlines -=============== -a ---- -(b) - -==================== -name with === signs -==================== -code with ---- ---- -(d) -", - None, - ); - - assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - file_path: None, - children: vec![ - TestEntry::Example { - name: "name\nwith\nnewlines".to_string(), - input: b"a".to_vec(), - output: "(b)".to_string(), - header_delim_len: 15, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - TestEntry::Example { - name: "name with === signs".to_string(), - input: b"code with ----".to_vec(), - output: "(d)".to_string(), - header_delim_len: 20, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - } - ] - } - ); - } - - #[test] - fn test_parse_test_with_markers() { - // do one with :skip, we should not see it in the entry output - - let entry = parse_test_content( - "the-filename".to_string(), - r" -===================== -Test with skip marker -:skip -===================== -a ---- -(b) -", - None, - ); - - assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - file_path: None, - children: vec![TestEntry::Example { - name: "Test with skip marker".to_string(), - input: b"a".to_vec(), - output: "(b)".to_string(), - header_delim_len: 21, - divider_delim_len: 3, - has_fields: false, - attributes_str: ":skip".to_string(), - attributes: TestAttributes { - skip: true, - platform: true, - fail_fast: false, - error: false, - cst: false, - languages: vec!["".into()] - }, - file_name: None, - }] - } - ); - - let entry = parse_test_content( - "the-filename".to_string(), - &format!( - r" -========================= -Test with platform marker -:platform({}) -:fail-fast -========================= -a ---- -(b) - -============================= -Test with bad platform marker -:platform({}) - -:language(foo) -============================= -a ---- -(b) - -==================== -Test with cst marker -:cst -==================== -1 ---- -0:0 - 1:0 source_file -0:0 - 0:1 expression -0:0 - 0:1 number_literal `1` -", - std::env::consts::OS, - if std::env::consts::OS == "linux" { - "macos" - } else { - "linux" - } - ), - None, - ); - - assert_eq!( - entry, - TestEntry::Group { - name: "the-filename".to_string(), - file_path: None, - children: vec![ - TestEntry::Example { - name: "Test with platform marker".to_string(), - input: b"a".to_vec(), - output: "(b)".to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: format!(":platform({})\n:fail-fast", std::env::consts::OS), - attributes: TestAttributes { - skip: false, - platform: true, - fail_fast: true, - error: false, - cst: false, - languages: vec!["".into()] - }, - file_name: None, - }, - TestEntry::Example { - name: "Test with bad platform marker".to_string(), - input: b"a".to_vec(), - output: "(b)".to_string(), - header_delim_len: 29, - divider_delim_len: 3, - has_fields: false, - attributes_str: if std::env::consts::OS == "linux" { - ":platform(macos)\n\n:language(foo)".to_string() - } else { - ":platform(linux)\n\n:language(foo)".to_string() - }, - attributes: TestAttributes { - skip: false, - platform: false, - fail_fast: false, - error: false, - cst: false, - languages: vec!["foo".into()] - }, - file_name: None, - }, - TestEntry::Example { - name: "Test with cst marker".to_string(), - input: b"1".to_vec(), - output: "0:0 - 1:0 source_file -0:0 - 0:1 expression -0:0 - 0:1 number_literal `1`" - .to_string(), - header_delim_len: 20, - divider_delim_len: 3, - has_fields: false, - attributes_str: ":cst".to_string(), - attributes: TestAttributes { - skip: false, - platform: true, - fail_fast: false, - error: false, - cst: true, - languages: vec!["".into()] - }, - file_name: None, - } - ] - } - ); - } - - fn clear_parse_rate(result: &mut TestResult) { - let test_case_info = &mut result.info; - match test_case_info { - TestInfo::ParseTest { - ref mut parse_rate, .. - } => { - assert!(parse_rate.is_some()); - *parse_rate = None; - } - TestInfo::Group { .. } | TestInfo::AssertionTest { .. } => { - panic!("Unexpected test result") - } - } - } - - #[test] - fn run_tests_simple() { - let mut parser = Parser::new(); - let language = get_language("c"); - parser - .set_language(&language) - .expect("Failed to set language"); - let mut languages = BTreeMap::new(); - languages.insert("c", &language); - let opts = TestOptions { - path: PathBuf::from("foo"), - debug: true, - debug_graph: false, - include: None, - exclude: None, - file_name: None, - update: false, - open_log: false, - languages, - color: true, - show_fields: false, - overview_only: false, - }; - - // NOTE: The following test cases are combined to work around a race condition - // in the loader - { - let test_entry = TestEntry::Group { - name: "foo".to_string(), - file_path: None, - children: vec![TestEntry::Example { - name: "C Test 1".to_string(), - input: b"1;\n".to_vec(), - output: "(translation_unit (expression_statement (number_literal)))" - .to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }], - }; - - let mut test_summary = TestSummary::new(true, TestStats::All, false, false, false); - let mut corrected_entries = Vec::new(); - run_tests( - &mut parser, - test_entry, - &opts, - &mut test_summary, - &mut corrected_entries, - true, - ) - .expect("Failed to run tests"); - - // parse rates will always be different, so we need to clear out these - // fields to reliably assert equality below - clear_parse_rate(&mut test_summary.parse_results.root_group[0]); - test_summary.parse_stats.total_duration = Duration::from_secs(0); - - let json_results = serde_json::to_string(&test_summary).unwrap(); - - assert_eq!( - json_results, - json!({ - "parse_results": [ - { - "name": "C Test 1", - "outcome": "Passed", - "parse_rate": null, - "test_num": 1 - } - ], - "parse_failures": [], - "parse_stats": { - "successful_parses": 1, - "total_parses": 1, - "total_bytes": 3, - "total_duration": { - "secs": 0, - "nanos": 0, - } - }, - "highlight_results": [], - "tag_results": [], - "query_results": [] - }) - .to_string() - ); - } - { - let test_entry = TestEntry::Group { - name: "corpus".to_string(), - file_path: None, - children: vec![ - TestEntry::Group { - name: "group1".to_string(), - // This test passes - children: vec![TestEntry::Example { - name: "C Test 1".to_string(), - input: b"1;\n".to_vec(), - output: "(translation_unit (expression_statement (number_literal)))" - .to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }], - file_path: None, - }, - TestEntry::Group { - name: "group2".to_string(), - children: vec![ - // This test passes - TestEntry::Example { - name: "C Test 2".to_string(), - input: b"1;\n".to_vec(), - output: - "(translation_unit (expression_statement (number_literal)))" - .to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }, - // This test fails, and is marked with fail-fast - TestEntry::Example { - name: "C Test 3".to_string(), - input: b"1;\n".to_vec(), - output: - "(translation_unit (expression_statement (string_literal)))" - .to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes { - fail_fast: true, - ..Default::default() - }, - file_name: None, - }, - ], - file_path: None, - }, - // This group never runs because of the previous failure - TestEntry::Group { - name: "group3".to_string(), - // This test fails, and is marked with fail-fast - children: vec![TestEntry::Example { - name: "C Test 4".to_string(), - input: b"1;\n".to_vec(), - output: "(translation_unit (expression_statement (number_literal)))" - .to_string(), - header_delim_len: 25, - divider_delim_len: 3, - has_fields: false, - attributes_str: String::new(), - attributes: TestAttributes::default(), - file_name: None, - }], - file_path: None, - }, - ], - }; - - let mut test_summary = TestSummary::new(true, TestStats::All, false, false, false); - let mut corrected_entries = Vec::new(); - run_tests( - &mut parser, - test_entry, - &opts, - &mut test_summary, - &mut corrected_entries, - true, - ) - .expect("Failed to run tests"); - - // parse rates will always be different, so we need to clear out these - // fields to reliably assert equality below - { - let test_group_1_info = &mut test_summary.parse_results.root_group[0].info; - match test_group_1_info { - TestInfo::Group { - ref mut children, .. - } => clear_parse_rate(&mut children[0]), - TestInfo::ParseTest { .. } | TestInfo::AssertionTest { .. } => { - panic!("Unexpected test result"); - } - } - let test_group_2_info = &mut test_summary.parse_results.root_group[1].info; - match test_group_2_info { - TestInfo::Group { - ref mut children, .. - } => { - clear_parse_rate(&mut children[0]); - clear_parse_rate(&mut children[1]); - } - TestInfo::ParseTest { .. } | TestInfo::AssertionTest { .. } => { - panic!("Unexpected test result"); - } - } - test_summary.parse_stats.total_duration = Duration::from_secs(0); - } - - let json_results = serde_json::to_string(&test_summary).unwrap(); - - assert_eq!( - json_results, - json!({ - "parse_results": [ - { - "name": "group1", - "children": [ - { - "name": "C Test 1", - "outcome": "Passed", - "parse_rate": null, - "test_num": 1 - } - ] - }, - { - "name": "group2", - "children": [ - { - "name": "C Test 2", - "outcome": "Passed", - "parse_rate": null, - "test_num": 2 - }, - { - "name": "C Test 3", - "outcome": "Failed", - "parse_rate": null, - "test_num": 3 - } - ] - } - ], - "parse_failures": [ - { - "name": "C Test 3", - "actual": "(translation_unit (expression_statement (number_literal)))", - "expected": "(translation_unit (expression_statement (string_literal)))", - "is_cst": false, - } - ], - "parse_stats": { - "successful_parses": 2, - "total_parses": 3, - "total_bytes": 9, - "total_duration": { - "secs": 0, - "nanos": 0, - } - }, - "highlight_results": [], - "tag_results": [], - "query_results": [] - }) - .to_string() - ); - } - } -} diff --git a/crates/cli/src/tests.rs b/crates/cli/src/tests.rs deleted file mode 100644 index 2439be38..00000000 --- a/crates/cli/src/tests.rs +++ /dev/null @@ -1,35 +0,0 @@ -mod async_boundary_test; -mod corpus_test; -mod detect_language; -mod helpers; -mod highlight_test; -mod language_test; -mod node_test; -mod parser_test; -mod pathological_test; -mod query_test; -mod tags_test; -mod test_highlight_test; -mod test_tags_test; -mod text_provider_test; -mod tree_test; - -#[cfg(feature = "wasm")] -mod wasm_language_test; - -use tree_sitter_generate::GenerateResult; - -pub use crate::fuzz::{ - allocations, - edits::{get_random_edit, invert_edit}, - random::Rand, - ITERATION_COUNT, -}; - -pub use helpers::fixtures::get_language; - -/// This is a simple wrapper around [`tree_sitter_generate::generate_parser_for_grammar`], because -/// our tests do not need to pass in a version number, only the grammar JSON. -fn generate_parser(grammar_json: &str) -> GenerateResult<(String, String)> { - tree_sitter_generate::generate_parser_for_grammar(grammar_json, Some((0, 0, 0))) -} diff --git a/crates/cli/src/tests/async_boundary_test.rs b/crates/cli/src/tests/async_boundary_test.rs deleted file mode 100644 index 254ed931..00000000 --- a/crates/cli/src/tests/async_boundary_test.rs +++ /dev/null @@ -1,150 +0,0 @@ -use std::{ - future::Future, - pin::Pin, - ptr, - task::{Context, Poll, RawWaker, RawWakerVTable, Waker}, -}; - -use tree_sitter::Parser; - -use super::helpers::fixtures::get_language; - -#[test] -fn test_node_across_async_boundaries() { - let mut parser = Parser::new(); - let language = get_language("bash"); - parser.set_language(&language).unwrap(); - let tree = parser.parse("#", None).unwrap(); - let root = tree.root_node(); - - let (result, yields) = simple_async_executor(async { - let root_ref = &root; - - // Test node captured by value - let fut_by_value = async { - yield_once().await; - root.child(0).unwrap().kind() - }; - - // Test node captured by reference - let fut_by_ref = async { - yield_once().await; - root_ref.child(0).unwrap().kind() - }; - - let result1 = fut_by_value.await; - let result2 = fut_by_ref.await; - - assert_eq!(result1, result2); - result1 - }); - - assert_eq!(result, "comment"); - assert_eq!(yields, 2); -} - -#[test] -fn test_cursor_across_async_boundaries() { - let mut parser = Parser::new(); - let language = get_language("c"); - parser.set_language(&language).unwrap(); - let tree = parser.parse("#", None).unwrap(); - let mut cursor = tree.walk(); - - let ((), yields) = simple_async_executor(async { - cursor.goto_first_child(); - - // Test cursor usage across yield point - yield_once().await; - cursor.goto_first_child(); - - // Test cursor in async block - let cursor_ref = &mut cursor; - let fut = async { - yield_once().await; - cursor_ref.goto_first_child(); - }; - fut.await; - }); - - assert_eq!(yields, 2); -} - -#[test] -fn test_node_and_cursor_together() { - let mut parser = Parser::new(); - let language = get_language("javascript"); - parser.set_language(&language).unwrap(); - let tree = parser.parse("#", None).unwrap(); - let root = tree.root_node(); - let mut cursor = tree.walk(); - - let ((), yields) = simple_async_executor(async { - cursor.goto_first_child(); - - let fut = async { - yield_once().await; - let _ = root.to_sexp(); - cursor.goto_first_child(); - }; - - yield_once().await; - fut.await; - }); - - assert_eq!(yields, 2); -} - -fn simple_async_executor(future: F) -> (F::Output, u32) -where - F: Future, -{ - let waker = noop_waker(); - let mut cx = Context::from_waker(&waker); - let mut yields = 0; - let mut future = Box::pin(future); - - loop { - match future.as_mut().poll(&mut cx) { - Poll::Ready(result) => return (result, yields), - Poll::Pending => yields += 1, - } - } -} - -async fn yield_once() { - struct YieldOnce { - yielded: bool, - } - - impl Future for YieldOnce { - type Output = (); - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { - if self.yielded { - Poll::Ready(()) - } else { - self.yielded = true; - cx.waker().wake_by_ref(); - Poll::Pending - } - } - } - - YieldOnce { yielded: false }.await; -} - -const fn noop_waker() -> Waker { - const VTABLE: RawWakerVTable = RawWakerVTable::new( - // Cloning just returns a new no-op raw waker - |_| RAW, - // `wake` does nothing - |_| {}, - // `wake_by_ref` does nothing - |_| {}, - // Dropping does nothing as we don't allocate anything - |_| {}, - ); - const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE); - unsafe { Waker::from_raw(RAW) } -} diff --git a/crates/cli/src/tests/helpers/dirs.rs b/crates/cli/src/tests/helpers/dirs.rs deleted file mode 100644 index d63790cd..00000000 --- a/crates/cli/src/tests/helpers/dirs.rs +++ /dev/null @@ -1,65 +0,0 @@ -pub static ROOT_DIR: LazyLock = LazyLock::new(|| { - PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .parent() - .unwrap() - .to_owned() -}); - -pub static FIXTURES_DIR: LazyLock = - LazyLock::new(|| ROOT_DIR.join("test").join("fixtures")); - -pub static HEADER_DIR: LazyLock = LazyLock::new(|| ROOT_DIR.join("lib").join("include")); - -pub static GRAMMARS_DIR: LazyLock = - LazyLock::new(|| ROOT_DIR.join("test").join("fixtures").join("grammars")); - -pub static SCRATCH_BASE_DIR: LazyLock = LazyLock::new(|| { - let result = ROOT_DIR.join("target").join("scratch"); - fs::create_dir_all(&result).unwrap(); - result -}); - -#[cfg(feature = "wasm")] -pub static WASM_DIR: LazyLock = LazyLock::new(|| ROOT_DIR.join("target").join("release")); - -pub static SCRATCH_DIR: LazyLock = LazyLock::new(|| { - // https://doc.rust-lang.org/reference/conditional-compilation.html - let vendor = if cfg!(target_vendor = "apple") { - "apple" - } else if cfg!(target_vendor = "fortanix") { - "fortanix" - } else if cfg!(target_vendor = "pc") { - "pc" - } else { - "unknown" - }; - let env = if cfg!(target_env = "gnu") { - "gnu" - } else if cfg!(target_env = "msvc") { - "msvc" - } else if cfg!(target_env = "musl") { - "musl" - } else if cfg!(target_env = "sgx") { - "sgx" - } else { - "unknown" - }; - let endian = if cfg!(target_endian = "little") { - "little" - } else if cfg!(target_endian = "big") { - "big" - } else { - "unknown" - }; - - let machine = format!( - "{}-{}-{vendor}-{env}-{endian}", - std::env::consts::ARCH, - std::env::consts::OS - ); - let result = SCRATCH_BASE_DIR.join(machine); - fs::create_dir_all(&result).unwrap(); - result -}); diff --git a/crates/cli/src/tests/language_test.rs b/crates/cli/src/tests/language_test.rs deleted file mode 100644 index 9f51f503..00000000 --- a/crates/cli/src/tests/language_test.rs +++ /dev/null @@ -1,199 +0,0 @@ -use tree_sitter::{self, Parser}; - -use super::helpers::fixtures::get_language; - -#[test] -fn test_lookahead_iterator() { - let mut parser = Parser::new(); - let language = get_language("rust"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("struct Stuff {}", None).unwrap(); - - let mut cursor = tree.walk(); - - assert!(cursor.goto_first_child()); // struct - assert!(cursor.goto_first_child()); // struct keyword - - let next_state = cursor.node().next_parse_state(); - assert_ne!(next_state, 0); - assert_eq!( - next_state, - language.next_state(cursor.node().parse_state(), cursor.node().grammar_id()) - ); - assert!((next_state as usize) < language.parse_state_count()); - assert!(cursor.goto_next_sibling()); // type_identifier - assert_eq!(next_state, cursor.node().parse_state()); - assert_eq!(cursor.node().grammar_name(), "identifier"); - assert_ne!(cursor.node().grammar_id(), cursor.node().kind_id()); - - let expected_symbols = ["//", "/*", "identifier", "line_comment", "block_comment"]; - let mut lookahead = language.lookahead_iterator(next_state).unwrap(); - assert_eq!(*lookahead.language(), language); - assert!(lookahead.iter_names().eq(expected_symbols)); - - lookahead.reset_state(next_state); - assert!(lookahead.iter_names().eq(expected_symbols)); - - lookahead.reset(&language, next_state); - assert!(lookahead - .map(|s| language.node_kind_for_id(s).unwrap()) - .eq(expected_symbols)); -} - -#[test] -fn test_lookahead_iterator_modifiable_only_by_mut() { - let mut parser = Parser::new(); - let language = get_language("rust"); - parser.set_language(&language).unwrap(); - - let tree = parser.parse("struct Stuff {}", None).unwrap(); - - let mut cursor = tree.walk(); - - assert!(cursor.goto_first_child()); // struct - assert!(cursor.goto_first_child()); // struct keyword - - let next_state = cursor.node().next_parse_state(); - assert_ne!(next_state, 0); - - let mut lookahead = language.lookahead_iterator(next_state).unwrap(); - let _ = lookahead.next(); - - let mut names = lookahead.iter_names(); - let _ = names.next(); -} - -#[test] -fn test_symbol_metadata_checks() { - let language = get_language("rust"); - for i in 0..language.node_kind_count() { - let sym = i as u16; - let name = language.node_kind_for_id(sym).unwrap(); - match name { - "_type" - | "_expression" - | "_pattern" - | "_literal" - | "_literal_pattern" - | "_declaration_statement" => assert!(language.node_kind_is_supertype(sym)), - - "_raw_string_literal_start" - | "_raw_string_literal_end" - | "_line_doc_comment" - | "_error_sentinel" => assert!(!language.node_kind_is_supertype(sym)), - - "enum_item" | "struct_item" | "type_item" => { - assert!(language.node_kind_is_named(sym)); - } - - "=>" | "[" | "]" | "(" | ")" | "{" | "}" => { - assert!(language.node_kind_is_visible(sym)); - } - - _ => {} - } - } -} - -#[test] -fn test_supertypes() { - let language = get_language("rust"); - let supertypes = language.supertypes(); - - if language.abi_version() < 15 { - return; - } - - assert_eq!(supertypes.len(), 5); - assert_eq!( - supertypes - .iter() - .filter_map(|&s| language.node_kind_for_id(s)) - .map(|s| s.to_string()) - .collect::>(), - vec![ - "_expression", - "_literal", - "_literal_pattern", - "_pattern", - "_type" - ] - ); - - for &supertype in supertypes { - let mut subtypes = language - .subtypes_for_supertype(supertype) - .iter() - .filter_map(|symbol| language.node_kind_for_id(*symbol)) - .collect::>(); - subtypes.sort_unstable(); - subtypes.dedup(); - - match language.node_kind_for_id(supertype) { - Some("_literal") => { - assert_eq!( - subtypes, - &[ - "boolean_literal", - "char_literal", - "float_literal", - "integer_literal", - "raw_string_literal", - "string_literal" - ] - ); - } - Some("_pattern") => { - assert_eq!( - subtypes, - &[ - "_", - "_literal_pattern", - "captured_pattern", - "const_block", - "generic_pattern", - "identifier", - "macro_invocation", - "mut_pattern", - "or_pattern", - "range_pattern", - "ref_pattern", - "reference_pattern", - "remaining_field_pattern", - "scoped_identifier", - "slice_pattern", - "struct_pattern", - "tuple_pattern", - "tuple_struct_pattern", - ] - ); - } - Some("_type") => { - assert_eq!( - subtypes, - &[ - "abstract_type", - "array_type", - "bounded_type", - "dynamic_type", - "function_type", - "generic_type", - "macro_invocation", - "metavariable", - "never_type", - "pointer_type", - "primitive_type", - "reference_type", - "removed_trait_bound", - "scoped_type_identifier", - "tuple_type", - "type_identifier", - "unit_type" - ] - ); - } - _ => {} - } - } -} diff --git a/crates/cli/src/version.rs b/crates/cli/src/version.rs deleted file mode 100644 index 757306c7..00000000 --- a/crates/cli/src/version.rs +++ /dev/null @@ -1,396 +0,0 @@ -use std::{fs, path::PathBuf, process::Command}; - -use clap::ValueEnum; -use log::{info, warn}; -use regex::Regex; -use semver::Version as SemverVersion; -use std::cmp::Ordering; -use tree_sitter_loader::TreeSitterJSON; - -#[derive(Clone, Copy, Default, ValueEnum)] -pub enum BumpLevel { - #[default] - Patch, - Minor, - Major, -} - -pub struct Version { - pub version: Option, - pub current_dir: PathBuf, - pub bump: Option, -} - -#[derive(thiserror::Error, Debug)] -pub enum VersionError { - #[error(transparent)] - Json(#[from] serde_json::Error), - #[error(transparent)] - Io(#[from] std::io::Error), - #[error("Failed to update one or more files:\n\n{0}")] - Update(UpdateErrors), -} - -#[derive(thiserror::Error, Debug)] -pub struct UpdateErrors(Vec); - -impl std::fmt::Display for UpdateErrors { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - for error in &self.0 { - writeln!(f, "{error}\n")?; - } - Ok(()) - } -} - -#[derive(thiserror::Error, Debug)] -pub enum UpdateError { - #[error("Failed to update {1}:\n{0}")] - Io(std::io::Error, PathBuf), - #[error("Failed to run `{0}`:\n{1}")] - Command(&'static str, String), -} - -impl Version { - #[must_use] - pub const fn new( - version: Option, - current_dir: PathBuf, - bump: Option, - ) -> Self { - Self { - version, - current_dir, - bump, - } - } - - pub fn run(mut self) -> Result<(), VersionError> { - let tree_sitter_json = self.current_dir.join("tree-sitter.json"); - - let tree_sitter_json = - serde_json::from_str::(&fs::read_to_string(tree_sitter_json)?)?; - - let current_version = tree_sitter_json.metadata.version; - self.version = match (self.version.is_some(), self.bump) { - (false, None) => { - info!("Current version: {current_version}"); - return Ok(()); - } - (true, None) => self.version, - (false, Some(bump)) => { - let mut v = current_version.clone(); - match bump { - BumpLevel::Patch => v.patch += 1, - BumpLevel::Minor => { - v.minor += 1; - v.patch = 0; - } - BumpLevel::Major => { - v.major += 1; - v.minor = 0; - v.patch = 0; - } - } - Some(v) - } - (true, Some(_)) => unreachable!(), - }; - - let new_version = self.version.as_ref().unwrap(); - match new_version.cmp(¤t_version) { - Ordering::Less => { - warn!("New version is lower than current!"); - warn!("Reverting version {current_version} to {new_version}"); - } - Ordering::Greater => { - info!("Bumping version {current_version} to {new_version}"); - } - Ordering::Equal => { - info!("Keeping version {current_version}"); - } - } - - let is_multigrammar = tree_sitter_json.grammars.len() > 1; - - let mut errors = Vec::new(); - - // Helper to push errors into the errors vector, returns true if an error was pushed - let mut push_err = |result: Result<(), UpdateError>| -> bool { - if let Err(e) = result { - errors.push(e); - return true; - } - false - }; - - push_err(self.update_treesitter_json()); - - // Only update Cargo.lock if Cargo.toml was updated - push_err(self.update_cargo_toml()).then(|| push_err(self.update_cargo_lock())); - - // Only update package-lock.json if package.json was updated - push_err(self.update_package_json()).then(|| push_err(self.update_package_lock_json())); - - push_err(self.update_makefile(is_multigrammar)); - push_err(self.update_cmakelists_txt()); - push_err(self.update_pyproject_toml()); - push_err(self.update_zig_zon()); - - if errors.is_empty() { - Ok(()) - } else { - Err(VersionError::Update(UpdateErrors(errors))) - } - } - - fn update_file_with(&self, path: &PathBuf, update_fn: F) -> Result<(), UpdateError> - where - F: Fn(&str) -> String, - { - let content = fs::read_to_string(path).map_err(|e| UpdateError::Io(e, path.clone()))?; - let updated_content = update_fn(&content); - fs::write(path, updated_content).map_err(|e| UpdateError::Io(e, path.clone())) - } - - fn update_treesitter_json(&self) -> Result<(), UpdateError> { - let json_path = self.current_dir.join("tree-sitter.json"); - self.update_file_with(&json_path, |content| { - content - .lines() - .map(|line| { - if line.contains("\"version\":") { - let prefix_index = - line.find("\"version\":").unwrap() + "\"version\":".len(); - let start_quote = - line[prefix_index..].find('"').unwrap() + prefix_index + 1; - let end_quote = - line[start_quote + 1..].find('"').unwrap() + start_quote + 1; - - format!( - "{}{}{}", - &line[..start_quote], - self.version.as_ref().unwrap(), - &line[end_quote..] - ) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n" - }) - } - - fn update_cargo_toml(&self) -> Result<(), UpdateError> { - let cargo_toml_path = self.current_dir.join("Cargo.toml"); - if !cargo_toml_path.exists() { - return Ok(()); - } - - self.update_file_with(&cargo_toml_path, |content| { - content - .lines() - .map(|line| { - if line.starts_with("version =") { - format!("version = \"{}\"", self.version.as_ref().unwrap()) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n" - })?; - - Ok(()) - } - - fn update_cargo_lock(&self) -> Result<(), UpdateError> { - if self.current_dir.join("Cargo.lock").exists() { - let Ok(cmd) = Command::new("cargo") - .arg("generate-lockfile") - .arg("--offline") - .current_dir(&self.current_dir) - .output() - else { - return Ok(()); // cargo is not `executable`, ignore - }; - - if !cmd.status.success() { - let stderr = String::from_utf8_lossy(&cmd.stderr); - return Err(UpdateError::Command( - "cargo generate-lockfile", - stderr.to_string(), - )); - } - } - - Ok(()) - } - - fn update_package_json(&self) -> Result<(), UpdateError> { - let package_json_path = self.current_dir.join("package.json"); - if !package_json_path.exists() { - return Ok(()); - } - - self.update_file_with(&package_json_path, |content| { - content - .lines() - .map(|line| { - if line.contains("\"version\":") { - let prefix_index = - line.find("\"version\":").unwrap() + "\"version\":".len(); - let start_quote = - line[prefix_index..].find('"').unwrap() + prefix_index + 1; - let end_quote = - line[start_quote + 1..].find('"').unwrap() + start_quote + 1; - - format!( - "{}{}{}", - &line[..start_quote], - self.version.as_ref().unwrap(), - &line[end_quote..] - ) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n" - })?; - - Ok(()) - } - - fn update_package_lock_json(&self) -> Result<(), UpdateError> { - if self.current_dir.join("package-lock.json").exists() { - let Ok(cmd) = Command::new("npm") - .arg("install") - .arg("--package-lock-only") - .current_dir(&self.current_dir) - .output() - else { - return Ok(()); // npm is not `executable`, ignore - }; - - if !cmd.status.success() { - let stderr = String::from_utf8_lossy(&cmd.stderr); - return Err(UpdateError::Command("npm install", stderr.to_string())); - } - } - - Ok(()) - } - - fn update_makefile(&self, is_multigrammar: bool) -> Result<(), UpdateError> { - let makefile_path = if is_multigrammar { - self.current_dir.join("common").join("common.mak") - } else { - self.current_dir.join("Makefile") - }; - - self.update_file_with(&makefile_path, |content| { - content - .lines() - .map(|line| { - if line.starts_with("VERSION") { - format!("VERSION := {}", self.version.as_ref().unwrap()) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n" - })?; - - Ok(()) - } - - fn update_cmakelists_txt(&self) -> Result<(), UpdateError> { - let cmake_lists_path = self.current_dir.join("CMakeLists.txt"); - if !cmake_lists_path.exists() { - return Ok(()); - } - - self.update_file_with(&cmake_lists_path, |content| { - let re = Regex::new(r#"(\s*VERSION\s+)"[0-9]+\.[0-9]+\.[0-9]+""#) - .expect("Failed to compile regex"); - re.replace( - content, - format!(r#"$1"{}""#, self.version.as_ref().unwrap()), - ) - .to_string() - })?; - - Ok(()) - } - - fn update_pyproject_toml(&self) -> Result<(), UpdateError> { - let pyproject_toml_path = self.current_dir.join("pyproject.toml"); - if !pyproject_toml_path.exists() { - return Ok(()); - } - - self.update_file_with(&pyproject_toml_path, |content| { - content - .lines() - .map(|line| { - if line.starts_with("version =") { - format!("version = \"{}\"", self.version.as_ref().unwrap()) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n" - })?; - - Ok(()) - } - - fn update_zig_zon(&self) -> Result<(), UpdateError> { - let zig_zon_path = self.current_dir.join("build.zig.zon"); - if !zig_zon_path.exists() { - return Ok(()); - } - - self.update_file_with(&zig_zon_path, |content| { - let zig_version_prefix = ".version ="; - content - .lines() - .map(|line| { - if line - .trim_start_matches(|c: char| c.is_ascii_whitespace()) - .starts_with(zig_version_prefix) - { - let prefix_index = - line.find(zig_version_prefix).unwrap() + zig_version_prefix.len(); - let start_quote = - line[prefix_index..].find('"').unwrap() + prefix_index + 1; - let end_quote = - line[start_quote + 1..].find('"').unwrap() + start_quote + 1; - - format!( - "{}{}{}", - &line[..start_quote], - self.version.as_ref().unwrap(), - &line[end_quote..] - ) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n" - })?; - - Ok(()) - } -} diff --git a/crates/config/LICENSE b/crates/config/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/config/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml deleted file mode 100644 index e55be890..00000000 --- a/crates/generate/Cargo.toml +++ /dev/null @@ -1,51 +0,0 @@ -[package] -name = "tree-sitter-generate" -version.workspace = true -description = "Library for generating C source code from a tree-sitter grammar" -authors.workspace = true -edition.workspace = true -rust-version.workspace = true -readme = "README.md" -homepage.workspace = true -repository.workspace = true -documentation = "https://docs.rs/tree-sitter-generate" -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lib] -path = "src/generate.rs" - -[lints] -workspace = true - -[features] -default = ["qjs-rt"] -load = ["dep:semver"] -qjs-rt = ["load", "rquickjs", "pathdiff"] - -[dependencies] -bitflags = "2.9.4" -dunce = "1.0.5" -indexmap.workspace = true -indoc.workspace = true -log.workspace = true -pathdiff = { version = "0.2.3", optional = true } -regex.workspace = true -regex-syntax.workspace = true -rquickjs = { version = "0.11.0", optional = true, features = [ - "bindgen", - "loader", - "macro", - "phf", -] } -rustc-hash.workspace = true -semver = { workspace = true, optional = true } -serde.workspace = true -serde_json.workspace = true -smallbitvec.workspace = true -thiserror.workspace = true -topological-sort.workspace = true - -[dev-dependencies] -tempfile.workspace = true diff --git a/crates/generate/LICENSE b/crates/generate/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/generate/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/generate/README.md b/crates/generate/README.md deleted file mode 100644 index 04a18900..00000000 --- a/crates/generate/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Tree-sitter Generate - -This helper crate implements the logic for the `tree-sitter generate` command, -and can be used by external tools to generate a parser from a grammar file. diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs deleted file mode 100644 index 6a005637..00000000 --- a/crates/generate/src/generate.rs +++ /dev/null @@ -1,621 +0,0 @@ -use std::{collections::BTreeMap, sync::LazyLock}; -#[cfg(feature = "load")] -use std::{ - env, fs, - io::Write, - path::{Path, PathBuf}, - process::{Command, Stdio}, -}; - -use bitflags::bitflags; -use log::warn; -use node_types::VariableInfo; -use regex::{Regex, RegexBuilder}; -use rules::{Alias, Symbol}; -#[cfg(feature = "load")] -use semver::Version; -#[cfg(feature = "load")] -use serde::Deserialize; -use serde::Serialize; -use thiserror::Error; - -mod build_tables; -mod dedup; -mod grammars; -mod nfa; -mod node_types; -pub mod parse_grammar; -mod prepare_grammar; -#[cfg(feature = "qjs-rt")] -mod quickjs; -mod render; -mod rules; -mod tables; - -use build_tables::build_tables; -pub use build_tables::ParseTableBuilderError; -use grammars::{InlinedProductionMap, InputGrammar, LexicalGrammar, SyntaxGrammar}; -pub use node_types::{SuperTypeCycleError, VariableInfoError}; -use parse_grammar::parse_grammar; -pub use parse_grammar::ParseGrammarError; -use prepare_grammar::prepare_grammar; -pub use prepare_grammar::PrepareGrammarError; -use render::render_c_code; -pub use render::{ABI_VERSION_MAX, ABI_VERSION_MIN}; - -static JSON_COMMENT_REGEX: LazyLock = LazyLock::new(|| { - RegexBuilder::new("^\\s*//.*") - .multi_line(true) - .build() - .unwrap() -}); - -struct JSONOutput { - #[cfg(feature = "load")] - node_types_json: String, - syntax_grammar: SyntaxGrammar, - lexical_grammar: LexicalGrammar, - inlines: InlinedProductionMap, - simple_aliases: BTreeMap, - variable_info: Vec, -} - -struct GeneratedParser { - c_code: String, - #[cfg(feature = "load")] - node_types_json: String, -} - -// NOTE: This constant must be kept in sync with the definition of -// `TREE_SITTER_LANGUAGE_VERSION` in `lib/include/tree_sitter/api.h`. -const LANGUAGE_VERSION: usize = 15; - -pub const ALLOC_HEADER: &str = include_str!("templates/alloc.h"); -pub const ARRAY_HEADER: &str = include_str!("templates/array.h"); -pub const PARSER_HEADER: &str = include_str!("parser.h.inc"); - -pub type GenerateResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum GenerateError { - #[error("Error with specified path -- {0}")] - GrammarPath(String), - #[error(transparent)] - IO(IoError), - #[cfg(feature = "load")] - #[error(transparent)] - LoadGrammarFile(#[from] LoadGrammarError), - #[error(transparent)] - ParseGrammar(#[from] ParseGrammarError), - #[error(transparent)] - Prepare(#[from] PrepareGrammarError), - #[error(transparent)] - VariableInfo(#[from] VariableInfoError), - #[error(transparent)] - BuildTables(#[from] ParseTableBuilderError), - #[cfg(feature = "load")] - #[error(transparent)] - ParseVersion(#[from] ParseVersionError), - #[error(transparent)] - SuperTypeCycle(#[from] SuperTypeCycleError), -} - -#[derive(Debug, Error, Serialize)] -pub struct IoError { - pub error: String, - pub path: Option, -} - -impl IoError { - fn new(error: &std::io::Error, path: Option<&Path>) -> Self { - Self { - error: error.to_string(), - path: path.map(|p| p.to_string_lossy().to_string()), - } - } -} - -impl std::fmt::Display for IoError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.error)?; - if let Some(ref path) = self.path { - write!(f, " ({path})")?; - } - Ok(()) - } -} - -#[cfg(feature = "load")] -pub type LoadGrammarFileResult = Result; - -#[cfg(feature = "load")] -#[derive(Debug, Error, Serialize)] -pub enum LoadGrammarError { - #[error("Path to a grammar file with `.js` or `.json` extension is required")] - InvalidPath, - #[error("Failed to load grammar.js -- {0}")] - LoadJSGrammarFile(#[from] JSError), - #[error("Failed to load grammar.json -- {0}")] - IO(IoError), - #[error("Unknown grammar file extension: {0:?}")] - FileExtension(PathBuf), -} - -#[cfg(feature = "load")] -#[derive(Debug, Error, Serialize)] -pub enum ParseVersionError { - #[error("{0}")] - Version(String), - #[error("{0}")] - JSON(String), - #[error(transparent)] - IO(IoError), -} - -#[cfg(feature = "load")] -pub type JSResult = Result; - -#[cfg(feature = "load")] -#[derive(Debug, Error, Serialize)] -pub enum JSError { - #[error("Failed to run `{runtime}` -- {error}")] - JSRuntimeSpawn { runtime: String, error: String }, - #[error("Got invalid UTF8 from `{runtime}` -- {error}")] - JSRuntimeUtf8 { runtime: String, error: String }, - #[error("`{runtime}` process exited with status {code}")] - JSRuntimeExit { runtime: String, code: i32 }, - #[error("Failed to open stdin for `{runtime}`")] - JSRuntimeStdin { runtime: String }, - #[error("Failed to write {item} to `{runtime}`'s stdin -- {error}")] - JSRuntimeWrite { - runtime: String, - item: String, - error: String, - }, - #[error("Failed to read output from `{runtime}` -- {error}")] - JSRuntimeRead { runtime: String, error: String }, - #[error(transparent)] - IO(IoError), - #[cfg(feature = "qjs-rt")] - #[error("Failed to get relative path")] - RelativePath, - #[error("Could not parse this package's version as semver -- {0}")] - Semver(String), - #[error("Failed to serialze grammar JSON -- {0}")] - Serialzation(String), - #[cfg(feature = "qjs-rt")] - #[error("QuickJS error: {0}")] - QuickJS(String), -} - -#[cfg(feature = "load")] -impl From for JSError { - fn from(value: serde_json::Error) -> Self { - Self::Serialzation(value.to_string()) - } -} - -#[cfg(feature = "load")] -impl From for JSError { - fn from(value: semver::Error) -> Self { - Self::Semver(value.to_string()) - } -} - -#[cfg(feature = "qjs-rt")] -impl From for JSError { - fn from(value: rquickjs::Error) -> Self { - Self::QuickJS(value.to_string()) - } -} - -bitflags! { - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] - pub struct OptLevel: u32 { - const MergeStates = 1 << 0; - } -} - -impl Default for OptLevel { - fn default() -> Self { - Self::MergeStates - } -} - -#[cfg(feature = "load")] -#[allow(clippy::too_many_arguments)] -pub fn generate_parser_in_directory( - repo_path: T, - out_path: Option, - grammar_path: Option, - mut abi_version: usize, - report_symbol_name: Option<&str>, - js_runtime: Option<&str>, - generate_parser: bool, - optimizations: OptLevel, -) -> GenerateResult<()> -where - T: Into, - U: Into, - V: Into, -{ - let mut repo_path: PathBuf = repo_path.into(); - - // Populate a new empty grammar directory. - let grammar_path = if let Some(path) = grammar_path { - let path_buf: PathBuf = path.into(); - if !path_buf - .try_exists() - .map_err(|e| GenerateError::GrammarPath(e.to_string()))? - { - fs::create_dir_all(&path_buf) - .map_err(|e| GenerateError::IO(IoError::new(&e, Some(path_buf.as_path()))))?; - repo_path = path_buf; - repo_path.join("grammar.js") - } else { - path_buf - } - } else { - repo_path.join("grammar.js") - }; - - // Read the grammar file. - let grammar_json = load_grammar_file(&grammar_path, js_runtime)?; - - let src_path = out_path.map_or_else(|| repo_path.join("src"), |p| p.into()); - let header_path = src_path.join("tree_sitter"); - - // Ensure that the output directory exists - fs::create_dir_all(&src_path) - .map_err(|e| GenerateError::IO(IoError::new(&e, Some(src_path.as_path()))))?; - - if grammar_path.file_name().unwrap() != "grammar.json" { - fs::write(src_path.join("grammar.json"), &grammar_json) - .map_err(|e| GenerateError::IO(IoError::new(&e, Some(src_path.as_path()))))?; - } - - // If our job is only to generate `grammar.json` and not `parser.c`, stop here. - let input_grammar = parse_grammar(&grammar_json)?; - - if !generate_parser { - let node_types_json = generate_node_types_from_grammar(&input_grammar)?.node_types_json; - write_file(&src_path.join("node-types.json"), node_types_json)?; - return Ok(()); - } - - let semantic_version = read_grammar_version(&repo_path)?; - - if semantic_version.is_none() && abi_version > ABI_VERSION_MIN { - warn!( - concat!( - "No `tree-sitter.json` file found in your grammar, ", - "this file is required to generate with ABI {}. ", - "Using ABI version {} instead.\n", - "This file can be set up with `tree-sitter init`. ", - "For more information, see https://tree-sitter.github.io/tree-sitter/cli/init." - ), - abi_version, ABI_VERSION_MIN - ); - abi_version = ABI_VERSION_MIN; - } - - // Generate the parser and related files. - let GeneratedParser { - c_code, - node_types_json, - } = generate_parser_for_grammar_with_opts( - &input_grammar, - abi_version, - semantic_version.map(|v| (v.major as u8, v.minor as u8, v.patch as u8)), - report_symbol_name, - optimizations, - )?; - - write_file(&src_path.join("parser.c"), c_code)?; - write_file(&src_path.join("node-types.json"), node_types_json)?; - fs::create_dir_all(&header_path) - .map_err(|e| GenerateError::IO(IoError::new(&e, Some(header_path.as_path()))))?; - write_file(&header_path.join("alloc.h"), ALLOC_HEADER)?; - write_file(&header_path.join("array.h"), ARRAY_HEADER)?; - write_file(&header_path.join("parser.h"), PARSER_HEADER)?; - - Ok(()) -} - -pub fn generate_parser_for_grammar( - grammar_json: &str, - semantic_version: Option<(u8, u8, u8)>, -) -> GenerateResult<(String, String)> { - let grammar_json = JSON_COMMENT_REGEX.replace_all(grammar_json, "\n"); - let input_grammar = parse_grammar(&grammar_json)?; - let parser = generate_parser_for_grammar_with_opts( - &input_grammar, - LANGUAGE_VERSION, - semantic_version, - None, - OptLevel::empty(), - )?; - Ok((input_grammar.name, parser.c_code)) -} - -fn generate_node_types_from_grammar(input_grammar: &InputGrammar) -> GenerateResult { - let (syntax_grammar, lexical_grammar, inlines, simple_aliases) = - prepare_grammar(input_grammar)?; - let variable_info = - node_types::get_variable_info(&syntax_grammar, &lexical_grammar, &simple_aliases)?; - - #[cfg(feature = "load")] - let node_types_json = node_types::generate_node_types_json( - &syntax_grammar, - &lexical_grammar, - &simple_aliases, - &variable_info, - )?; - Ok(JSONOutput { - #[cfg(feature = "load")] - node_types_json: serde_json::to_string_pretty(&node_types_json).unwrap(), - syntax_grammar, - lexical_grammar, - inlines, - simple_aliases, - variable_info, - }) -} - -fn generate_parser_for_grammar_with_opts( - input_grammar: &InputGrammar, - abi_version: usize, - semantic_version: Option<(u8, u8, u8)>, - report_symbol_name: Option<&str>, - optimizations: OptLevel, -) -> GenerateResult { - let JSONOutput { - syntax_grammar, - lexical_grammar, - inlines, - simple_aliases, - variable_info, - #[cfg(feature = "load")] - node_types_json, - } = generate_node_types_from_grammar(input_grammar)?; - let supertype_symbol_map = - node_types::get_supertype_symbol_map(&syntax_grammar, &simple_aliases, &variable_info); - let tables = build_tables( - &syntax_grammar, - &lexical_grammar, - &simple_aliases, - &variable_info, - &inlines, - report_symbol_name, - optimizations, - )?; - let c_code = render_c_code( - &input_grammar.name, - tables, - syntax_grammar, - lexical_grammar, - simple_aliases, - abi_version, - semantic_version, - supertype_symbol_map, - ); - Ok(GeneratedParser { - c_code, - #[cfg(feature = "load")] - node_types_json, - }) -} - -/// This will read the `tree-sitter.json` config file and attempt to extract the version. -/// -/// If the file is not found in the current directory or any of its parent directories, this will -/// return `None` to maintain backwards compatibility. If the file is found but the version cannot -/// be parsed as semver, this will return an error. -#[cfg(feature = "load")] -fn read_grammar_version(repo_path: &Path) -> Result, ParseVersionError> { - #[derive(Deserialize)] - struct TreeSitterJson { - metadata: Metadata, - } - - #[derive(Deserialize)] - struct Metadata { - version: String, - } - - let filename = "tree-sitter.json"; - let mut path = repo_path.join(filename); - - loop { - let json = path - .exists() - .then(|| { - let contents = fs::read_to_string(path.as_path()) - .map_err(|e| ParseVersionError::IO(IoError::new(&e, Some(path.as_path()))))?; - serde_json::from_str::(&contents).map_err(|e| { - ParseVersionError::JSON(format!("Failed to parse `{}` -- {e}", path.display())) - }) - }) - .transpose()?; - if let Some(json) = json { - return Version::parse(&json.metadata.version) - .map_err(|e| { - ParseVersionError::Version(format!( - "Failed to parse `{}` version as semver -- {e}", - path.display() - )) - }) - .map(Some); - } - path.pop(); // filename - if !path.pop() { - return Ok(None); - } - path.push(filename); - } -} - -#[cfg(feature = "load")] -pub fn load_grammar_file( - grammar_path: &Path, - js_runtime: Option<&str>, -) -> LoadGrammarFileResult { - if grammar_path.is_dir() { - Err(LoadGrammarError::InvalidPath)?; - } - match grammar_path.extension().and_then(|e| e.to_str()) { - Some("js") => Ok(load_js_grammar_file(grammar_path, js_runtime)?), - Some("json") => Ok(fs::read_to_string(grammar_path) - .map_err(|e| LoadGrammarError::IO(IoError::new(&e, Some(grammar_path))))?), - _ => Err(LoadGrammarError::FileExtension(grammar_path.to_owned()))?, - } -} - -#[cfg(feature = "load")] -fn load_js_grammar_file(grammar_path: &Path, js_runtime: Option<&str>) -> JSResult { - let grammar_path = dunce::canonicalize(grammar_path) - .map_err(|e| JSError::IO(IoError::new(&e, Some(grammar_path))))?; - - #[cfg(feature = "qjs-rt")] - if js_runtime == Some("native") { - return quickjs::execute_native_runtime(&grammar_path); - } - - // The "file:///" prefix is incompatible with the quickjs runtime, but is required - // for node and bun - #[cfg(windows)] - let grammar_path = PathBuf::from(format!("file:///{}", grammar_path.display())); - - let js_runtime = js_runtime.unwrap_or("node"); - - let mut js_command = Command::new(js_runtime); - match js_runtime { - "node" => { - js_command.args(["--input-type=module", "-"]); - } - "bun" => { - js_command.arg("-"); - } - "deno" => { - js_command.args(["run", "--allow-all", "-"]); - } - _ => {} - } - - let mut js_process = js_command - .env("TREE_SITTER_GRAMMAR_PATH", grammar_path) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - .map_err(|e| JSError::JSRuntimeSpawn { - runtime: js_runtime.to_string(), - error: e.to_string(), - })?; - - let mut js_stdin = js_process - .stdin - .take() - .ok_or_else(|| JSError::JSRuntimeStdin { - runtime: js_runtime.to_string(), - })?; - - let cli_version = Version::parse(env!("CARGO_PKG_VERSION"))?; - write!( - js_stdin, - "globalThis.TREE_SITTER_CLI_VERSION_MAJOR = {}; - globalThis.TREE_SITTER_CLI_VERSION_MINOR = {}; - globalThis.TREE_SITTER_CLI_VERSION_PATCH = {};", - cli_version.major, cli_version.minor, cli_version.patch, - ) - .map_err(|e| JSError::JSRuntimeWrite { - runtime: js_runtime.to_string(), - item: "tree-sitter version".to_string(), - error: e.to_string(), - })?; - js_stdin - .write(include_bytes!("./dsl.js")) - .map_err(|e| JSError::JSRuntimeWrite { - runtime: js_runtime.to_string(), - item: "grammar dsl".to_string(), - error: e.to_string(), - })?; - drop(js_stdin); - - let output = js_process - .wait_with_output() - .map_err(|e| JSError::JSRuntimeRead { - runtime: js_runtime.to_string(), - error: e.to_string(), - })?; - match output.status.code() { - Some(0) => { - let stdout = String::from_utf8(output.stdout).map_err(|e| JSError::JSRuntimeUtf8 { - runtime: js_runtime.to_string(), - error: e.to_string(), - })?; - - let mut grammar_json = &stdout[..]; - - if let Some(pos) = stdout.rfind('\n') { - // If there's a newline, split the last line from the rest of the output - let node_output = &stdout[..pos]; - grammar_json = &stdout[pos + 1..]; - - let mut stdout = std::io::stdout().lock(); - stdout - .write_all(node_output.as_bytes()) - .map_err(|e| JSError::IO(IoError::new(&e, None)))?; - stdout - .write_all(b"\n") - .map_err(|e| JSError::IO(IoError::new(&e, None)))?; - stdout - .flush() - .map_err(|e| JSError::IO(IoError::new(&e, None)))?; - } - - Ok(serde_json::to_string_pretty(&serde_json::from_str::< - serde_json::Value, - >(grammar_json)?)?) - } - Some(code) => Err(JSError::JSRuntimeExit { - runtime: js_runtime.to_string(), - code, - }), - None => Err(JSError::JSRuntimeExit { - runtime: js_runtime.to_string(), - code: -1, - }), - } -} - -#[cfg(feature = "load")] -pub fn write_file(path: &Path, body: impl AsRef<[u8]>) -> GenerateResult<()> { - fs::write(path, body).map_err(|e| GenerateError::IO(IoError::new(&e, Some(path)))) -} - -#[cfg(test)] -mod tests { - use super::{LANGUAGE_VERSION, PARSER_HEADER}; - #[test] - fn test_language_versions_are_in_sync() { - let api_h = include_str!("../../../lib/include/tree_sitter/api.h"); - let api_language_version = api_h - .lines() - .find_map(|line| { - line.trim() - .strip_prefix("#define TREE_SITTER_LANGUAGE_VERSION ") - .and_then(|v| v.parse::().ok()) - }) - .expect("Failed to find TREE_SITTER_LANGUAGE_VERSION definition in api.h"); - assert_eq!(LANGUAGE_VERSION, api_language_version); - } - - #[test] - fn test_parser_header_in_sync() { - let parser_h = include_str!("../../../lib/src/parser.h"); - assert!( - parser_h == PARSER_HEADER, - "parser.h.inc is out of sync with lib/src/parser.h. Run: cp lib/src/parser.h crates/generate/src/parser.h.inc" - ); - } -} diff --git a/crates/generate/src/parse_grammar.rs b/crates/generate/src/parse_grammar.rs deleted file mode 100644 index de8f0a97..00000000 --- a/crates/generate/src/parse_grammar.rs +++ /dev/null @@ -1,460 +0,0 @@ -use std::collections::HashSet; - -use log::warn; -use regex::Regex; -use serde::{Deserialize, Serialize}; -use serde_json::{Map, Value}; -use thiserror::Error; - -use crate::{ - grammars::{InputGrammar, PrecedenceEntry, ReservedWordContext, Variable, VariableType}, - rules::{Precedence, Rule}, -}; - -#[derive(Deserialize)] -#[serde(tag = "type")] -#[allow(non_camel_case_types)] -#[allow(clippy::upper_case_acronyms)] -enum RuleJSON { - ALIAS { - content: Box, - named: bool, - value: String, - }, - BLANK, - STRING { - value: String, - }, - PATTERN { - value: String, - flags: Option, - }, - SYMBOL { - name: String, - }, - CHOICE { - members: Vec, - }, - FIELD { - name: String, - content: Box, - }, - SEQ { - members: Vec, - }, - REPEAT { - content: Box, - }, - REPEAT1 { - content: Box, - }, - PREC_DYNAMIC { - value: i32, - content: Box, - }, - PREC_LEFT { - value: PrecedenceValueJSON, - content: Box, - }, - PREC_RIGHT { - value: PrecedenceValueJSON, - content: Box, - }, - PREC { - value: PrecedenceValueJSON, - content: Box, - }, - TOKEN { - content: Box, - }, - IMMEDIATE_TOKEN { - content: Box, - }, - RESERVED { - context_name: String, - content: Box, - }, -} - -#[derive(Deserialize)] -#[serde(untagged)] -enum PrecedenceValueJSON { - Integer(i32), - Name(String), -} - -#[derive(Deserialize)] -pub struct GrammarJSON { - pub name: String, - rules: Map, - #[serde(default)] - precedences: Vec>, - #[serde(default)] - conflicts: Vec>, - #[serde(default)] - externals: Vec, - #[serde(default)] - extras: Vec, - #[serde(default)] - inline: Vec, - #[serde(default)] - supertypes: Vec, - #[serde(default)] - word: Option, - #[serde(default)] - reserved: Map, -} - -pub type ParseGrammarResult = Result; - -#[derive(Debug, Error, Serialize)] -pub enum ParseGrammarError { - #[error("{0}")] - Serialization(String), - #[error("Rules in the `extras` array must not contain empty strings")] - InvalidExtra, - #[error("Invalid rule in precedences array. Only strings and symbols are allowed")] - Unexpected, - #[error("Reserved word sets must be arrays")] - InvalidReservedWordSet, - #[error("Grammar Error: Unexpected rule `{0}` in `token()` call")] - UnexpectedRule(String), -} - -impl From for ParseGrammarError { - fn from(value: serde_json::Error) -> Self { - Self::Serialization(value.to_string()) - } -} - -/// Check if a rule is referenced by another rule. -/// -/// This function is used to determine if a variable is used in a given rule, -/// and `is_other` indicates if the rule is an external, and if it is, -/// to not assume that a named symbol that is equal to itself means it's being referenced. -/// -/// For example, if we have an external rule **and** a normal rule both called `foo`, -/// `foo` should not be thought of as directly used unless it's used within another rule. -fn rule_is_referenced(rule: &Rule, target: &str, is_external: bool) -> bool { - match rule { - Rule::NamedSymbol(name) => name == target && !is_external, - Rule::Choice(rules) | Rule::Seq(rules) => { - rules.iter().any(|r| rule_is_referenced(r, target, false)) - } - Rule::Metadata { rule, .. } | Rule::Reserved { rule, .. } => { - rule_is_referenced(rule, target, is_external) - } - Rule::Repeat(inner) => rule_is_referenced(inner, target, false), - Rule::Blank | Rule::String(_) | Rule::Pattern(_, _) | Rule::Symbol(_) => false, - } -} - -fn variable_is_used( - grammar_rules: &[(String, Rule)], - extras: &[Rule], - externals: &[Rule], - target_name: &str, - in_progress: &mut HashSet, -) -> bool { - let root = &grammar_rules.first().unwrap().0; - if target_name == root { - return true; - } - - if extras - .iter() - .any(|rule| rule_is_referenced(rule, target_name, false)) - { - return true; - } - - if externals - .iter() - .any(|rule| rule_is_referenced(rule, target_name, true)) - { - return true; - } - - in_progress.insert(target_name.to_string()); - let result = grammar_rules - .iter() - .filter(|(key, _)| *key != target_name) - .any(|(name, rule)| { - if !rule_is_referenced(rule, target_name, false) || in_progress.contains(name) { - return false; - } - variable_is_used(grammar_rules, extras, externals, name, in_progress) - }); - in_progress.remove(target_name); - - result -} - -pub(crate) fn parse_grammar(input: &str) -> ParseGrammarResult { - let mut grammar_json = serde_json::from_str::(input)?; - - let mut extra_symbols = - grammar_json - .extras - .into_iter() - .try_fold(Vec::::new(), |mut acc, item| { - let rule = parse_rule(item, false)?; - if let Rule::String(ref value) = rule { - if value.is_empty() { - Err(ParseGrammarError::InvalidExtra)?; - } - } - acc.push(rule); - ParseGrammarResult::Ok(acc) - })?; - - let mut external_tokens = grammar_json - .externals - .into_iter() - .map(|e| parse_rule(e, false)) - .collect::>>()?; - - let mut precedence_orderings = Vec::with_capacity(grammar_json.precedences.len()); - for list in grammar_json.precedences { - let mut ordering = Vec::with_capacity(list.len()); - for entry in list { - ordering.push(match entry { - RuleJSON::STRING { value } => PrecedenceEntry::Name(value), - RuleJSON::SYMBOL { name } => PrecedenceEntry::Symbol(name), - _ => Err(ParseGrammarError::Unexpected)?, - }); - } - precedence_orderings.push(ordering); - } - - let mut variables = Vec::with_capacity(grammar_json.rules.len()); - - let rules = grammar_json - .rules - .into_iter() - .map(|(n, r)| Ok((n, parse_rule(serde_json::from_value(r)?, false)?))) - .collect::>>()?; - - let mut in_progress = HashSet::new(); - - for (name, rule) in &rules { - if grammar_json.word.as_ref().is_none_or(|w| w != name) - && !variable_is_used( - &rules, - &extra_symbols, - &external_tokens, - name, - &mut in_progress, - ) - { - grammar_json.conflicts.retain(|r| !r.contains(name)); - grammar_json.supertypes.retain(|r| r != name); - grammar_json.inline.retain(|r| r != name); - extra_symbols.retain(|r| !rule_is_referenced(r, name, true)); - external_tokens.retain(|r| !rule_is_referenced(r, name, true)); - precedence_orderings.retain(|r| { - !r.iter().any(|e| { - let PrecedenceEntry::Symbol(s) = e else { - return false; - }; - s == name - }) - }); - continue; - } - - if extra_symbols - .iter() - .any(|r| rule_is_referenced(r, name, false)) - { - let inner_rule = if let Rule::Metadata { rule, .. } = rule { - rule - } else { - rule - }; - let matches_empty = match inner_rule { - Rule::String(rule_str) => rule_str.is_empty(), - Rule::Pattern(ref value, _) => Regex::new(value) - .map(|reg| reg.is_match("")) - .unwrap_or(false), - _ => false, - }; - if matches_empty { - warn!( - concat!( - "Named extra rule `{}` matches the empty string. ", - "Inline this to avoid infinite loops while parsing." - ), - name - ); - } - } - variables.push(Variable { - name: name.clone(), - kind: VariableType::Named, - rule: rule.clone(), - }); - } - - let reserved_words = grammar_json - .reserved - .into_iter() - .map(|(name, rule_values)| { - let Value::Array(rule_values) = rule_values else { - Err(ParseGrammarError::InvalidReservedWordSet)? - }; - - let mut reserved_words = Vec::with_capacity(rule_values.len()); - for value in rule_values { - reserved_words.push(parse_rule(serde_json::from_value(value)?, false)?); - } - Ok(ReservedWordContext { - name, - reserved_words, - }) - }) - .collect::>>()?; - - Ok(InputGrammar { - name: grammar_json.name, - word_token: grammar_json.word, - expected_conflicts: grammar_json.conflicts, - supertype_symbols: grammar_json.supertypes, - variables_to_inline: grammar_json.inline, - precedence_orderings, - variables, - extra_symbols, - external_tokens, - reserved_words, - }) -} - -fn parse_rule(json: RuleJSON, is_token: bool) -> ParseGrammarResult { - match json { - RuleJSON::ALIAS { - content, - value, - named, - } => parse_rule(*content, is_token).map(|r| Rule::alias(r, value, named)), - RuleJSON::BLANK => Ok(Rule::Blank), - RuleJSON::STRING { value } => Ok(Rule::String(value)), - RuleJSON::PATTERN { value, flags } => Ok(Rule::Pattern( - value, - flags.map_or(String::new(), |f| { - f.matches(|c| { - if c == 'i' { - true - } else { - // silently ignore unicode flags - if c != 'u' && c != 'v' { - warn!("unsupported flag {c}"); - } - false - } - }) - .collect() - }), - )), - RuleJSON::SYMBOL { name } => { - if is_token { - Err(ParseGrammarError::UnexpectedRule(name))? - } else { - Ok(Rule::NamedSymbol(name)) - } - } - RuleJSON::CHOICE { members } => members - .into_iter() - .map(|m| parse_rule(m, is_token)) - .collect::>>() - .map(Rule::choice), - RuleJSON::FIELD { content, name } => { - parse_rule(*content, is_token).map(|r| Rule::field(name, r)) - } - RuleJSON::SEQ { members } => members - .into_iter() - .map(|m| parse_rule(m, is_token)) - .collect::>>() - .map(Rule::seq), - RuleJSON::REPEAT1 { content } => parse_rule(*content, is_token).map(Rule::repeat), - RuleJSON::REPEAT { content } => { - parse_rule(*content, is_token).map(|m| Rule::choice(vec![Rule::repeat(m), Rule::Blank])) - } - RuleJSON::PREC { value, content } => { - parse_rule(*content, is_token).map(|r| Rule::prec(value.into(), r)) - } - RuleJSON::PREC_LEFT { value, content } => { - parse_rule(*content, is_token).map(|r| Rule::prec_left(value.into(), r)) - } - RuleJSON::PREC_RIGHT { value, content } => { - parse_rule(*content, is_token).map(|r| Rule::prec_right(value.into(), r)) - } - RuleJSON::PREC_DYNAMIC { value, content } => { - parse_rule(*content, is_token).map(|r| Rule::prec_dynamic(value, r)) - } - RuleJSON::RESERVED { - content, - context_name, - } => parse_rule(*content, is_token).map(|r| Rule::Reserved { - rule: Box::new(r), - context_name, - }), - RuleJSON::TOKEN { content } => parse_rule(*content, true).map(Rule::token), - RuleJSON::IMMEDIATE_TOKEN { content } => { - parse_rule(*content, is_token).map(Rule::immediate_token) - } - } -} - -impl From for Precedence { - fn from(val: PrecedenceValueJSON) -> Self { - match val { - PrecedenceValueJSON::Integer(i) => Self::Integer(i), - PrecedenceValueJSON::Name(i) => Self::Name(i), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_parse_grammar() { - let grammar = parse_grammar( - r#"{ - "name": "my_lang", - "rules": { - "file": { - "type": "REPEAT1", - "content": { - "type": "SYMBOL", - "name": "statement" - } - }, - "statement": { - "type": "STRING", - "value": "foo" - } - } - }"#, - ) - .unwrap(); - - assert_eq!(grammar.name, "my_lang"); - assert_eq!( - grammar.variables, - vec![ - Variable { - name: "file".to_string(), - kind: VariableType::Named, - rule: Rule::repeat(Rule::NamedSymbol("statement".to_string())) - }, - Variable { - name: "statement".to_string(), - kind: VariableType::Named, - rule: Rule::String("foo".to_string()) - }, - ] - ); - } -} diff --git a/crates/generate/src/parser.h.inc b/crates/generate/src/parser.h.inc deleted file mode 100644 index 858107de..00000000 --- a/crates/generate/src/parser.h.inc +++ /dev/null @@ -1,286 +0,0 @@ -#ifndef TREE_SITTER_PARSER_H_ -#define TREE_SITTER_PARSER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#define ts_builtin_sym_error ((TSSymbol)-1) -#define ts_builtin_sym_end 0 -#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024 - -#ifndef TREE_SITTER_API_H_ -typedef uint16_t TSStateId; -typedef uint16_t TSSymbol; -typedef uint16_t TSFieldId; -typedef struct TSLanguage TSLanguage; -typedef struct TSLanguageMetadata { - uint8_t major_version; - uint8_t minor_version; - uint8_t patch_version; -} TSLanguageMetadata; -#endif - -typedef struct { - TSFieldId field_id; - uint8_t child_index; - bool inherited; -} TSFieldMapEntry; - -// Used to index the field and supertype maps. -typedef struct { - uint16_t index; - uint16_t length; -} TSMapSlice; - -typedef struct { - bool visible; - bool named; - bool supertype; -} TSSymbolMetadata; - -typedef struct TSLexer TSLexer; - -struct TSLexer { - int32_t lookahead; - TSSymbol result_symbol; - void (*advance)(TSLexer *, bool); - void (*mark_end)(TSLexer *); - uint32_t (*get_column)(TSLexer *); - bool (*is_at_included_range_start)(const TSLexer *); - bool (*eof)(const TSLexer *); - void (*log)(const TSLexer *, const char *, ...); -}; - -typedef enum { - TSParseActionTypeShift, - TSParseActionTypeReduce, - TSParseActionTypeAccept, - TSParseActionTypeRecover, -} TSParseActionType; - -typedef union { - struct { - uint8_t type; - TSStateId state; - bool extra; - bool repetition; - } shift; - struct { - uint8_t type; - uint8_t child_count; - TSSymbol symbol; - int16_t dynamic_precedence; - uint16_t production_id; - } reduce; - uint8_t type; -} TSParseAction; - -typedef struct { - uint16_t lex_state; - uint16_t external_lex_state; -} TSLexMode; - -typedef struct { - uint16_t lex_state; - uint16_t external_lex_state; - uint16_t reserved_word_set_id; -} TSLexerMode; - -typedef union { - TSParseAction action; - struct { - uint8_t count; - bool reusable; - } entry; -} TSParseActionEntry; - -typedef struct { - int32_t start; - int32_t end; -} TSCharacterRange; - -struct TSLanguage { - uint32_t abi_version; - uint32_t symbol_count; - uint32_t alias_count; - uint32_t token_count; - uint32_t external_token_count; - uint32_t state_count; - uint32_t large_state_count; - uint32_t production_id_count; - uint32_t field_count; - uint16_t max_alias_sequence_length; - const uint16_t *parse_table; - const uint16_t *small_parse_table; - const uint32_t *small_parse_table_map; - const TSParseActionEntry *parse_actions; - const char * const *symbol_names; - const char * const *field_names; - const TSMapSlice *field_map_slices; - const TSFieldMapEntry *field_map_entries; - const TSSymbolMetadata *symbol_metadata; - const TSSymbol *public_symbol_map; - const uint16_t *alias_map; - const TSSymbol *alias_sequences; - const TSLexerMode *lex_modes; - bool (*lex_fn)(TSLexer *, TSStateId); - bool (*keyword_lex_fn)(TSLexer *, TSStateId); - TSSymbol keyword_capture_token; - struct { - const bool *states; - const TSSymbol *symbol_map; - void *(*create)(void); - void (*destroy)(void *); - bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist); - unsigned (*serialize)(void *, char *); - void (*deserialize)(void *, const char *, unsigned); - } external_scanner; - const TSStateId *primary_state_ids; - const char *name; - const TSSymbol *reserved_words; - uint16_t max_reserved_word_set_size; - uint32_t supertype_count; - const TSSymbol *supertype_symbols; - const TSMapSlice *supertype_map_slices; - const TSSymbol *supertype_map_entries; - TSLanguageMetadata metadata; -}; - -static inline bool set_contains(const TSCharacterRange *ranges, uint32_t len, int32_t lookahead) { - uint32_t index = 0; - uint32_t size = len - index; - while (size > 1) { - uint32_t half_size = size / 2; - uint32_t mid_index = index + half_size; - const TSCharacterRange *range = &ranges[mid_index]; - if (lookahead >= range->start && lookahead <= range->end) { - return true; - } else if (lookahead > range->end) { - index = mid_index; - } - size -= half_size; - } - const TSCharacterRange *range = &ranges[index]; - return (lookahead >= range->start && lookahead <= range->end); -} - -/* - * Lexer Macros - */ - -#ifdef _MSC_VER -#define UNUSED __pragma(warning(suppress : 4101)) -#else -#define UNUSED __attribute__((unused)) -#endif - -#define START_LEXER() \ - bool result = false; \ - bool skip = false; \ - UNUSED \ - bool eof = false; \ - int32_t lookahead; \ - goto start; \ - next_state: \ - lexer->advance(lexer, skip); \ - start: \ - skip = false; \ - lookahead = lexer->lookahead; - -#define ADVANCE(state_value) \ - { \ - state = state_value; \ - goto next_state; \ - } - -#define ADVANCE_MAP(...) \ - { \ - static const uint16_t map[] = { __VA_ARGS__ }; \ - for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) { \ - if (map[i] == lookahead) { \ - state = map[i + 1]; \ - goto next_state; \ - } \ - } \ - } - -#define SKIP(state_value) \ - { \ - skip = true; \ - state = state_value; \ - goto next_state; \ - } - -#define ACCEPT_TOKEN(symbol_value) \ - result = true; \ - lexer->result_symbol = symbol_value; \ - lexer->mark_end(lexer); - -#define END_STATE() return result; - -/* - * Parse Table Macros - */ - -#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT) - -#define STATE(id) id - -#define ACTIONS(id) id - -#define SHIFT(state_value) \ - {{ \ - .shift = { \ - .type = TSParseActionTypeShift, \ - .state = (state_value) \ - } \ - }} - -#define SHIFT_REPEAT(state_value) \ - {{ \ - .shift = { \ - .type = TSParseActionTypeShift, \ - .state = (state_value), \ - .repetition = true \ - } \ - }} - -#define SHIFT_EXTRA() \ - {{ \ - .shift = { \ - .type = TSParseActionTypeShift, \ - .extra = true \ - } \ - }} - -#define REDUCE(symbol_name, children, precedence, prod_id) \ - {{ \ - .reduce = { \ - .type = TSParseActionTypeReduce, \ - .symbol = symbol_name, \ - .child_count = children, \ - .dynamic_precedence = precedence, \ - .production_id = prod_id \ - }, \ - }} - -#define RECOVER() \ - {{ \ - .type = TSParseActionTypeRecover \ - }} - -#define ACCEPT_INPUT() \ - {{ \ - .type = TSParseActionTypeAccept \ - }} - -#ifdef __cplusplus -} -#endif - -#endif // TREE_SITTER_PARSER_H_ diff --git a/crates/generate/src/quickjs.rs b/crates/generate/src/quickjs.rs deleted file mode 100644 index d8c71cfe..00000000 --- a/crates/generate/src/quickjs.rs +++ /dev/null @@ -1,477 +0,0 @@ -use std::{ - collections::HashMap, - path::{Path, PathBuf}, - sync::{LazyLock, Mutex}, -}; - -use log::{error, info, warn}; -use rquickjs::{ - loader::{FileResolver, ScriptLoader}, - Context, Ctx, Function, Module, Object, Runtime, Type, Value, -}; - -use super::{IoError, JSError, JSResult}; - -const DSL: &[u8] = include_bytes!("dsl.js"); - -trait JSResultExt { - fn or_js_error(self, ctx: &Ctx) -> JSResult; -} - -impl JSResultExt for Result { - fn or_js_error(self, ctx: &Ctx) -> JSResult { - match self { - Ok(v) => Ok(v), - Err(rquickjs::Error::Exception) => Err(format_js_exception(ctx.catch())), - Err(e) => Err(JSError::QuickJS(e.to_string())), - } - } -} - -fn format_js_exception(v: Value) -> JSError { - let Some(exception) = v.into_exception() else { - return JSError::QuickJS("Expected a JS exception".to_string()); - }; - - let error_obj = exception.as_object(); - let mut parts = Vec::new(); - - for (key, label) in [("message", "Message"), ("stack", "Stack"), ("name", "Type")] { - if let Ok(value) = error_obj.get::<_, String>(key) { - parts.push(format!("{label}: {value}")); - } - } - - if parts.is_empty() { - JSError::QuickJS(exception.to_string()) - } else { - JSError::QuickJS(parts.join("\n")) - } -} - -static FILE_CACHE: LazyLock>> = - LazyLock::new(|| Mutex::new(HashMap::new())); - -#[rquickjs::function] -fn load_file(path: String) -> rquickjs::Result { - { - let cache = FILE_CACHE.lock().unwrap(); - if let Some(cached) = cache.get(&path) { - return Ok(cached.clone()); - } - } - - let content = std::fs::read_to_string(&path).map_err(|e| { - rquickjs::Error::new_from_js_message("IOError", "FileReadError", e.to_string()) - })?; - - { - let mut cache = FILE_CACHE.lock().unwrap(); - cache.insert(path, content.clone()); - } - - Ok(content) -} - -#[rquickjs::class] -#[derive(rquickjs::class::Trace, rquickjs::JsLifetime, Default)] -pub struct Console {} - -impl Console { - fn format_args(args: &[Value<'_>]) -> String { - args.iter() - .map(|v| match v.type_of() { - Type::Bool => v.as_bool().unwrap().to_string(), - Type::Int => v.as_int().unwrap().to_string(), - Type::Float => v.as_float().unwrap().to_string(), - Type::String => v - .as_string() - .unwrap() - .to_string() - .unwrap_or_else(|_| String::new()), - Type::Null => "null".to_string(), - Type::Undefined => "undefined".to_string(), - Type::Uninitialized => "uninitialized".to_string(), - Type::Module => "module".to_string(), - Type::BigInt => v.get::().unwrap_or_else(|_| "BigInt".to_string()), - Type::Unknown => "unknown".to_string(), - Type::Array => { - let js_vals = v - .as_array() - .unwrap() - .iter::>() - .filter_map(|x| x.ok()) - .map(|x| { - if x.is_string() { - format!("'{}'", Self::format_args(&[x])) - } else { - Self::format_args(&[x]) - } - }) - .collect::>() - .join(", "); - - format!("[ {js_vals} ]") - } - Type::Symbol - | Type::Object - | Type::Proxy - | Type::Function - | Type::Constructor - | Type::Promise - | Type::Exception => "[object Object]".to_string(), - }) - .collect::>() - .join(" ") - } -} - -#[rquickjs::methods] -impl Console { - #[qjs(constructor)] - pub const fn new() -> Self { - Console {} - } - - #[allow(clippy::needless_pass_by_value)] - pub fn log(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { - info!("{}", Self::format_args(&args)); - Ok(()) - } - - #[allow(clippy::needless_pass_by_value)] - pub fn warn(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { - warn!("{}", Self::format_args(&args)); - Ok(()) - } - - #[allow(clippy::needless_pass_by_value)] - pub fn error(&self, args: rquickjs::function::Rest>) -> rquickjs::Result<()> { - error!("Error: {}", Self::format_args(&args)); - Ok(()) - } -} - -fn resolve_module_path(base_path: &Path, module_path: &str) -> rquickjs::Result { - let candidates = if module_path.starts_with("./") || module_path.starts_with("../") { - let target = base_path.join(module_path); - vec![ - target.with_extension("js"), - target.with_extension("json"), - target.clone(), - ] - } else { - let local_target = base_path.join(module_path); - let node_modules_target = Path::new("node_modules").join(module_path); - - vec![ - local_target.with_extension("js"), - local_target.with_extension("json"), - local_target.clone(), - node_modules_target.with_extension("js"), - node_modules_target.with_extension("json"), - node_modules_target, - ] - }; - - for candidate in candidates { - if let Ok(resolved) = try_resolve_path(&candidate) { - return Ok(resolved); - } - } - - Err(rquickjs::Error::new_from_js_message( - "Error", - "ModuleNotFound", - format!("Module not found: {module_path}"), - )) -} - -fn try_resolve_path(path: &Path) -> rquickjs::Result { - let metadata = std::fs::metadata(path).map_err(|_| { - rquickjs::Error::new_from_js_message( - "Error", - "FileNotFound", - format!("Path not found: {}", path.display()), - ) - })?; - - if metadata.is_file() { - return Ok(path.to_path_buf()); - } - - if metadata.is_dir() { - let index_path = path.join("index.js"); - if index_path.exists() { - return Ok(index_path); - } - } - - Err(rquickjs::Error::new_from_js_message( - "Error", - "ResolutionFailed", - format!("Cannot resolve: {}", path.display()), - )) -} - -#[allow(clippy::needless_pass_by_value)] -fn require_from_module<'js>( - ctx: Ctx<'js>, - module_path: String, - from_module: &str, -) -> rquickjs::Result> { - let current_module = PathBuf::from(from_module); - let current_dir = if current_module.is_file() { - current_module.parent().unwrap_or(Path::new(".")) - } else { - current_module.as_path() - }; - - let resolved_path = resolve_module_path(current_dir, &module_path)?; - - let contents = load_file(resolved_path.to_string_lossy().to_string())?; - - load_module_from_content(&ctx, &resolved_path, &contents) -} - -fn load_module_from_content<'js>( - ctx: &Ctx<'js>, - path: &Path, - contents: &str, -) -> rquickjs::Result> { - if path.extension().is_some_and(|ext| ext == "json") { - return ctx.eval::, _>(format!("JSON.parse({contents:?})")); - } - - let exports = Object::new(ctx.clone())?; - let module_obj = Object::new(ctx.clone())?; - module_obj.set("exports", exports.clone())?; - - let filename = path.to_string_lossy().to_string(); - let dirname = path - .parent() - .map_or_else(|| ".".to_string(), |p| p.to_string_lossy().to_string()); - - // Require function specific to *this* module - let module_path = filename.clone(); - let require = Function::new( - ctx.clone(), - move |ctx_inner: Ctx<'js>, target_path: String| -> rquickjs::Result> { - require_from_module(ctx_inner, target_path, &module_path) - }, - )?; - - let wrapper = - format!("(function(exports, require, module, __filename, __dirname) {{ {contents} }})"); - - let module_func = ctx.eval::, _>(wrapper)?; - module_func.call::<_, Value<'js>>((exports, require, module_obj.clone(), filename, dirname))?; - - module_obj.get("exports") -} - -pub fn execute_native_runtime(grammar_path: &Path) -> JSResult { - let runtime = Runtime::new()?; - - runtime.set_memory_limit(64 * 1024 * 1024); // 64MB - runtime.set_max_stack_size(256 * 1024); // 256KB - - let context = Context::full(&runtime)?; - - let resolver = FileResolver::default() - .with_path("./node_modules") - .with_path("./") - .with_pattern("{}.mjs"); - let loader = ScriptLoader::default().with_extension("mjs"); - runtime.set_loader(resolver, loader); - - let cwd = std::env::current_dir().map_err(|e| JSError::IO(IoError::new(&e, None)))?; - let relative_path = pathdiff::diff_paths(grammar_path, &cwd) - .map(|p| p.to_string_lossy().to_string()) - .ok_or(JSError::RelativePath)?; - - context.with(|ctx| -> JSResult { - let globals = ctx.globals(); - - globals.set("native", true).or_js_error(&ctx)?; - globals - .set("__ts_grammar_path", relative_path) - .or_js_error(&ctx)?; - - let console = rquickjs::Class::instance(ctx.clone(), Console::new()).or_js_error(&ctx)?; - globals.set("console", console).or_js_error(&ctx)?; - - let process = Object::new(ctx.clone()).or_js_error(&ctx)?; - let env = Object::new(ctx.clone()).or_js_error(&ctx)?; - for (key, value) in std::env::vars() { - env.set(key, value).or_js_error(&ctx)?; - } - process.set("env", env).or_js_error(&ctx)?; - globals.set("process", process).or_js_error(&ctx)?; - - let module = Object::new(ctx.clone()).or_js_error(&ctx)?; - module - .set("exports", Object::new(ctx.clone()).or_js_error(&ctx)?) - .or_js_error(&ctx)?; - globals.set("module", module).or_js_error(&ctx)?; - - let grammar_path_string = grammar_path.to_string_lossy().to_string(); - let main_require = Function::new( - ctx.clone(), - move |ctx_inner, target_path: String| -> rquickjs::Result { - require_from_module(ctx_inner, target_path, &grammar_path_string) - }, - )?; - globals.set("require", main_require).or_js_error(&ctx)?; - - let promise = Module::evaluate(ctx.clone(), "dsl", DSL).or_js_error(&ctx)?; - promise.finish::<()>().or_js_error(&ctx)?; - - let grammar_json = ctx - .eval::("globalThis.output") - .map(|s| s.to_string()) - .or_js_error(&ctx)? - .or_js_error(&ctx)?; - - let parsed = serde_json::from_str::(&grammar_json)?; - Ok(serde_json::to_string_pretty(&parsed)?) - }) -} - -#[cfg(test)] -mod tests { - use std::{ - fs, - sync::{Arc, Mutex, OnceLock}, - }; - use tempfile::TempDir; - - use super::*; - - static TEST_MUTEX: OnceLock>> = OnceLock::new(); - - fn with_test_lock(test: F) -> R - where - F: FnOnce() -> R, - { - let _guard = TEST_MUTEX.get_or_init(|| Arc::new(Mutex::new(()))).lock(); - let result = test(); - cleanup_runtime_state(); - result - } - - fn cleanup_runtime_state() { - FILE_CACHE.lock().unwrap().clear(); - } - - #[test] - fn test_basic_grammar_execution() { - with_test_lock(|| { - let temp_dir = TempDir::new().unwrap(); - std::env::set_current_dir(temp_dir.path()).unwrap(); - - let grammar_path = temp_dir.path().join("grammar.js"); - fs::write( - &grammar_path, - r" - module.exports = grammar({ - name: 'test', - rules: { source_file: $ => 'hello' } - }); - ", - ) - .unwrap(); - - let json = execute_native_runtime(&grammar_path).expect("Failed to execute grammar"); - assert!(json.contains("\"name\": \"test\"")); - assert!(json.contains("\"hello\"")); - }); - } - - #[test] - fn test_module_imports() { - with_test_lock(|| { - let temp_dir = TempDir::new().unwrap(); - std::env::set_current_dir(temp_dir.path()).unwrap(); - - fs::write( - temp_dir.path().join("common.js"), - r" - module.exports = { identifier: $ => /[a-zA-Z_][a-zA-Z0-9_]*/ }; - ", - ) - .unwrap(); - - fs::write( - temp_dir.path().join("grammar.js"), - r" - const common = require('./common'); - module.exports = grammar({ - name: 'test_import', - rules: { source_file: common.identifier } - }); - ", - ) - .unwrap(); - - let json = execute_native_runtime(&temp_dir.path().join("grammar.js")) - .expect("Failed to execute grammar with imports"); - assert!(json.contains("\"name\": \"test_import\"")); - }); - } - - #[test] - fn test_json_module_loading() { - with_test_lock(|| { - let temp_dir = TempDir::new().unwrap(); - std::env::set_current_dir(temp_dir.path()).unwrap(); - - fs::write( - temp_dir.path().join("package.json"), - r#"{"version": "1.0.0"}"#, - ) - .unwrap(); - fs::write( - temp_dir.path().join("grammar.js"), - r" - const pkg = require('./package.json'); - module.exports = grammar({ - name: 'json_test', - rules: { - source_file: $ => 'version_' + pkg.version.replace(/\./g, '_') - } - }); - ", - ) - .unwrap(); - - let json = execute_native_runtime(&temp_dir.path().join("grammar.js")) - .expect("Failed to execute grammar with JSON import"); - assert!(json.contains("version_1_0_0")); - }); - } - - #[test] - fn test_resource_limits() { - with_test_lock(|| { - let temp_dir = TempDir::new().unwrap(); - std::env::set_current_dir(temp_dir.path()).unwrap(); - - fs::write( - temp_dir.path().join("grammar.js"), - r" - const huge = new Array(10000000).fill('x'.repeat(1000)); - module.exports = grammar({ - name: 'resource_test', - rules: { source_file: $ => 'test' } - }); - ", - ) - .unwrap(); - - let result = execute_native_runtime(&temp_dir.path().join("grammar.js")); - assert!(result.is_err()); - assert!(matches!(result.unwrap_err(), JSError::QuickJS(_))); - }); - } -} diff --git a/crates/generate/src/templates/array.h b/crates/generate/src/templates/array.h deleted file mode 100644 index a17a574f..00000000 --- a/crates/generate/src/templates/array.h +++ /dev/null @@ -1,291 +0,0 @@ -#ifndef TREE_SITTER_ARRAY_H_ -#define TREE_SITTER_ARRAY_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "./alloc.h" - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4101) -#elif defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-variable" -#endif - -#define Array(T) \ - struct { \ - T *contents; \ - uint32_t size; \ - uint32_t capacity; \ - } - -/// Initialize an array. -#define array_init(self) \ - ((self)->size = 0, (self)->capacity = 0, (self)->contents = NULL) - -/// Create an empty array. -#define array_new() \ - { NULL, 0, 0 } - -/// Get a pointer to the element at a given `index` in the array. -#define array_get(self, _index) \ - (assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index]) - -/// Get a pointer to the first element in the array. -#define array_front(self) array_get(self, 0) - -/// Get a pointer to the last element in the array. -#define array_back(self) array_get(self, (self)->size - 1) - -/// Clear the array, setting its size to zero. Note that this does not free any -/// memory allocated for the array's contents. -#define array_clear(self) ((self)->size = 0) - -/// Reserve `new_capacity` elements of space in the array. If `new_capacity` is -/// less than the array's current capacity, this function has no effect. -#define array_reserve(self, new_capacity) \ - _array__reserve((Array *)(self), array_elem_size(self), new_capacity) - -/// Free any memory allocated for this array. Note that this does not free any -/// memory allocated for the array's contents. -#define array_delete(self) _array__delete((Array *)(self)) - -/// Push a new `element` onto the end of the array. -#define array_push(self, element) \ - (_array__grow((Array *)(self), 1, array_elem_size(self)), \ - (self)->contents[(self)->size++] = (element)) - -/// Increase the array's size by `count` elements. -/// New elements are zero-initialized. -#define array_grow_by(self, count) \ - do { \ - if ((count) == 0) break; \ - _array__grow((Array *)(self), count, array_elem_size(self)); \ - memset((self)->contents + (self)->size, 0, (count) * array_elem_size(self)); \ - (self)->size += (count); \ - } while (0) - -/// Append all elements from one array to the end of another. -#define array_push_all(self, other) \ - array_extend((self), (other)->size, (other)->contents) - -/// Append `count` elements to the end of the array, reading their values from the -/// `contents` pointer. -#define array_extend(self, count, contents) \ - _array__splice( \ - (Array *)(self), array_elem_size(self), (self)->size, \ - 0, count, contents \ - ) - -/// Remove `old_count` elements from the array starting at the given `index`. At -/// the same index, insert `new_count` new elements, reading their values from the -/// `new_contents` pointer. -#define array_splice(self, _index, old_count, new_count, new_contents) \ - _array__splice( \ - (Array *)(self), array_elem_size(self), _index, \ - old_count, new_count, new_contents \ - ) - -/// Insert one `element` into the array at the given `index`. -#define array_insert(self, _index, element) \ - _array__splice((Array *)(self), array_elem_size(self), _index, 0, 1, &(element)) - -/// Remove one element from the array at the given `index`. -#define array_erase(self, _index) \ - _array__erase((Array *)(self), array_elem_size(self), _index) - -/// Pop the last element off the array, returning the element by value. -#define array_pop(self) ((self)->contents[--(self)->size]) - -/// Assign the contents of one array to another, reallocating if necessary. -#define array_assign(self, other) \ - _array__assign((Array *)(self), (const Array *)(other), array_elem_size(self)) - -/// Swap one array with another -#define array_swap(self, other) \ - _array__swap((Array *)(self), (Array *)(other)) - -/// Get the size of the array contents -#define array_elem_size(self) (sizeof *(self)->contents) - -/// Search a sorted array for a given `needle` value, using the given `compare` -/// callback to determine the order. -/// -/// If an existing element is found to be equal to `needle`, then the `index` -/// out-parameter is set to the existing value's index, and the `exists` -/// out-parameter is set to true. Otherwise, `index` is set to an index where -/// `needle` should be inserted in order to preserve the sorting, and `exists` -/// is set to false. -#define array_search_sorted_with(self, compare, needle, _index, _exists) \ - _array__search_sorted(self, 0, compare, , needle, _index, _exists) - -/// Search a sorted array for a given `needle` value, using integer comparisons -/// of a given struct field (specified with a leading dot) to determine the order. -/// -/// See also `array_search_sorted_with`. -#define array_search_sorted_by(self, field, needle, _index, _exists) \ - _array__search_sorted(self, 0, _compare_int, field, needle, _index, _exists) - -/// Insert a given `value` into a sorted array, using the given `compare` -/// callback to determine the order. -#define array_insert_sorted_with(self, compare, value) \ - do { \ - unsigned _index, _exists; \ - array_search_sorted_with(self, compare, &(value), &_index, &_exists); \ - if (!_exists) array_insert(self, _index, value); \ - } while (0) - -/// Insert a given `value` into a sorted array, using integer comparisons of -/// a given struct field (specified with a leading dot) to determine the order. -/// -/// See also `array_search_sorted_by`. -#define array_insert_sorted_by(self, field, value) \ - do { \ - unsigned _index, _exists; \ - array_search_sorted_by(self, field, (value) field, &_index, &_exists); \ - if (!_exists) array_insert(self, _index, value); \ - } while (0) - -// Private - -typedef Array(void) Array; - -/// This is not what you're looking for, see `array_delete`. -static inline void _array__delete(Array *self) { - if (self->contents) { - ts_free(self->contents); - self->contents = NULL; - self->size = 0; - self->capacity = 0; - } -} - -/// This is not what you're looking for, see `array_erase`. -static inline void _array__erase(Array *self, size_t element_size, - uint32_t index) { - assert(index < self->size); - char *contents = (char *)self->contents; - memmove(contents + index * element_size, contents + (index + 1) * element_size, - (self->size - index - 1) * element_size); - self->size--; -} - -/// This is not what you're looking for, see `array_reserve`. -static inline void _array__reserve(Array *self, size_t element_size, uint32_t new_capacity) { - if (new_capacity > self->capacity) { - if (self->contents) { - self->contents = ts_realloc(self->contents, new_capacity * element_size); - } else { - self->contents = ts_malloc(new_capacity * element_size); - } - self->capacity = new_capacity; - } -} - -/// This is not what you're looking for, see `array_assign`. -static inline void _array__assign(Array *self, const Array *other, size_t element_size) { - _array__reserve(self, element_size, other->size); - self->size = other->size; - memcpy(self->contents, other->contents, self->size * element_size); -} - -/// This is not what you're looking for, see `array_swap`. -static inline void _array__swap(Array *self, Array *other) { - Array swap = *other; - *other = *self; - *self = swap; -} - -/// This is not what you're looking for, see `array_push` or `array_grow_by`. -static inline void _array__grow(Array *self, uint32_t count, size_t element_size) { - uint32_t new_size = self->size + count; - if (new_size > self->capacity) { - uint32_t new_capacity = self->capacity * 2; - if (new_capacity < 8) new_capacity = 8; - if (new_capacity < new_size) new_capacity = new_size; - _array__reserve(self, element_size, new_capacity); - } -} - -/// This is not what you're looking for, see `array_splice`. -static inline void _array__splice(Array *self, size_t element_size, - uint32_t index, uint32_t old_count, - uint32_t new_count, const void *elements) { - uint32_t new_size = self->size + new_count - old_count; - uint32_t old_end = index + old_count; - uint32_t new_end = index + new_count; - assert(old_end <= self->size); - - _array__reserve(self, element_size, new_size); - - char *contents = (char *)self->contents; - if (self->size > old_end) { - memmove( - contents + new_end * element_size, - contents + old_end * element_size, - (self->size - old_end) * element_size - ); - } - if (new_count > 0) { - if (elements) { - memcpy( - (contents + index * element_size), - elements, - new_count * element_size - ); - } else { - memset( - (contents + index * element_size), - 0, - new_count * element_size - ); - } - } - self->size += new_count - old_count; -} - -/// A binary search routine, based on Rust's `std::slice::binary_search_by`. -/// This is not what you're looking for, see `array_search_sorted_with` or `array_search_sorted_by`. -#define _array__search_sorted(self, start, compare, suffix, needle, _index, _exists) \ - do { \ - *(_index) = start; \ - *(_exists) = false; \ - uint32_t size = (self)->size - *(_index); \ - if (size == 0) break; \ - int comparison; \ - while (size > 1) { \ - uint32_t half_size = size / 2; \ - uint32_t mid_index = *(_index) + half_size; \ - comparison = compare(&((self)->contents[mid_index] suffix), (needle)); \ - if (comparison <= 0) *(_index) = mid_index; \ - size -= half_size; \ - } \ - comparison = compare(&((self)->contents[*(_index)] suffix), (needle)); \ - if (comparison == 0) *(_exists) = true; \ - else if (comparison < 0) *(_index) += 1; \ - } while (0) - -/// Helper macro for the `_sorted_by` routines below. This takes the left (existing) -/// parameter by reference in order to work with the generic sorting function above. -#define _compare_int(a, b) ((int)*(a) - (int)(b)) - -#ifdef _MSC_VER -#pragma warning(pop) -#elif defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#ifdef __cplusplus -} -#endif - -#endif // TREE_SITTER_ARRAY_H_ diff --git a/crates/highlight/LICENSE b/crates/highlight/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/highlight/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/language/LICENSE b/crates/language/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/language/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/language/README.md b/crates/language/README.md deleted file mode 100644 index ddeabb92..00000000 --- a/crates/language/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Tree-sitter Language - -This crate provides a `LanguageFn` type for grammars to create `Language` instances from a parser, -without having to worry about the `tree-sitter` crate version not matching. diff --git a/crates/language/build.rs b/crates/language/build.rs deleted file mode 100644 index 930b3dff..00000000 --- a/crates/language/build.rs +++ /dev/null @@ -1,13 +0,0 @@ -fn main() { - if std::env::var("TARGET") - .unwrap_or_default() - .starts_with("wasm32-unknown") - { - let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); - let wasm_headers = std::path::Path::new(&manifest_dir).join("wasm/include"); - let wasm_src = std::path::Path::new(&manifest_dir).join("wasm/src"); - - println!("cargo::metadata=wasm-headers={}", wasm_headers.display()); - println!("cargo::metadata=wasm-src={}", wasm_src.display()); - } -} diff --git a/crates/language/wasm/include/assert.h b/crates/language/wasm/include/assert.h deleted file mode 100644 index e981a20e..00000000 --- a/crates/language/wasm/include/assert.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef TREE_SITTER_WASM_ASSERT_H_ -#define TREE_SITTER_WASM_ASSERT_H_ - -#ifdef NDEBUG -#define assert(e) ((void)0) -#else -__attribute__((noreturn)) void __assert_fail(const char *assertion, const char *file, unsigned line, const char *function) { - __builtin_trap(); -} -#define assert(expression) \ - ((expression) ? (void)0 : __assert_fail(#expression, __FILE__, __LINE__, __func__)) -#endif - -#endif // TREE_SITTER_WASM_ASSERT_H_ diff --git a/crates/language/wasm/include/ctype.h b/crates/language/wasm/include/ctype.h deleted file mode 100644 index cea32970..00000000 --- a/crates/language/wasm/include/ctype.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef TREE_SITTER_WASM_CTYPE_H_ -#define TREE_SITTER_WASM_CTYPE_H_ - -static inline int isprint(int c) { - return c >= 0x20 && c <= 0x7E; -} - -#endif // TREE_SITTER_WASM_CTYPE_H_ diff --git a/crates/language/wasm/include/endian.h b/crates/language/wasm/include/endian.h deleted file mode 100644 index f35a5962..00000000 --- a/crates/language/wasm/include/endian.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef TREE_SITTER_WASM_ENDIAN_H_ -#define TREE_SITTER_WASM_ENDIAN_H_ - -#define be16toh(x) __builtin_bswap16(x) -#define be32toh(x) __builtin_bswap32(x) -#define be64toh(x) __builtin_bswap64(x) -#define le16toh(x) (x) -#define le32toh(x) (x) -#define le64toh(x) (x) - - -#endif // TREE_SITTER_WASM_ENDIAN_H_ diff --git a/crates/language/wasm/include/inttypes.h b/crates/language/wasm/include/inttypes.h deleted file mode 100644 index f5cccd07..00000000 --- a/crates/language/wasm/include/inttypes.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef TREE_SITTER_WASM_INTTYPES_H_ -#define TREE_SITTER_WASM_INTTYPES_H_ - -// https://github.com/llvm/llvm-project/blob/0c3cf200f5b918fb5c1114e9f1764c2d54d1779b/libc/include/llvm-libc-macros/inttypes-macros.h#L209 - -#define PRId32 "d" - -#endif // TREE_SITTER_WASM_INTTYPES_H_ diff --git a/crates/language/wasm/include/stdint.h b/crates/language/wasm/include/stdint.h deleted file mode 100644 index 10cc35dc..00000000 --- a/crates/language/wasm/include/stdint.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef TREE_SITTER_WASM_STDINT_H_ -#define TREE_SITTER_WASM_STDINT_H_ - -// https://github.com/llvm/llvm-project/blob/0c3cf200f5b918fb5c1114e9f1764c2d54d1779b/clang/test/Preprocessor/init.c#L1672 - -typedef signed char int8_t; - -typedef short int16_t; - -typedef int int32_t; - -typedef long long int int64_t; - -typedef unsigned char uint8_t; - -typedef unsigned short uint16_t; - -typedef unsigned int uint32_t; - -typedef long long unsigned int uint64_t; - -typedef long unsigned int size_t; - -typedef long unsigned int uintptr_t; - -#define INT8_MAX 127 -#define INT16_MAX 32767 -#define INT32_MAX 2147483647L -#define INT64_MAX 9223372036854775807LL - -#define UINT8_MAX 255 -#define UINT16_MAX 65535 -#define UINT32_MAX 4294967295U -#define UINT64_MAX 18446744073709551615ULL - -#if defined(__wasm32__) - -#define SIZE_MAX 4294967295UL - -#elif defined(__wasm64__) - -#define SIZE_MAX 18446744073709551615UL - -#endif - -#endif // TREE_SITTER_WASM_STDINT_H_ diff --git a/crates/language/wasm/include/stdio.h b/crates/language/wasm/include/stdio.h deleted file mode 100644 index 4089cccc..00000000 --- a/crates/language/wasm/include/stdio.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef TREE_SITTER_WASM_STDIO_H_ -#define TREE_SITTER_WASM_STDIO_H_ - -#include -#include - -typedef struct FILE FILE; - -typedef __builtin_va_list va_list; -#define va_start(ap, last) __builtin_va_start(ap, last) -#define va_end(ap) __builtin_va_end(ap) -#define va_arg(ap, type) __builtin_va_arg(ap, type) - -#define stdout ((FILE *)0) - -#define stderr ((FILE *)1) - -#define stdin ((FILE *)2) - -int fclose(FILE *stream); - -FILE *fdopen(int fd, const char *mode); - -int fputc(int c, FILE *stream); - -int fputs(const char *restrict s, FILE *restrict stream); - -size_t fwrite(const void *restrict buffer, size_t size, size_t nmemb, FILE *restrict stream); - -int fprintf(FILE *restrict stream, const char *restrict format, ...); - -int snprintf(char *restrict buffer, size_t buffsz, const char *restrict format, ...); - -int vsnprintf(char *restrict buffer, size_t buffsz, const char *restrict format, va_list vlist); - -#endif // TREE_SITTER_WASM_STDIO_H_ diff --git a/crates/language/wasm/include/stdlib.h b/crates/language/wasm/include/stdlib.h deleted file mode 100644 index 2da313ab..00000000 --- a/crates/language/wasm/include/stdlib.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef TREE_SITTER_WASM_STDLIB_H_ -#define TREE_SITTER_WASM_STDLIB_H_ - -#include - -#define NULL ((void*)0) - -void* malloc(size_t); -void* calloc(size_t, size_t); -void free(void*); -void* realloc(void*, size_t); - -__attribute__((noreturn)) void abort(void); - -#endif // TREE_SITTER_WASM_STDLIB_H_ diff --git a/crates/language/wasm/include/string.h b/crates/language/wasm/include/string.h deleted file mode 100644 index 10f11958..00000000 --- a/crates/language/wasm/include/string.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef TREE_SITTER_WASM_STRING_H_ -#define TREE_SITTER_WASM_STRING_H_ - -#include - -int memcmp(const void *lhs, const void *rhs, size_t count); - -void *memcpy(void *restrict dst, const void *restrict src, size_t size); - -void *memmove(void *dst, const void *src, size_t count); - -void *memset(void *dst, int value, size_t count); - -int strncmp(const char *left, const char *right, size_t n); - -size_t strlen(const char *str); - -#endif // TREE_SITTER_WASM_STRING_H_ diff --git a/crates/language/wasm/include/wctype.h b/crates/language/wasm/include/wctype.h deleted file mode 100644 index 8d1e8c82..00000000 --- a/crates/language/wasm/include/wctype.h +++ /dev/null @@ -1,168 +0,0 @@ -#ifndef TREE_SITTER_WASM_WCTYPE_H_ -#define TREE_SITTER_WASM_WCTYPE_H_ - -typedef int wint_t; - -static inline bool iswalpha(wint_t wch) { - switch (wch) { - case L'a': - case L'b': - case L'c': - case L'd': - case L'e': - case L'f': - case L'g': - case L'h': - case L'i': - case L'j': - case L'k': - case L'l': - case L'm': - case L'n': - case L'o': - case L'p': - case L'q': - case L'r': - case L's': - case L't': - case L'u': - case L'v': - case L'w': - case L'x': - case L'y': - case L'z': - case L'A': - case L'B': - case L'C': - case L'D': - case L'E': - case L'F': - case L'G': - case L'H': - case L'I': - case L'J': - case L'K': - case L'L': - case L'M': - case L'N': - case L'O': - case L'P': - case L'Q': - case L'R': - case L'S': - case L'T': - case L'U': - case L'V': - case L'W': - case L'X': - case L'Y': - case L'Z': - return true; - default: - return false; - } -} - -static inline bool iswdigit(wint_t wch) { - switch (wch) { - case L'0': - case L'1': - case L'2': - case L'3': - case L'4': - case L'5': - case L'6': - case L'7': - case L'8': - case L'9': - return true; - default: - return false; - } -} - -static inline bool iswalnum(wint_t wch) { - switch (wch) { - case L'a': - case L'b': - case L'c': - case L'd': - case L'e': - case L'f': - case L'g': - case L'h': - case L'i': - case L'j': - case L'k': - case L'l': - case L'm': - case L'n': - case L'o': - case L'p': - case L'q': - case L'r': - case L's': - case L't': - case L'u': - case L'v': - case L'w': - case L'x': - case L'y': - case L'z': - case L'A': - case L'B': - case L'C': - case L'D': - case L'E': - case L'F': - case L'G': - case L'H': - case L'I': - case L'J': - case L'K': - case L'L': - case L'M': - case L'N': - case L'O': - case L'P': - case L'Q': - case L'R': - case L'S': - case L'T': - case L'U': - case L'V': - case L'W': - case L'X': - case L'Y': - case L'Z': - case L'0': - case L'1': - case L'2': - case L'3': - case L'4': - case L'5': - case L'6': - case L'7': - case L'8': - case L'9': - return true; - default: - return false; - } -} - -static inline bool iswspace(wint_t wch) { - switch (wch) { - case L' ': - case L'\t': - case L'\n': - case L'\v': - case L'\f': - case L'\r': - return true; - default: - return false; - } -} - -#endif // TREE_SITTER_WASM_WCTYPE_H_ diff --git a/crates/language/wasm/src/stdio.c b/crates/language/wasm/src/stdio.c deleted file mode 100644 index 470c1ecc..00000000 --- a/crates/language/wasm/src/stdio.c +++ /dev/null @@ -1,299 +0,0 @@ -#include -#include - -typedef struct { - bool left_justify; // - - bool zero_pad; // 0 - bool show_sign; // + - bool space_prefix; // ' ' - bool alternate_form; // # -} format_flags_t; - -static const char* parse_format_spec( - const char *format, - int *width, - int *precision, - format_flags_t *flags -) { - *width = 0; - *precision = -1; - flags->left_justify = false; - flags->zero_pad = false; - flags->show_sign = false; - flags->space_prefix = false; - flags->alternate_form = false; - - const char *p = format; - - // Parse flags - while (*p == '-' || *p == '+' || *p == ' ' || *p == '#' || *p == '0') { - switch (*p) { - case '-': flags->left_justify = true; break; - case '0': flags->zero_pad = true; break; - case '+': flags->show_sign = true; break; - case ' ': flags->space_prefix = true; break; - case '#': flags->alternate_form = true; break; - } - p++; - } - - // width - while (*p >= '0' && *p <= '9') { - *width = (*width * 10) + (*p - '0'); - p++; - } - - // precision - if (*p == '.') { - p++; - *precision = 0; - while (*p >= '0' && *p <= '9') { - *precision = (*precision * 10) + (*p - '0'); - p++; - } - } - - return p; -} - -static int int_to_str( - long long value, - char *buffer, - int base, - bool is_signed, - bool uppercase -) { - if (base < 2 || base > 16) return 0; - - const char *digits = uppercase ? "0123456789ABCDEF" : "0123456789abcdef"; - char temp[32]; - int i = 0, len = 0; - bool is_negative = false; - - if (value == 0) { - buffer[0] = '0'; - buffer[1] = '\0'; - return 1; - } - - if (is_signed && value < 0 && base == 10) { - is_negative = true; - value = -value; - } - - unsigned long long uval = (unsigned long long)value; - while (uval > 0) { - temp[i++] = digits[uval % base]; - uval /= base; - } - - if (is_negative) { - buffer[len++] = '-'; - } - - while (i > 0) { - buffer[len++] = temp[--i]; - } - - buffer[len] = '\0'; - return len; -} - -static int ptr_to_str(void *ptr, char *buffer) { - buffer[0] = '0'; - buffer[1] = 'x'; - int len = int_to_str((uintptr_t)ptr, buffer + 2, 16, 0, 0); - return 2 + len; -} - -char *strncpy(char *dest, const char *src, size_t n) { - char *d = dest; - const char *s = src; - while (n-- && (*d++ = *s++)); - if (n == (size_t)-1) *d = '\0'; - return dest; -} - -static int write_formatted_to_buffer( - char *buffer, - size_t buffer_size, - size_t *pos, - const char *str, - int width, - const format_flags_t *flags -) { - int len = strlen(str); - int written = 0; - int pad_len = (width > len) ? (width - len) : 0; - int zero_pad = flags->zero_pad && !flags->left_justify; - - if (!flags->left_justify && pad_len > 0) { - char pad_char = zero_pad ? '0' : ' '; - for (int i = 0; i < pad_len && *pos < buffer_size - 1; i++) { - buffer[(*pos)++] = pad_char; - written++; - } - } - - for (int i = 0; i < len && *pos < buffer_size - 1; i++) { - buffer[(*pos)++] = str[i]; - written++; - } - - if (flags->left_justify && pad_len > 0) { - for (int i = 0; i < pad_len && *pos < buffer_size - 1; i++) { - buffer[(*pos)++] = ' '; - written++; - } - } - - return written; -} - -static int vsnprintf_impl(char *buffer, size_t buffsz, const char *format, va_list args) { - if (!buffer || buffsz == 0 || !format) return -1; - - size_t pos = 0; - int total_chars = 0; - const char *p = format; - - while (*p) { - if (*p == '%') { - p++; - if (*p == '%') { - if (pos < buffsz - 1) buffer[pos++] = '%'; - total_chars++; - p++; - continue; - } - - int width, precision; - format_flags_t flags; - p = parse_format_spec(p, &width, &precision, &flags); - - char temp_buf[64]; - const char *output_str = temp_buf; - - switch (*p) { - case 's': { - const char *str = va_arg(args, const char*); - if (!str) str = "(null)"; - - int str_len = strlen(str); - if (precision >= 0 && str_len > precision) { - strncpy(temp_buf, str, precision); - temp_buf[precision] = '\0'; - output_str = temp_buf; - } else { - output_str = str; - } - break; - } - case 'd': - case 'i': { - int value = va_arg(args, int); - int_to_str(value, temp_buf, 10, true, false); - break; - } - case 'u': { - unsigned int value = va_arg(args, unsigned int); - int_to_str(value, temp_buf, 10, false, false); - break; - } - case 'x': { - unsigned int value = va_arg(args, unsigned int); - int_to_str(value, temp_buf, 16, false, false); - break; - } - case 'X': { - unsigned int value = va_arg(args, unsigned int); - int_to_str(value, temp_buf, 16, false, true); - break; - } - case 'p': { - void *ptr = va_arg(args, void*); - ptr_to_str(ptr, temp_buf); - break; - } - case 'c': { - int c = va_arg(args, int); - temp_buf[0] = (char)c; - temp_buf[1] = '\0'; - break; - } - case 'z': { - if (*(p + 1) == 'u') { - size_t value = va_arg(args, size_t); - int_to_str(value, temp_buf, 10, false, false); - p++; - } else { - temp_buf[0] = 'z'; - temp_buf[1] = '\0'; - } - break; - } - default: - temp_buf[0] = '%'; - temp_buf[1] = *p; - temp_buf[2] = '\0'; - break; - } - - int str_len = strlen(output_str); - int formatted_len = (width > str_len) ? width : str_len; - total_chars += formatted_len; - - if (pos < buffsz - 1) { - write_formatted_to_buffer(buffer, buffsz, &pos, output_str, width, &flags); - } - - } else { - if (pos < buffsz - 1) buffer[pos++] = *p; - total_chars++; - } - p++; - } - - if (buffsz > 0) buffer[pos < buffsz ? pos : buffsz - 1] = '\0'; - - return total_chars; -} - -int snprintf(char *restrict buffer, size_t buffsz, const char *restrict format, ...) { - if (!buffer || buffsz == 0 || !format) return -1; - - va_list args; - va_start(args, format); - int result = vsnprintf_impl(buffer, buffsz, format, args); - va_end(args); - - return result; -} - -int vsnprintf(char *restrict buffer, size_t buffsz, const char *restrict format, va_list vlist) { - return vsnprintf_impl(buffer, buffsz, format, vlist); -} - -int fclose(FILE *stream) { - return 0; -} - -FILE* fdopen(int fd, const char *mode) { - return 0; -} - -int fputc(int c, FILE *stream) { - return c; -} - -int fputs(const char *restrict str, FILE *restrict stream) { - return 0; -} - -size_t fwrite(const void *restrict buffer, size_t size, size_t nmemb, FILE *restrict stream) { - return size * nmemb; -} - -int fprintf(FILE *restrict stream, const char *restrict format, ...) { - return 0; -} diff --git a/crates/language/wasm/src/string.c b/crates/language/wasm/src/string.c deleted file mode 100644 index 2d0d9096..00000000 --- a/crates/language/wasm/src/string.c +++ /dev/null @@ -1,66 +0,0 @@ -#include - -int memcmp(const void *lhs, const void *rhs, size_t count) { - const unsigned char *l = lhs; - const unsigned char *r = rhs; - while (count--) { - if (*l != *r) { - return *l - *r; - } - l++; - r++; - } - return 0; -} - -void *memcpy(void *restrict dst, const void *restrict src, size_t size) { - unsigned char *d = dst; - const unsigned char *s = src; - while (size--) { - *d++ = *s++; - } - return dst; -} - -void *memmove(void *dst, const void *src, size_t count) { - unsigned char *d = dst; - const unsigned char *s = src; - if (d < s) { - while (count--) { - *d++ = *s++; - } - } else if (d > s) { - d += count; - s += count; - while (count--) { - *(--d) = *(--s); - } - } - return dst; -} - -void *memset(void *dst, int value, size_t count) { - unsigned char *p = dst; - while (count--) { - *p++ = (unsigned char)value; - } - return dst; -} - -int strncmp(const char *left, const char *right, size_t n) { - while (n-- > 0) { - if (*left != *right) { - return *(unsigned char *)left - *(unsigned char *)right; - } - if (*left == '\0') break; - left++; - right++; - } - return 0; -} - -size_t strlen(const char *str) { - const char *s = str; - while (*s) s++; - return s - str; -} diff --git a/crates/loader/LICENSE b/crates/loader/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/loader/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/loader/emscripten-version b/crates/loader/emscripten-version deleted file mode 100644 index af253c16..00000000 --- a/crates/loader/emscripten-version +++ /dev/null @@ -1 +0,0 @@ -4.0.15 diff --git a/crates/loader/src/loader.rs b/crates/loader/src/loader.rs deleted file mode 100644 index e7584378..00000000 --- a/crates/loader/src/loader.rs +++ /dev/null @@ -1,2054 +0,0 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] -#![cfg_attr(docsrs, feature(doc_cfg))] - -#[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] -use std::ops::Range; -#[cfg(feature = "tree-sitter-highlight")] -use std::sync::Mutex; -use std::{ - collections::HashMap, - env, fs, - hash::{Hash as _, Hasher as _}, - io::{BufRead, BufReader}, - marker::PhantomData, - mem, - path::{Path, PathBuf}, - process::Command, - sync::LazyLock, - time::{SystemTime, SystemTimeError}, -}; - -use etcetera::BaseStrategy as _; -use fs4::fs_std::FileExt; -use libloading::{Library, Symbol}; -use log::{error, info, warn}; -use once_cell::unsync::OnceCell; -use regex::{Regex, RegexBuilder}; -use semver::Version; -use serde::{Deserialize, Deserializer, Serialize}; -use thiserror::Error; -use tree_sitter::Language; -#[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] -use tree_sitter::QueryError; -#[cfg(feature = "tree-sitter-highlight")] -use tree_sitter::QueryErrorKind; -#[cfg(feature = "wasm")] -use tree_sitter::WasmError; -#[cfg(feature = "tree-sitter-highlight")] -use tree_sitter_highlight::HighlightConfiguration; -#[cfg(feature = "tree-sitter-tags")] -use tree_sitter_tags::{Error as TagsError, TagsConfiguration}; - -static GRAMMAR_NAME_REGEX: LazyLock = - LazyLock::new(|| Regex::new(r#""name":\s*"(.*?)""#).unwrap()); - -const WASI_SDK_VERSION: &str = include_str!("../wasi-sdk-version").trim_ascii(); - -pub type LoaderResult = Result; - -#[derive(Debug, Error)] -pub enum LoaderError { - #[error(transparent)] - Compiler(CompilerError), - #[error("Parser compilation failed.\nStdout: {0}\nStderr: {1}")] - Compilation(String, String), - #[error("Failed to execute curl for {0} -- {1}")] - Curl(String, std::io::Error), - #[error("Failed to load language in current directory:\n{0}")] - CurrentDirectoryLoad(Box), - #[error("External file path {0} is outside of parser directory {1}")] - ExternalFile(String, String), - #[error("Failed to extract archive {0} to {1}")] - Extraction(String, String), - #[error("Failed to load language for file name {0}:\n{1}")] - FileNameLoad(String, Box), - #[error("Failed to parse the language name from grammar.json at {0}")] - GrammarJSON(String), - #[error(transparent)] - HomeDir(#[from] etcetera::HomeDirError), - #[error(transparent)] - IO(IoError), - #[error(transparent)] - Library(LibraryError), - #[error("Failed to compare binary and source timestamps:\n{0}")] - ModifiedTime(Box), - #[error("No language found")] - NoLanguage, - #[error(transparent)] - Query(LoaderQueryError), - #[error(transparent)] - ScannerSymbols(ScannerSymbolError), - #[error("Failed to load language for scope '{0}':\n{1}")] - ScopeLoad(String, Box), - #[error(transparent)] - Serialization(#[from] serde_json::Error), - #[error(transparent)] - Symbol(SymbolError), - #[error(transparent)] - Tags(#[from] TagsError), - #[error("Failed to execute tar for {0} -- {1}")] - Tar(String, std::io::Error), - #[error(transparent)] - Time(#[from] SystemTimeError), - #[error("Unknown scope '{0}'")] - UnknownScope(String), - #[error("Failed to download wasi-sdk from {0}")] - WasiSDKDownload(String), - #[error(transparent)] - WasiSDKClang(#[from] WasiSDKClangError), - #[error("Unsupported platform for wasi-sdk")] - WasiSDKPlatform, - #[cfg(feature = "wasm")] - #[error(transparent)] - Wasm(#[from] WasmError), - #[error("Failed to run wasi-sdk clang -- {0}")] - WasmCompiler(std::io::Error), - #[error("wasi-sdk clang command failed: {0}")] - WasmCompilation(String), -} - -#[derive(Debug, Error)] -pub struct CompilerError { - pub error: std::io::Error, - pub command: Box, -} - -impl std::fmt::Display for CompilerError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Failed to execute the C compiler with the following command:\n{:?}\nError: {}", - *self.command, self.error - )?; - Ok(()) - } -} - -#[derive(Debug, Error)] -pub struct IoError { - pub error: std::io::Error, - pub path: Option, -} - -impl IoError { - fn new(error: std::io::Error, path: Option<&Path>) -> Self { - Self { - error, - path: path.map(|p| p.to_string_lossy().to_string()), - } - } -} - -impl std::fmt::Display for IoError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.error)?; - if let Some(ref path) = self.path { - write!(f, " ({path})")?; - } - Ok(()) - } -} - -#[derive(Debug, Error)] -pub struct LibraryError { - pub error: libloading::Error, - pub path: String, -} - -impl std::fmt::Display for LibraryError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Error opening dynamic library {} -- {}", - self.path, self.error - )?; - Ok(()) - } -} - -#[derive(Debug, Error)] -pub struct LoaderQueryError { - pub error: QueryError, - pub file: Option, -} - -impl std::fmt::Display for LoaderQueryError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(ref path) = self.file { - writeln!(f, "Error in query file {path}:")?; - } - write!(f, "{}", self.error)?; - Ok(()) - } -} - -#[derive(Debug, Error)] -pub struct SymbolError { - pub error: libloading::Error, - pub symbol_name: String, - pub path: String, -} - -impl std::fmt::Display for SymbolError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "Failed to load symbol {} from {} -- {}", - self.symbol_name, self.path, self.error - )?; - Ok(()) - } -} - -#[derive(Debug, Error)] -pub struct ScannerSymbolError { - pub missing: Vec, -} - -impl std::fmt::Display for ScannerSymbolError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!( - f, - "Missing required functions in the external scanner, parsing won't work without these!\n" - )?; - for symbol in &self.missing { - writeln!(f, " `{symbol}`")?; - } - writeln!( - f, - "You can read more about this at https://tree-sitter.github.io/tree-sitter/creating-parsers/4-external-scanners\n" - )?; - Ok(()) - } -} - -#[derive(Debug, Error)] -pub struct WasiSDKClangError { - pub wasi_sdk_dir: String, - pub possible_executables: Vec<&'static str>, - pub download: bool, -} - -impl std::fmt::Display for WasiSDKClangError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if self.download { - write!( - f, - "Failed to find clang executable in downloaded wasi-sdk at '{}'.", - self.wasi_sdk_dir - )?; - } else { - write!(f, "TREE_SITTER_WASI_SDK_PATH is set to '{}', but no clang executable found in 'bin/' directory.", self.wasi_sdk_dir)?; - } - - let possible_exes = self.possible_executables.join(", "); - write!(f, " Looked for: {possible_exes}.")?; - - Ok(()) - } -} - -pub const DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME: &str = "highlights.scm"; - -pub const DEFAULT_INJECTIONS_QUERY_FILE_NAME: &str = "injections.scm"; - -pub const DEFAULT_LOCALS_QUERY_FILE_NAME: &str = "locals.scm"; - -pub const DEFAULT_TAGS_QUERY_FILE_NAME: &str = "tags.scm"; - -#[derive(Default, Deserialize, Serialize)] -pub struct Config { - #[serde(default)] - #[serde( - rename = "parser-directories", - deserialize_with = "deserialize_parser_directories" - )] - pub parser_directories: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Default)] -#[serde(untagged)] -pub enum PathsJSON { - #[default] - Empty, - Single(PathBuf), - Multiple(Vec), -} - -impl PathsJSON { - fn into_vec(self) -> Option> { - match self { - Self::Empty => None, - Self::Single(s) => Some(vec![s]), - Self::Multiple(s) => Some(s), - } - } - - const fn is_empty(&self) -> bool { - matches!(self, Self::Empty) - } - - /// Represent this set of paths as a string that can be included in templates - #[must_use] - pub fn to_variable_value<'a>(&'a self, default: &'a PathBuf) -> &'a str { - match self { - Self::Empty => Some(default), - Self::Single(path_buf) => Some(path_buf), - Self::Multiple(paths) => paths.first(), - } - .map_or("", |path| path.as_os_str().to_str().unwrap_or("")) - } -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(untagged)] -pub enum PackageJSONAuthor { - String(String), - Object { - name: String, - email: Option, - url: Option, - }, -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(untagged)] -pub enum PackageJSONRepository { - String(String), - Object { url: String }, -} - -#[derive(Serialize, Deserialize)] -pub struct PackageJSON { - pub name: String, - pub version: Version, - pub description: Option, - pub author: Option, - pub maintainers: Option>, - pub license: Option, - pub repository: Option, - #[serde(default)] - #[serde(rename = "tree-sitter", skip_serializing_if = "Option::is_none")] - pub tree_sitter: Option>, -} - -fn default_path() -> PathBuf { - PathBuf::from(".") -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(rename_all = "kebab-case")] -pub struct LanguageConfigurationJSON { - #[serde(default = "default_path")] - pub path: PathBuf, - pub scope: Option, - pub file_types: Option>, - pub content_regex: Option, - pub first_line_regex: Option, - pub injection_regex: Option, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub highlights: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub injections: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub locals: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub tags: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub external_files: PathsJSON, -} - -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct TreeSitterJSON { - #[serde(rename = "$schema")] - pub schema: Option, - pub grammars: Vec, - pub metadata: Metadata, - #[serde(default)] - pub bindings: Bindings, -} - -impl TreeSitterJSON { - pub fn from_file(path: &Path) -> LoaderResult { - let path = path.join("tree-sitter.json"); - Ok(serde_json::from_str(&fs::read_to_string(&path).map_err( - |e| LoaderError::IO(IoError::new(e, Some(path.as_path()))), - )?)?) - } - - #[must_use] - pub fn has_multiple_language_configs(&self) -> bool { - self.grammars.len() > 1 - } -} - -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct Grammar { - pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub camelcase: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub title: Option, - pub scope: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub path: Option, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub external_files: PathsJSON, - pub file_types: Option>, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub highlights: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub injections: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub locals: PathsJSON, - #[serde(default, skip_serializing_if = "PathsJSON::is_empty")] - pub tags: PathsJSON, - #[serde(skip_serializing_if = "Option::is_none")] - pub injection_regex: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub first_line_regex: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub content_regex: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub class_name: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct Metadata { - pub version: Version, - #[serde(skip_serializing_if = "Option::is_none")] - pub license: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub authors: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub links: Option, - #[serde(skip)] - pub namespace: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct Author { - pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub email: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub url: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct Links { - pub repository: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub funding: Option, -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(default)] -pub struct Bindings { - pub c: bool, - pub go: bool, - pub java: bool, - #[serde(skip)] - pub kotlin: bool, - pub node: bool, - pub python: bool, - pub rust: bool, - pub swift: bool, - pub zig: bool, -} - -impl Bindings { - /// return available languages and its default enabled state. - #[must_use] - pub const fn languages(&self) -> [(&'static str, bool); 8] { - [ - ("c", true), - ("go", true), - ("java", false), - // Comment out Kotlin until the bindings are actually available. - // ("kotlin", false), - ("node", true), - ("python", true), - ("rust", true), - ("swift", true), - ("zig", false), - ] - } - - /// construct Bindings from a language list. If a language isn't supported, its name will be put on the error part. - pub fn with_enabled_languages<'a, I>(languages: I) -> Result - where - I: Iterator, - { - let mut out = Self { - c: false, - go: false, - java: false, - kotlin: false, - node: false, - python: false, - rust: false, - swift: false, - zig: false, - }; - - for v in languages { - match v { - "c" => out.c = true, - "go" => out.go = true, - "java" => out.java = true, - // Comment out Kotlin until the bindings are actually available. - // "kotlin" => out.kotlin = true, - "node" => out.node = true, - "python" => out.python = true, - "rust" => out.rust = true, - "swift" => out.swift = true, - "zig" => out.zig = true, - unsupported => return Err(unsupported), - } - } - - Ok(out) - } -} - -impl Default for Bindings { - fn default() -> Self { - Self { - c: true, - go: true, - java: false, - kotlin: false, - node: true, - python: true, - rust: true, - swift: true, - zig: false, - } - } -} - -// Replace `~` or `$HOME` with home path string. -// (While paths like "~/.tree-sitter/config.json" can be deserialized, -// they're not valid path for I/O modules.) -fn deserialize_parser_directories<'de, D>(deserializer: D) -> Result, D::Error> -where - D: Deserializer<'de>, -{ - let paths = Vec::::deserialize(deserializer)?; - let Ok(home) = etcetera::home_dir() else { - return Ok(paths); - }; - let standardized = paths - .into_iter() - .map(|path| standardize_path(path, &home)) - .collect(); - Ok(standardized) -} - -fn standardize_path(path: PathBuf, home: &Path) -> PathBuf { - if let Ok(p) = path.strip_prefix("~") { - return home.join(p); - } - if let Ok(p) = path.strip_prefix("$HOME") { - return home.join(p); - } - path -} - -impl Config { - #[must_use] - pub fn initial() -> Self { - let home_dir = etcetera::home_dir().expect("Cannot determine home directory"); - Self { - parser_directories: vec![ - home_dir.join("github"), - home_dir.join("src"), - home_dir.join("source"), - home_dir.join("projects"), - home_dir.join("dev"), - home_dir.join("git"), - ], - } - } -} - -const BUILD_TARGET: &str = env!("BUILD_TARGET"); - -pub struct LanguageConfiguration<'a> { - pub scope: Option, - pub content_regex: Option, - pub first_line_regex: Option, - pub injection_regex: Option, - pub file_types: Vec, - pub root_path: PathBuf, - pub highlights_filenames: Option>, - pub injections_filenames: Option>, - pub locals_filenames: Option>, - pub tags_filenames: Option>, - pub language_name: String, - language_id: usize, - #[cfg(feature = "tree-sitter-highlight")] - highlight_config: OnceCell>, - #[cfg(feature = "tree-sitter-tags")] - tags_config: OnceCell>, - #[cfg(feature = "tree-sitter-highlight")] - highlight_names: &'a Mutex>, - #[cfg(feature = "tree-sitter-highlight")] - use_all_highlight_names: bool, - _phantom: PhantomData<&'a ()>, -} - -pub struct Loader { - pub parser_lib_path: PathBuf, - languages_by_id: Vec<(PathBuf, OnceCell, Option>)>, - language_configurations: Vec>, - language_configuration_ids_by_file_type: HashMap>, - language_configuration_in_current_path: Option, - language_configuration_ids_by_first_line_regex: HashMap>, - #[cfg(feature = "tree-sitter-highlight")] - highlight_names: Box>>, - #[cfg(feature = "tree-sitter-highlight")] - use_all_highlight_names: bool, - debug_build: bool, - sanitize_build: bool, - force_rebuild: bool, - - #[cfg(feature = "wasm")] - wasm_store: Mutex>, -} - -pub struct CompileConfig<'a> { - pub src_path: &'a Path, - pub header_paths: Vec<&'a Path>, - pub parser_path: PathBuf, - pub scanner_path: Option, - pub external_files: Option<&'a [PathBuf]>, - pub output_path: Option, - pub flags: &'a [&'a str], - pub sanitize: bool, - pub name: String, -} - -impl<'a> CompileConfig<'a> { - #[must_use] - pub fn new( - src_path: &'a Path, - externals: Option<&'a [PathBuf]>, - output_path: Option, - ) -> Self { - Self { - src_path, - header_paths: vec![src_path], - parser_path: src_path.join("parser.c"), - scanner_path: None, - external_files: externals, - output_path, - flags: &[], - sanitize: false, - name: String::new(), - } - } -} - -unsafe impl Sync for Loader {} - -impl Loader { - pub fn new() -> LoaderResult { - let parser_lib_path = if let Ok(path) = env::var("TREE_SITTER_LIBDIR") { - PathBuf::from(path) - } else { - if cfg!(target_os = "macos") { - let legacy_apple_path = etcetera::base_strategy::Apple::new()? - .cache_dir() // `$HOME/Library/Caches/` - .join("tree-sitter"); - if legacy_apple_path.exists() && legacy_apple_path.is_dir() { - std::fs::remove_dir_all(&legacy_apple_path).map_err(|e| { - LoaderError::IO(IoError::new(e, Some(legacy_apple_path.as_path()))) - })?; - } - } - - etcetera::choose_base_strategy()? - .cache_dir() - .join("tree-sitter") - .join("lib") - }; - Ok(Self::with_parser_lib_path(parser_lib_path)) - } - - #[must_use] - pub fn with_parser_lib_path(parser_lib_path: PathBuf) -> Self { - Self { - parser_lib_path, - languages_by_id: Vec::new(), - language_configurations: Vec::new(), - language_configuration_ids_by_file_type: HashMap::new(), - language_configuration_in_current_path: None, - language_configuration_ids_by_first_line_regex: HashMap::new(), - #[cfg(feature = "tree-sitter-highlight")] - highlight_names: Box::new(Mutex::new(Vec::new())), - #[cfg(feature = "tree-sitter-highlight")] - use_all_highlight_names: true, - debug_build: false, - sanitize_build: false, - force_rebuild: false, - - #[cfg(feature = "wasm")] - wasm_store: Mutex::default(), - } - } - - #[cfg(feature = "tree-sitter-highlight")] - #[cfg_attr(docsrs, doc(cfg(feature = "tree-sitter-highlight")))] - pub fn configure_highlights(&mut self, names: &[String]) { - self.use_all_highlight_names = false; - let mut highlights = self.highlight_names.lock().unwrap(); - highlights.clear(); - highlights.extend(names.iter().cloned()); - } - - #[must_use] - #[cfg(feature = "tree-sitter-highlight")] - #[cfg_attr(docsrs, doc(cfg(feature = "tree-sitter-highlight")))] - pub fn highlight_names(&self) -> Vec { - self.highlight_names.lock().unwrap().clone() - } - - pub fn find_all_languages(&mut self, config: &Config) -> LoaderResult<()> { - if config.parser_directories.is_empty() { - warn!(concat!( - "You have not configured any parser directories!\n", - "Please run `tree-sitter init-config` and edit the resulting\n", - "configuration file to indicate where we should look for\n", - "language grammars.\n" - )); - } - for parser_container_dir in &config.parser_directories { - if let Ok(entries) = fs::read_dir(parser_container_dir) { - for entry in entries { - let entry = entry.map_err(|e| LoaderError::IO(IoError::new(e, None)))?; - if let Some(parser_dir_name) = entry.file_name().to_str() { - if parser_dir_name.starts_with("tree-sitter-") { - self.find_language_configurations_at_path( - &parser_container_dir.join(parser_dir_name), - false, - ) - .ok(); - } - } - } - } - } - Ok(()) - } - - pub fn languages_at_path(&mut self, path: &Path) -> LoaderResult> { - if let Ok(configurations) = self.find_language_configurations_at_path(path, true) { - let mut language_ids = configurations - .iter() - .map(|c| (c.language_id, c.language_name.clone())) - .collect::>(); - language_ids.sort_unstable(); - language_ids.dedup(); - language_ids - .into_iter() - .map(|(id, name)| Ok((self.language_for_id(id)?, name))) - .collect::>>() - } else { - Ok(Vec::new()) - } - } - - #[must_use] - pub fn get_all_language_configurations(&self) -> Vec<(&LanguageConfiguration<'static>, &Path)> { - self.language_configurations - .iter() - .map(|c| (c, self.languages_by_id[c.language_id].0.as_ref())) - .collect() - } - - pub fn language_configuration_for_scope( - &self, - scope: &str, - ) -> LoaderResult)>> { - for configuration in &self.language_configurations { - if configuration.scope.as_ref().is_some_and(|s| s == scope) { - let language = self.language_for_id(configuration.language_id)?; - return Ok(Some((language, configuration))); - } - } - Ok(None) - } - - pub fn language_configuration_for_first_line_regex( - &self, - path: &Path, - ) -> LoaderResult)>> { - self.language_configuration_ids_by_first_line_regex - .iter() - .try_fold(None, |_, (regex, ids)| { - if let Some(regex) = Self::regex(Some(regex)) { - let file = fs::File::open(path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))?; - let reader = BufReader::new(file); - let first_line = reader - .lines() - .next() - .transpose() - .map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))?; - if let Some(first_line) = first_line { - if regex.is_match(&first_line) && !ids.is_empty() { - let configuration = &self.language_configurations[ids[0]]; - let language = self.language_for_id(configuration.language_id)?; - return Ok(Some((language, configuration))); - } - } - } - - Ok(None) - }) - } - - pub fn language_configuration_for_file_name( - &self, - path: &Path, - ) -> LoaderResult)>> { - // Find all the language configurations that match this file name - // or a suffix of the file name. - let configuration_ids = path - .file_name() - .and_then(|n| n.to_str()) - .and_then(|file_name| self.language_configuration_ids_by_file_type.get(file_name)) - .or_else(|| { - let mut path = path.to_owned(); - let mut extensions = Vec::with_capacity(2); - while let Some(extension) = path.extension() { - extensions.push(extension.to_str()?.to_string()); - path = PathBuf::from(path.file_stem()?.to_os_string()); - } - extensions.reverse(); - self.language_configuration_ids_by_file_type - .get(&extensions.join(".")) - }); - - if let Some(configuration_ids) = configuration_ids { - if !configuration_ids.is_empty() { - let configuration = if configuration_ids.len() == 1 { - &self.language_configurations[configuration_ids[0]] - } - // If multiple language configurations match, then determine which - // one to use by applying the configurations' content regexes. - else { - let file_contents = - fs::read(path).map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))?; - let file_contents = String::from_utf8_lossy(&file_contents); - let mut best_score = -2isize; - let mut best_configuration_id = None; - for configuration_id in configuration_ids { - let config = &self.language_configurations[*configuration_id]; - - // If the language configuration has a content regex, assign - // a score based on the length of the first match. - let score; - if let Some(content_regex) = &config.content_regex { - if let Some(mat) = content_regex.find(&file_contents) { - score = (mat.end() - mat.start()) as isize; - } - // If the content regex does not match, then *penalize* this - // language configuration, so that language configurations - // without content regexes are preferred over those with - // non-matching content regexes. - else { - score = -1; - } - } else { - score = 0; - } - if score > best_score { - best_configuration_id = Some(*configuration_id); - best_score = score; - } - } - - &self.language_configurations[best_configuration_id.unwrap()] - }; - - let language = self.language_for_id(configuration.language_id)?; - return Ok(Some((language, configuration))); - } - } - - Ok(None) - } - - pub fn language_configuration_for_injection_string( - &self, - string: &str, - ) -> LoaderResult)>> { - let mut best_match_length = 0; - let mut best_match_position = None; - for (i, configuration) in self.language_configurations.iter().enumerate() { - if let Some(injection_regex) = &configuration.injection_regex { - if let Some(mat) = injection_regex.find(string) { - let length = mat.end() - mat.start(); - if length > best_match_length { - best_match_position = Some(i); - best_match_length = length; - } - } - } - } - - if let Some(i) = best_match_position { - let configuration = &self.language_configurations[i]; - let language = self.language_for_id(configuration.language_id)?; - Ok(Some((language, configuration))) - } else { - Ok(None) - } - } - - pub fn language_for_configuration( - &self, - configuration: &LanguageConfiguration, - ) -> LoaderResult { - self.language_for_id(configuration.language_id) - } - - fn language_for_id(&self, id: usize) -> LoaderResult { - let (path, language, externals) = &self.languages_by_id[id]; - language - .get_or_try_init(|| { - let src_path = path.join("src"); - self.load_language_at_path(CompileConfig::new( - &src_path, - externals.as_deref(), - None, - )) - }) - .cloned() - } - - pub fn compile_parser_at_path( - &self, - grammar_path: &Path, - output_path: PathBuf, - flags: &[&str], - ) -> LoaderResult<()> { - let src_path = grammar_path.join("src"); - let mut config = CompileConfig::new(&src_path, None, Some(output_path)); - config.flags = flags; - self.load_language_at_path(config).map(|_| ()) - } - - pub fn load_language_at_path(&self, mut config: CompileConfig) -> LoaderResult { - let grammar_path = config.src_path.join("grammar.json"); - config.name = Self::grammar_json_name(&grammar_path)?; - self.load_language_at_path_with_name(config) - } - - pub fn load_language_at_path_with_name( - &self, - mut config: CompileConfig, - ) -> LoaderResult { - let mut lib_name = config.name.clone(); - let language_fn_name = format!("tree_sitter_{}", config.name.replace('-', "_")); - if self.debug_build { - lib_name.push_str(".debug._"); - } - - if self.sanitize_build { - lib_name.push_str(".sanitize._"); - config.sanitize = true; - } - - if config.output_path.is_none() { - fs::create_dir_all(&self.parser_lib_path).map_err(|e| { - LoaderError::IO(IoError::new(e, Some(self.parser_lib_path.as_path()))) - })?; - } - - let mut recompile = self.force_rebuild || config.output_path.is_some(); // if specified, always recompile - - let output_path = config.output_path.unwrap_or_else(|| { - let mut path = self.parser_lib_path.join(lib_name); - path.set_extension(env::consts::DLL_EXTENSION); - #[cfg(feature = "wasm")] - if self.wasm_store.lock().unwrap().is_some() { - path.set_extension("wasm"); - } - path - }); - config.output_path = Some(output_path.clone()); - - let parser_path = config.src_path.join("parser.c"); - config.scanner_path = self.get_scanner_path(config.src_path); - - let mut paths_to_check = vec![parser_path]; - - if let Some(scanner_path) = config.scanner_path.as_ref() { - paths_to_check.push(scanner_path.clone()); - } - - paths_to_check.extend( - config - .external_files - .unwrap_or_default() - .iter() - .map(|p| config.src_path.join(p)), - ); - - if !recompile { - recompile = needs_recompile(&output_path, &paths_to_check)?; - } - - #[cfg(feature = "wasm")] - if let Some(wasm_store) = self.wasm_store.lock().unwrap().as_mut() { - if recompile { - self.compile_parser_to_wasm( - &config.name, - config.src_path, - config - .scanner_path - .as_ref() - .and_then(|p| p.strip_prefix(config.src_path).ok()), - &output_path, - )?; - } - - let wasm_bytes = fs::read(&output_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(output_path.as_path()))))?; - return Ok(wasm_store.load_language(&config.name, &wasm_bytes)?); - } - - // Create a unique lock path based on the output path hash to prevent - // interference when multiple processes build the same grammar (by name) - // to different output locations - let lock_hash = { - let mut hasher = std::hash::DefaultHasher::new(); - output_path.hash(&mut hasher); - format!("{:x}", hasher.finish()) - }; - - let lock_path = if env::var("CROSS_RUNNER").is_ok() { - tempfile::tempdir() - .expect("create a temp dir") - .path() - .to_path_buf() - } else { - etcetera::choose_base_strategy()?.cache_dir() - } - .join("tree-sitter") - .join("lock") - .join(format!("{}-{lock_hash}.lock", config.name)); - - if let Ok(lock_file) = fs::OpenOptions::new().write(true).open(&lock_path) { - recompile = false; - if lock_file.try_lock_exclusive().is_err() { - // if we can't acquire the lock, another process is compiling the parser, wait for - // it and don't recompile - lock_file - .lock_exclusive() - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; - recompile = false; - } else { - // if we can acquire the lock, check if the lock file is older than 30 seconds, a - // run that was interrupted and left the lock file behind should not block - // subsequent runs - let time = lock_file - .metadata() - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))? - .modified() - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))? - .elapsed()? - .as_secs(); - if time > 30 { - fs::remove_file(&lock_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; - recompile = true; - } - } - } - - if recompile { - let parent_path = lock_path.parent().unwrap(); - fs::create_dir_all(parent_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(parent_path))))?; - let lock_file = fs::OpenOptions::new() - .create(true) - .truncate(true) - .write(true) - .open(&lock_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; - lock_file - .lock_exclusive() - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path.as_path()))))?; - - self.compile_parser_to_dylib(&config, &lock_file, &lock_path)?; - - if config.scanner_path.is_some() { - self.check_external_scanner(&config.name, &output_path)?; - } - } - - // Ensure the dynamic library exists before trying to load it. This can - // happen in race conditions where we couldn't acquire the lock because - // another process was compiling but it still hasn't finished by the - // time we reach this point, so the output file still doesn't exist. - // - // Instead of allowing the `load_language` call below to fail, return a - // clearer error to the user here. - if !output_path.exists() { - let msg = format!( - "Dynamic library `{}` not found after build attempt. \ - Are you running multiple processes building to the same output location?", - output_path.display() - ); - - Err(LoaderError::IO(IoError::new( - std::io::Error::new(std::io::ErrorKind::NotFound, msg), - Some(output_path.as_path()), - )))?; - } - - Self::load_language(&output_path, &language_fn_name) - } - - pub fn load_language(path: &Path, function_name: &str) -> LoaderResult { - let library = unsafe { Library::new(path) }.map_err(|e| { - LoaderError::Library(LibraryError { - error: e, - path: path.to_string_lossy().to_string(), - }) - })?; - let language = unsafe { - let language_fn = library - .get:: Language>>(function_name.as_bytes()) - .map_err(|e| { - LoaderError::Symbol(SymbolError { - error: e, - symbol_name: function_name.to_string(), - path: path.to_string_lossy().to_string(), - }) - })?; - language_fn() - }; - mem::forget(library); - Ok(language) - } - - fn compile_parser_to_dylib( - &self, - config: &CompileConfig, - lock_file: &fs::File, - lock_path: &Path, - ) -> LoaderResult<()> { - let mut cc_config = cc::Build::new(); - cc_config - .cargo_metadata(false) - .cargo_warnings(false) - .target(BUILD_TARGET) - // BUILD_TARGET from the build environment becomes a runtime host for cc. - // Otherwise, when cross compiled, cc will keep looking for a cross-compiler - // on the target system instead of the native compiler. - .host(BUILD_TARGET) - .debug(self.debug_build) - .file(&config.parser_path) - .includes(&config.header_paths) - .std("c11"); - - if let Some(scanner_path) = config.scanner_path.as_ref() { - cc_config.file(scanner_path); - } - - if self.debug_build { - cc_config.opt_level(0).extra_warnings(true); - } else { - cc_config.opt_level(2).extra_warnings(false); - } - - for flag in config.flags { - cc_config.define(flag, None); - } - - let compiler = cc_config.get_compiler(); - let mut command = Command::new(compiler.path()); - command.args(compiler.args()); - for (key, value) in compiler.env() { - command.env(key, value); - } - - let output_path = config.output_path.as_ref().unwrap(); - - let temp_dir = if compiler.is_like_msvc() { - let out = format!("-out:{}", output_path.to_str().unwrap()); - command.arg(if self.debug_build { "-LDd" } else { "-LD" }); - command.arg("-utf-8"); - - // Windows creates intermediate files when compiling (.exp, .lib, .obj), which causes - // issues when multiple processes are compiling in the same directory. This creates a - // temporary directory for those files to go into, which is deleted after compilation. - let temp_dir = output_path.parent().unwrap().join(format!( - "tmp_{}_{:?}", - std::process::id(), - std::thread::current().id() - )); - std::fs::create_dir_all(&temp_dir).unwrap(); - - command.arg(format!("/Fo{}\\", temp_dir.display())); - command.args(cc_config.get_files()); - command.arg("-link").arg(out); - command.arg(format!("/IMPLIB:{}.lib", temp_dir.join("temp").display())); - - Some(temp_dir) - } else { - command.arg("-Werror=implicit-function-declaration"); - if cfg!(any(target_os = "macos", target_os = "ios")) { - command.arg("-dynamiclib"); - // TODO: remove when supported - command.arg("-UTREE_SITTER_REUSE_ALLOCATOR"); - } else { - command.arg("-shared"); - } - command.args(cc_config.get_files()); - command.arg("-o").arg(output_path); - - None - }; - - let output = command.output().map_err(|e| { - LoaderError::Compiler(CompilerError { - error: e, - command: Box::new(command), - }) - })?; - - if let Some(temp_dir) = temp_dir { - let _ = fs::remove_dir_all(temp_dir); - } - - FileExt::unlock(lock_file) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path))))?; - fs::remove_file(lock_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(lock_path))))?; - - if output.status.success() { - Ok(()) - } else { - Err(LoaderError::Compilation( - String::from_utf8_lossy(&output.stdout).to_string(), - String::from_utf8_lossy(&output.stderr).to_string(), - )) - } - } - - #[cfg(unix)] - fn check_external_scanner(&self, name: &str, library_path: &Path) -> LoaderResult<()> { - let prefix = if cfg!(any(target_os = "macos", target_os = "ios")) { - "_" - } else { - "" - }; - let section = if cfg!(all(target_arch = "powerpc64", target_os = "linux")) { - " D " - } else { - " T " - }; - let mut must_have = vec![ - format!("{prefix}tree_sitter_{name}_external_scanner_create"), - format!("{prefix}tree_sitter_{name}_external_scanner_destroy"), - format!("{prefix}tree_sitter_{name}_external_scanner_serialize"), - format!("{prefix}tree_sitter_{name}_external_scanner_deserialize"), - format!("{prefix}tree_sitter_{name}_external_scanner_scan"), - ]; - - let nm_cmd = env::var("NM").unwrap_or_else(|_| "nm".to_owned()); - let command = Command::new(nm_cmd) - .arg("--defined-only") - .arg(library_path) - .output(); - if let Ok(output) = command { - if output.status.success() { - let mut found_non_static = false; - for line in String::from_utf8_lossy(&output.stdout).lines() { - if line.contains(section) { - if let Some(function_name) = - line.split_whitespace().collect::>().get(2) - { - if !line.contains("tree_sitter_") { - if !found_non_static { - found_non_static = true; - warn!("Found non-static non-tree-sitter functions in the external scanner"); - } - warn!(" `{function_name}`"); - } else { - must_have.retain(|f| f != function_name); - } - } - } - } - if found_non_static { - warn!(concat!( - "Consider making these functions static, they can cause conflicts ", - "when another tree-sitter project uses the same function name." - )); - } - - if !must_have.is_empty() { - return Err(LoaderError::ScannerSymbols(ScannerSymbolError { - missing: must_have, - })); - } - } - } else { - warn!( - "Failed to run `nm` to verify symbols in {}", - library_path.display() - ); - } - - Ok(()) - } - - #[cfg(windows)] - fn check_external_scanner(&self, _name: &str, _library_path: &Path) -> LoaderResult<()> { - // TODO: there's no nm command on windows, whoever wants to implement this can and should :) - - // let mut must_have = vec![ - // format!("tree_sitter_{name}_external_scanner_create"), - // format!("tree_sitter_{name}_external_scanner_destroy"), - // format!("tree_sitter_{name}_external_scanner_serialize"), - // format!("tree_sitter_{name}_external_scanner_deserialize"), - // format!("tree_sitter_{name}_external_scanner_scan"), - // ]; - - Ok(()) - } - - pub fn compile_parser_to_wasm( - &self, - language_name: &str, - src_path: &Path, - scanner_filename: Option<&Path>, - output_path: &Path, - ) -> LoaderResult<()> { - let clang_executable = self.ensure_wasi_sdk_exists()?; - - let mut command = Command::new(&clang_executable); - command.current_dir(src_path).args([ - "-o", - output_path.to_str().unwrap(), - "-fPIC", - "-shared", - if self.debug_build { "-g" } else { "-Os" }, - format!("-Wl,--export=tree_sitter_{language_name}").as_str(), - "-Wl,--allow-undefined", - "-Wl,--no-entry", - "-nostdlib", - "-fno-exceptions", - "-fvisibility=hidden", - "-I", - ".", - "parser.c", - ]); - - if let Some(scanner_filename) = scanner_filename { - command.arg(scanner_filename); - } - - let output = command.output().map_err(LoaderError::WasmCompiler)?; - - if !output.status.success() { - return Err(LoaderError::WasmCompilation( - String::from_utf8_lossy(&output.stderr).to_string(), - )); - } - - Ok(()) - } - - /// Extracts a tar.gz archive with `tar`, stripping the first path component. - fn extract_tar_gz_with_strip( - &self, - archive_path: &Path, - destination: &Path, - ) -> LoaderResult<()> { - let status = Command::new("tar") - .arg("-xzf") - .arg(archive_path) - .arg("--strip-components=1") - .arg("-C") - .arg(destination) - .status() - .map_err(|e| LoaderError::Tar(archive_path.to_string_lossy().to_string(), e))?; - - if !status.success() { - return Err(LoaderError::Extraction( - archive_path.to_string_lossy().to_string(), - destination.to_string_lossy().to_string(), - )); - } - - Ok(()) - } - - /// This ensures that the wasi-sdk is available, downloading and extracting it if necessary, - /// and returns the path to the `clang` executable. - /// - /// If `TREE_SITTER_WASI_SDK_PATH` is set, it will use that path to look for the clang executable. - fn ensure_wasi_sdk_exists(&self) -> LoaderResult { - let possible_executables = if cfg!(windows) { - vec![ - "clang.exe", - "wasm32-unknown-wasi-clang.exe", - "wasm32-wasi-clang.exe", - ] - } else { - vec!["clang", "wasm32-unknown-wasi-clang", "wasm32-wasi-clang"] - }; - - if let Ok(wasi_sdk_path) = std::env::var("TREE_SITTER_WASI_SDK_PATH") { - let wasi_sdk_dir = PathBuf::from(wasi_sdk_path); - - for exe in &possible_executables { - let clang_exe = wasi_sdk_dir.join("bin").join(exe); - if clang_exe.exists() { - return Ok(clang_exe); - } - } - - return Err(LoaderError::WasiSDKClang(WasiSDKClangError { - wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), - possible_executables, - download: false, - })); - } - - let cache_dir = etcetera::choose_base_strategy()? - .cache_dir() - .join("tree-sitter"); - fs::create_dir_all(&cache_dir) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(cache_dir.as_path()))))?; - - let wasi_sdk_dir = cache_dir.join("wasi-sdk"); - - for exe in &possible_executables { - let clang_exe = wasi_sdk_dir.join("bin").join(exe); - if clang_exe.exists() { - return Ok(clang_exe); - } - } - - fs::create_dir_all(&wasi_sdk_dir) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(wasi_sdk_dir.as_path()))))?; - - let arch_os = if cfg!(target_os = "macos") { - if cfg!(target_arch = "aarch64") { - "arm64-macos" - } else { - "x86_64-macos" - } - } else if cfg!(target_os = "windows") { - if cfg!(target_arch = "aarch64") { - "arm64-windows" - } else { - "x86_64-windows" - } - } else if cfg!(target_os = "linux") { - if cfg!(target_arch = "aarch64") { - "arm64-linux" - } else { - "x86_64-linux" - } - } else { - return Err(LoaderError::WasiSDKPlatform); - }; - - let sdk_filename = format!("wasi-sdk-{WASI_SDK_VERSION}-{arch_os}.tar.gz"); - let wasi_sdk_major_version = WASI_SDK_VERSION - .trim_end_matches(char::is_numeric) // trim minor version... - .trim_end_matches('.'); // ...and '.' separator - let sdk_url = format!( - "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-{wasi_sdk_major_version}/{sdk_filename}", - ); - - info!("Downloading wasi-sdk from {sdk_url}..."); - let temp_tar_path = cache_dir.join(sdk_filename); - - let status = Command::new("curl") - .arg("-f") - .arg("-L") - .arg("-o") - .arg(&temp_tar_path) - .arg(&sdk_url) - .status() - .map_err(|e| LoaderError::Curl(sdk_url.clone(), e))?; - - if !status.success() { - return Err(LoaderError::WasiSDKDownload(sdk_url)); - } - - info!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display()); - self.extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir)?; - - fs::remove_file(temp_tar_path).ok(); - for exe in &possible_executables { - let clang_exe = wasi_sdk_dir.join("bin").join(exe); - if clang_exe.exists() { - return Ok(clang_exe); - } - } - - Err(LoaderError::WasiSDKClang(WasiSDKClangError { - wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), - possible_executables, - download: true, - })) - } - - #[must_use] - #[cfg(feature = "tree-sitter-highlight")] - pub fn highlight_config_for_injection_string<'a>( - &'a self, - string: &str, - ) -> Option<&'a HighlightConfiguration> { - match self.language_configuration_for_injection_string(string) { - Err(e) => { - error!("Failed to load language for injection string '{string}': {e}",); - None - } - Ok(None) => None, - Ok(Some((language, configuration))) => { - match configuration.highlight_config(language, None) { - Err(e) => { - error!( - "Failed to load higlight config for injection string '{string}': {e}" - ); - None - } - Ok(None) => None, - Ok(Some(config)) => Some(config), - } - } - } - } - - #[must_use] - pub fn get_language_configuration_in_current_path( - &self, - ) -> Option<&LanguageConfiguration<'static>> { - self.language_configuration_in_current_path - .map(|i| &self.language_configurations[i]) - } - - pub fn find_language_configurations_at_path( - &mut self, - parser_path: &Path, - set_current_path_config: bool, - ) -> LoaderResult<&[LanguageConfiguration<'static>]> { - let initial_language_configuration_count = self.language_configurations.len(); - - match TreeSitterJSON::from_file(parser_path) { - Ok(config) => { - let language_count = self.languages_by_id.len(); - for grammar in config.grammars { - // Determine the path to the parser directory. This can be specified in - // the tree-sitter.json, but defaults to the directory containing the - // tree-sitter.json. - let language_path = - parser_path.join(grammar.path.unwrap_or(PathBuf::from("."))); - - // Determine if a previous language configuration in this package.json file - // already uses the same language. - let mut language_id = None; - for (id, (path, _, _)) in - self.languages_by_id.iter().enumerate().skip(language_count) - { - if language_path == *path { - language_id = Some(id); - } - } - - // If not, add a new language path to the list. - let language_id = if let Some(language_id) = language_id { - language_id - } else { - self.languages_by_id.push(( - language_path, - OnceCell::new(), - grammar - .external_files - .clone() - .into_vec() - .map(|files| { - files - .into_iter() - .map(|path| { - let path = parser_path.join(path); - // prevent p being above/outside of parser_path - if path.starts_with(parser_path) { - Ok(path) - } else { - Err(LoaderError::ExternalFile( - path.to_string_lossy().to_string(), - parser_path.to_string_lossy().to_string(), - )) - } - }) - .collect::>>() - }) - .transpose()?, - )); - self.languages_by_id.len() - 1 - }; - - let configuration = LanguageConfiguration { - root_path: parser_path.to_path_buf(), - language_name: grammar.name, - scope: Some(grammar.scope), - language_id, - file_types: grammar.file_types.unwrap_or_default(), - content_regex: Self::regex(grammar.content_regex.as_deref()), - first_line_regex: Self::regex(grammar.first_line_regex.as_deref()), - injection_regex: Self::regex(grammar.injection_regex.as_deref()), - injections_filenames: grammar.injections.into_vec(), - locals_filenames: grammar.locals.into_vec(), - tags_filenames: grammar.tags.into_vec(), - highlights_filenames: grammar.highlights.into_vec(), - #[cfg(feature = "tree-sitter-highlight")] - highlight_config: OnceCell::new(), - #[cfg(feature = "tree-sitter-tags")] - tags_config: OnceCell::new(), - #[cfg(feature = "tree-sitter-highlight")] - highlight_names: &self.highlight_names, - #[cfg(feature = "tree-sitter-highlight")] - use_all_highlight_names: self.use_all_highlight_names, - _phantom: PhantomData, - }; - - for file_type in &configuration.file_types { - self.language_configuration_ids_by_file_type - .entry(file_type.clone()) - .or_default() - .push(self.language_configurations.len()); - } - if let Some(first_line_regex) = &configuration.first_line_regex { - self.language_configuration_ids_by_first_line_regex - .entry(first_line_regex.to_string()) - .or_default() - .push(self.language_configurations.len()); - } - - self.language_configurations.push(unsafe { - mem::transmute::, LanguageConfiguration<'static>>( - configuration, - ) - }); - - if set_current_path_config - && self.language_configuration_in_current_path.is_none() - { - self.language_configuration_in_current_path = - Some(self.language_configurations.len() - 1); - } - } - } - Err(LoaderError::Serialization(e)) => { - warn!( - "Failed to parse {} -- {e}", - parser_path.join("tree-sitter.json").display() - ); - } - _ => {} - } - - // If we didn't find any language configurations in the tree-sitter.json file, - // but there is a grammar.json file, then use the grammar file to form a simple - // language configuration. - if self.language_configurations.len() == initial_language_configuration_count - && parser_path.join("src").join("grammar.json").exists() - { - let grammar_path = parser_path.join("src").join("grammar.json"); - let language_name = Self::grammar_json_name(&grammar_path)?; - let configuration = LanguageConfiguration { - root_path: parser_path.to_owned(), - language_name, - language_id: self.languages_by_id.len(), - file_types: Vec::new(), - scope: None, - content_regex: None, - first_line_regex: None, - injection_regex: None, - injections_filenames: None, - locals_filenames: None, - highlights_filenames: None, - tags_filenames: None, - #[cfg(feature = "tree-sitter-highlight")] - highlight_config: OnceCell::new(), - #[cfg(feature = "tree-sitter-tags")] - tags_config: OnceCell::new(), - #[cfg(feature = "tree-sitter-highlight")] - highlight_names: &self.highlight_names, - #[cfg(feature = "tree-sitter-highlight")] - use_all_highlight_names: self.use_all_highlight_names, - _phantom: PhantomData, - }; - self.language_configurations.push(unsafe { - mem::transmute::, LanguageConfiguration<'static>>( - configuration, - ) - }); - self.languages_by_id - .push((parser_path.to_owned(), OnceCell::new(), None)); - } - - Ok(&self.language_configurations[initial_language_configuration_count..]) - } - - fn regex(pattern: Option<&str>) -> Option { - pattern.and_then(|r| RegexBuilder::new(r).multi_line(true).build().ok()) - } - - fn grammar_json_name(grammar_path: &Path) -> LoaderResult { - let file = fs::File::open(grammar_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(grammar_path))))?; - - let first_three_lines = BufReader::new(file) - .lines() - .take(3) - .collect::, std::io::Error>>() - .map_err(|_| LoaderError::GrammarJSON(grammar_path.to_string_lossy().to_string()))? - .join("\n"); - - let name = GRAMMAR_NAME_REGEX - .captures(&first_three_lines) - .and_then(|c| c.get(1)) - .ok_or_else(|| LoaderError::GrammarJSON(grammar_path.to_string_lossy().to_string()))?; - - Ok(name.as_str().to_string()) - } - - pub fn select_language( - &mut self, - path: Option<&Path>, - current_dir: &Path, - scope: Option<&str>, - // path to dynamic library, name of language - lib_info: Option<&(PathBuf, &str)>, - ) -> LoaderResult { - if let Some((ref lib_path, language_name)) = lib_info { - let language_fn_name = format!("tree_sitter_{}", language_name.replace('-', "_")); - Self::load_language(lib_path, &language_fn_name) - } else if let Some(scope) = scope { - if let Some(config) = self - .language_configuration_for_scope(scope) - .map_err(|e| LoaderError::ScopeLoad(scope.to_string(), Box::new(e)))? - { - Ok(config.0) - } else { - Err(LoaderError::UnknownScope(scope.to_string())) - } - } else if let Some((lang, _)) = if let Some(path) = path { - self.language_configuration_for_file_name(path) - .map_err(|e| { - LoaderError::FileNameLoad( - path.file_name().unwrap().to_string_lossy().to_string(), - Box::new(e), - ) - })? - } else { - None - } { - Ok(lang) - } else if let Some(id) = self.language_configuration_in_current_path { - Ok(self.language_for_id(self.language_configurations[id].language_id)?) - } else if let Some(lang) = self - .languages_at_path(current_dir) - .map_err(|e| LoaderError::CurrentDirectoryLoad(Box::new(e)))? - .first() - .cloned() - { - Ok(lang.0) - } else if let Some(lang) = if let Some(path) = path { - self.language_configuration_for_first_line_regex(path)? - } else { - None - } { - Ok(lang.0) - } else { - Err(LoaderError::NoLanguage) - } - } - - pub const fn debug_build(&mut self, flag: bool) { - self.debug_build = flag; - } - - pub const fn sanitize_build(&mut self, flag: bool) { - self.sanitize_build = flag; - } - - pub const fn force_rebuild(&mut self, rebuild: bool) { - self.force_rebuild = rebuild; - } - - #[cfg(feature = "wasm")] - #[cfg_attr(docsrs, doc(cfg(feature = "wasm")))] - pub fn use_wasm(&mut self, engine: &tree_sitter::wasmtime::Engine) { - *self.wasm_store.lock().unwrap() = Some(tree_sitter::WasmStore::new(engine).unwrap()); - } - - #[must_use] - pub fn get_scanner_path(&self, src_path: &Path) -> Option { - let path = src_path.join("scanner.c"); - path.exists().then_some(path) - } -} - -impl LanguageConfiguration<'_> { - #[cfg(feature = "tree-sitter-highlight")] - pub fn highlight_config( - &self, - language: Language, - paths: Option<&[PathBuf]>, - ) -> LoaderResult> { - let (highlights_filenames, injections_filenames, locals_filenames) = match paths { - Some(paths) => ( - Some( - paths - .iter() - .filter(|p| p.ends_with(DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME)) - .cloned() - .collect::>(), - ), - Some( - paths - .iter() - .filter(|p| p.ends_with(DEFAULT_TAGS_QUERY_FILE_NAME)) - .cloned() - .collect::>(), - ), - Some( - paths - .iter() - .filter(|p| p.ends_with(DEFAULT_LOCALS_QUERY_FILE_NAME)) - .cloned() - .collect::>(), - ), - ), - None => (None, None, None), - }; - self.highlight_config - .get_or_try_init(|| { - let (highlights_query, highlight_ranges) = self.read_queries( - if highlights_filenames.is_some() { - highlights_filenames.as_deref() - } else { - self.highlights_filenames.as_deref() - }, - DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME, - )?; - let (injections_query, injection_ranges) = self.read_queries( - if injections_filenames.is_some() { - injections_filenames.as_deref() - } else { - self.injections_filenames.as_deref() - }, - DEFAULT_INJECTIONS_QUERY_FILE_NAME, - )?; - let (locals_query, locals_ranges) = self.read_queries( - if locals_filenames.is_some() { - locals_filenames.as_deref() - } else { - self.locals_filenames.as_deref() - }, - DEFAULT_LOCALS_QUERY_FILE_NAME, - )?; - - if highlights_query.is_empty() { - Ok(None) - } else { - let mut result = HighlightConfiguration::new( - language, - &self.language_name, - &highlights_query, - &injections_query, - &locals_query, - ) - .map_err(|error| match error.kind { - QueryErrorKind::Language => { - LoaderError::Query(LoaderQueryError { error, file: None }) - } - _ => { - if error.offset < injections_query.len() { - Self::include_path_in_query_error( - error, - &injection_ranges, - &injections_query, - 0, - ) - } else if error.offset < injections_query.len() + locals_query.len() { - Self::include_path_in_query_error( - error, - &locals_ranges, - &locals_query, - injections_query.len(), - ) - } else { - Self::include_path_in_query_error( - error, - &highlight_ranges, - &highlights_query, - injections_query.len() + locals_query.len(), - ) - } - } - })?; - let mut all_highlight_names = self.highlight_names.lock().unwrap(); - if self.use_all_highlight_names { - for capture_name in result.query.capture_names() { - if !all_highlight_names.iter().any(|x| x == capture_name) { - all_highlight_names.push((*capture_name).to_string()); - } - } - } - result.configure(all_highlight_names.as_slice()); - drop(all_highlight_names); - Ok(Some(result)) - } - }) - .map(Option::as_ref) - } - - #[cfg(feature = "tree-sitter-tags")] - pub fn tags_config(&self, language: Language) -> LoaderResult> { - self.tags_config - .get_or_try_init(|| { - let (tags_query, tags_ranges) = self - .read_queries(self.tags_filenames.as_deref(), DEFAULT_TAGS_QUERY_FILE_NAME)?; - let (locals_query, locals_ranges) = self.read_queries( - self.locals_filenames.as_deref(), - DEFAULT_LOCALS_QUERY_FILE_NAME, - )?; - if tags_query.is_empty() { - Ok(None) - } else { - TagsConfiguration::new(language, &tags_query, &locals_query) - .map(Some) - .map_err(|error| { - if let TagsError::Query(error) = error { - if error.offset < locals_query.len() { - Self::include_path_in_query_error( - error, - &locals_ranges, - &locals_query, - 0, - ) - } else { - Self::include_path_in_query_error( - error, - &tags_ranges, - &tags_query, - locals_query.len(), - ) - } - } else { - error.into() - } - }) - } - }) - .map(Option::as_ref) - } - - #[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] - fn include_path_in_query_error( - mut error: QueryError, - ranges: &[(PathBuf, Range)], - source: &str, - start_offset: usize, - ) -> LoaderError { - let offset_within_section = error.offset - start_offset; - let (path, range) = ranges - .iter() - .find(|(_, range)| range.contains(&offset_within_section)) - .unwrap_or_else(|| ranges.last().unwrap()); - error.offset = offset_within_section - range.start; - error.row = source[range.start..offset_within_section] - .matches('\n') - .count(); - LoaderError::Query(LoaderQueryError { - error, - file: Some(path.to_string_lossy().to_string()), - }) - } - - #[allow(clippy::type_complexity)] - #[cfg(any(feature = "tree-sitter-highlight", feature = "tree-sitter-tags"))] - fn read_queries( - &self, - paths: Option<&[PathBuf]>, - default_path: &str, - ) -> LoaderResult<(String, Vec<(PathBuf, Range)>)> { - let mut query = String::new(); - let mut path_ranges = Vec::new(); - if let Some(paths) = paths { - for path in paths { - let abs_path = self.root_path.join(path); - let prev_query_len = query.len(); - query += &fs::read_to_string(&abs_path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(abs_path.as_path()))))?; - path_ranges.push((path.clone(), prev_query_len..query.len())); - } - } else { - // highlights.scm is needed to test highlights, and tags.scm to test tags - if default_path == DEFAULT_HIGHLIGHTS_QUERY_FILE_NAME - || default_path == DEFAULT_TAGS_QUERY_FILE_NAME - { - warn!( - concat!( - "You should add a `{}` entry pointing to the {} path in the `tree-sitter` ", - "object in the grammar's tree-sitter.json file. See more here: ", - "https://tree-sitter.github.io/tree-sitter/3-syntax-highlighting#query-paths" - ), - default_path.replace(".scm", ""), - default_path - ); - } - let queries_path = self.root_path.join("queries"); - let path = queries_path.join(default_path); - if path.exists() { - query = fs::read_to_string(&path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(path.as_path()))))?; - path_ranges.push((PathBuf::from(default_path), 0..query.len())); - } - } - - Ok((query, path_ranges)) - } -} - -fn needs_recompile(lib_path: &Path, paths_to_check: &[PathBuf]) -> LoaderResult { - if !lib_path.exists() { - return Ok(true); - } - let lib_mtime = mtime(lib_path).map_err(|e| LoaderError::ModifiedTime(Box::new(e)))?; - for path in paths_to_check { - if mtime(path).map_err(|e| LoaderError::ModifiedTime(Box::new(e)))? > lib_mtime { - return Ok(true); - } - } - Ok(false) -} - -fn mtime(path: &Path) -> LoaderResult { - fs::metadata(path) - .map_err(|e| LoaderError::IO(IoError::new(e, Some(path))))? - .modified() - .map_err(|e| LoaderError::IO(IoError::new(e, Some(path)))) -} diff --git a/crates/loader/wasi-sdk-version b/crates/loader/wasi-sdk-version deleted file mode 100644 index 231f5c77..00000000 --- a/crates/loader/wasi-sdk-version +++ /dev/null @@ -1 +0,0 @@ -29.0 diff --git a/crates/tags/LICENSE b/crates/tags/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/crates/tags/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/crates/xtask/src/benchmark.rs b/crates/xtask/src/benchmark.rs deleted file mode 100644 index 2b15db32..00000000 --- a/crates/xtask/src/benchmark.rs +++ /dev/null @@ -1,75 +0,0 @@ -use anyhow::Result; - -use crate::{bail_on_err, Benchmark}; - -pub fn run(args: &Benchmark) -> Result<()> { - if let Some(ref example) = args.example_file_name { - std::env::set_var("TREE_SITTER_BENCHMARK_EXAMPLE_FILTER", example); - } - - if let Some(ref language) = args.language { - std::env::set_var("TREE_SITTER_BENCHMARK_LANGUAGE_FILTER", language); - } - - if args.repetition_count != 5 { - std::env::set_var( - "TREE_SITTER_BENCHMARK_REPETITION_COUNT", - args.repetition_count.to_string(), - ); - } - - if args.debug { - let output = std::process::Command::new("cargo") - .arg("bench") - .arg("benchmark") - .arg("-p") - .arg("tree-sitter-cli") - .arg("--no-run") - .arg("--message-format=json") - .spawn()? - .wait_with_output()?; - - bail_on_err(&output, "Failed to run `cargo bench`")?; - - let json_output = serde_json::from_slice::(&output.stdout)?; - - let test_binary = json_output - .as_array() - .ok_or_else(|| anyhow::anyhow!("Invalid JSON output"))? - .iter() - .find_map(|message| { - if message - .get("target") - .and_then(|target| target.get("name")) - .and_then(|name| name.as_str()) - .is_some_and(|name| name == "benchmark") - && message - .get("executable") - .and_then(|executable| executable.as_str()) - .is_some() - { - message - .get("executable") - .and_then(|executable| executable.as_str()) - } else { - None - } - }) - .ok_or_else(|| anyhow::anyhow!("Failed to find benchmark executable"))?; - - println!("{test_binary}"); - } else { - let status = std::process::Command::new("cargo") - .arg("bench") - .arg("benchmark") - .arg("-p") - .arg("tree-sitter-cli") - .status()?; - - if !status.success() { - anyhow::bail!("Failed to run `cargo bench`"); - } - } - - Ok(()) -} diff --git a/crates/xtask/src/build_wasm.rs b/crates/xtask/src/build_wasm.rs deleted file mode 100644 index fbb231ce..00000000 --- a/crates/xtask/src/build_wasm.rs +++ /dev/null @@ -1,513 +0,0 @@ -use std::{ - collections::HashSet, - ffi::{OsStr, OsString}, - fmt::Write, - fs, - path::{Path, PathBuf}, - process::Command, - time::Duration, -}; - -use anyhow::{anyhow, Result}; -use etcetera::BaseStrategy as _; -use indoc::indoc; -use notify::{ - event::{AccessKind, AccessMode}, - EventKind, RecursiveMode, -}; -use notify_debouncer_full::new_debouncer; -use tree_sitter_loader::{IoError, LoaderError, WasiSDKClangError}; - -use crate::{ - bail_on_err, embed_sources::embed_sources_in_map, watch_wasm, BuildWasm, EMSCRIPTEN_TAG, -}; - -#[derive(PartialEq, Eq)] -enum EmccSource { - Native, - Docker, - Podman, -} - -const EXPORTED_RUNTIME_METHODS: [&str; 20] = [ - "AsciiToString", - "stringToUTF8", - "UTF8ToString", - "lengthBytesUTF8", - "stringToUTF16", - "loadWebAssemblyModule", - "getValue", - "setValue", - "HEAPF32", - "HEAPF64", - "HEAP_DATA_VIEW", - "HEAP8", - "HEAPU8", - "HEAP16", - "HEAPU16", - "HEAP32", - "HEAPU32", - "HEAP64", - "HEAPU64", - "LE_HEAP_STORE_I64", -]; - -const WASI_SDK_VERSION: &str = include_str!("../../loader/wasi-sdk-version").trim_ascii(); - -pub fn run_wasm(args: &BuildWasm) -> Result<()> { - let mut emscripten_flags = if args.debug { - vec!["-O0", "--minify", "0"] - } else { - vec!["-O3", "--minify", "0"] - }; - - if args.debug { - emscripten_flags.extend(["-s", "ASSERTIONS=1", "-s", "SAFE_HEAP=1", "-g"]); - } - - if args.verbose { - emscripten_flags.extend(["-s", "VERBOSE=1", "-v"]); - } - - let emcc_name = if cfg!(windows) { "emcc.bat" } else { "emcc" }; - - // Order of preference: emscripten > docker > podman > error - let source = if !args.docker && Command::new(emcc_name).output().is_ok() { - EmccSource::Native - } else if Command::new("docker") - .output() - .is_ok_and(|out| out.status.success()) - { - EmccSource::Docker - } else if Command::new("podman") - .arg("--version") - .output() - .is_ok_and(|out| out.status.success()) - { - EmccSource::Podman - } else { - return Err(anyhow!( - "You must have either emcc, docker, or podman on your PATH to run this command" - )); - }; - - let mut command = match source { - EmccSource::Native => Command::new(emcc_name), - EmccSource::Docker | EmccSource::Podman => { - let mut command = match source { - EmccSource::Docker => Command::new("docker"), - EmccSource::Podman => Command::new("podman"), - _ => unreachable!(), - }; - command.args(["run", "--rm"]); - - // Mount the root directory as a volume, which is the repo root - let mut volume_string = OsString::from(std::env::current_dir().unwrap()); - volume_string.push(":/src:Z"); - command.args([OsStr::new("--volume"), &volume_string]); - - // In case `docker` is an alias to `podman`, ensure that podman - // mounts the current directory as writable by the container - // user which has the same uid as the host user. Setting the - // podman-specific variable is more reliable than attempting to - // detect whether `docker` is an alias for `podman`. - // see https://docs.podman.io/en/latest/markdown/podman-run.1.html#userns-mode - command.env("PODMAN_USERNS", "keep-id"); - - // Get the current user id so that files created in the docker container will have - // the same owner. - #[cfg(unix)] - { - #[link(name = "c")] - extern "C" { - fn getuid() -> u32; - } - // don't need to set user for podman since PODMAN_USERNS=keep-id is already set - if source == EmccSource::Docker { - let user_id = unsafe { getuid() }; - command.args(["--user", &user_id.to_string()]); - } - }; - - // Run `emcc` in a container using the `emscripten-slim` image - command.args([EMSCRIPTEN_TAG, "emcc"]); - command - } - }; - - fs::create_dir_all("target/scratch").unwrap(); - - let exported_functions = format!( - "{}{}", - fs::read_to_string("lib/src/wasm/stdlib-symbols.txt")?, - fs::read_to_string("lib/binding_web/lib/exports.txt")? - ) - .replace('"', "") - .lines() - .fold(String::new(), |mut output, line| { - let _ = write!(output, "_{line}"); - output - }) - .trim_end_matches(',') - .to_string(); - - let exported_functions = format!("EXPORTED_FUNCTIONS={exported_functions}"); - let exported_runtime_methods = format!( - "EXPORTED_RUNTIME_METHODS={}", - EXPORTED_RUNTIME_METHODS.join(",") - ); - - // Clean up old files from prior runs - for file in [ - "web-tree-sitter.mjs", - "web-tree-sitter.cjs", - "web-tree-sitter.wasm", - "web-tree-sitter.wasm.map", - ] { - fs::remove_file(PathBuf::from("lib/binding_web/lib").join(file)).ok(); - } - - if !args.cjs { - emscripten_flags.extend(["-s", "EXPORT_ES6=1"]); - } - - macro_rules! binding_file { - ($ext:literal) => { - concat!("lib/binding_web/lib/web-tree-sitter", $ext) - }; - } - - #[rustfmt::skip] - emscripten_flags.extend([ - "-gsource-map=inline", - "-fno-exceptions", - "-std=c11", - "-s", "WASM=1", - "-s", "MODULARIZE=1", - "-s", "INITIAL_MEMORY=33554432", - "-s", "ALLOW_MEMORY_GROWTH=1", - "-s", "SUPPORT_BIG_ENDIAN=1", - "-s", "WASM_BIGINT=1", - "-s", "MAIN_MODULE=2", - "-s", "FILESYSTEM=0", - "-s", "NODEJS_CATCH_EXIT=0", - "-s", "NODEJS_CATCH_REJECTION=0", - "-s", &exported_functions, - "-s", &exported_runtime_methods, - "-D", "fprintf(...)=", - "-D", "printf(...)=", - "-D", "NDEBUG=", - "-D", "_POSIX_C_SOURCE=200112L", - "-D", "_DEFAULT_SOURCE=", - "-D", "_BSD_SOURCE=", - "-D", "_DARWIN_C_SOURCE=", - "-I", "lib/src", - "-I", "lib/include", - "--js-library", "lib/binding_web/lib/imports.js", - "--pre-js", "lib/binding_web/lib/prefix.js", - "-o", if args.cjs { binding_file!(".cjs") } else { binding_file!(".mjs") }, - "lib/src/lib.c", - "lib/binding_web/lib/tree-sitter.c", - ]); - if args.emit_tsd { - emscripten_flags.extend(["--emit-tsd", "web-tree-sitter.d.ts"]); - } - - let command = command.args(&emscripten_flags); - - if args.watch { - watch_wasm!(|| build_wasm(command, args.emit_tsd)); - } else { - build_wasm(command, args.emit_tsd)?; - } - - Ok(()) -} - -fn build_wasm(cmd: &mut Command, edit_tsd: bool) -> Result<()> { - bail_on_err( - &cmd.spawn()?.wait_with_output()?, - "Failed to compile the Tree-sitter Wasm library", - )?; - - if edit_tsd { - let file = "lib/binding_web/lib/web-tree-sitter.d.ts"; - let content = fs::read_to_string(file)? - .replace("Automatically generated", "Automatically @generated") - .replace( - "AsciiToString(ptr: any): string", - "AsciiToString(ptr: number): string", - ) - .replace( - "stringToUTF8(str: any, outPtr: any, maxBytesToWrite: any): any", - "stringToUTF8(str: string, outPtr: number, maxBytesToWrite: number): number", - ) - .replace( - "UTF8ToString(ptr: number, maxBytesToRead?: number | undefined): string", - "UTF8ToString(ptr: number, maxBytesToRead?: number): string", - ) - .replace( - "lengthBytesUTF8(str: any): number", - "lengthBytesUTF8(str: string): number", - ) - .replace( - "stringToUTF16(str: any, outPtr: any, maxBytesToWrite: any): number", - "stringToUTF16(str: string, outPtr: number, maxBytesToWrite: number): number", - ) - .replace( - concat!( - "loadWebAssemblyModule(binary: any, flags: any, libName?: string | ", - "undefined, localScope?: any | undefined, handle?: number | undefined): any" - ), - concat!( - "loadWebAssemblyModule(binary: Uint8Array | WebAssembly.Module, flags: Record,", - " libName?: string, localScope?: Record, handle?: number):", - " Promise number>>" - ), - ) - .replace( - "getValue(ptr: number, type?: string): any", - "getValue(ptr: number, type?: string): number", - ) - .replace("HEAPF32: any", "HEAPF32: Float32Array") - .replace("HEAPF64: any", "HEAPF64: Float64Array") - .replace("HEAP_DATA_VIEW: any", "HEAP_DATA_VIEW: DataView") - .replace("HEAP8: any", "HEAP8: Int8Array") - .replace("HEAPU8: any", "HEAPU8: Uint8Array") - .replace("HEAP16: any", "HEAP16: Int16Array") - .replace("HEAPU16: any", "HEAPU16: Uint16Array") - .replace("HEAP32: any", "HEAP32: Int32Array") - .replace("HEAPU32: any", "HEAPU32: Uint32Array") - .replace("HEAP64: any", "HEAP64: BigInt64Array") - .replace("HEAPU64: any", "HEAPU64: BigUint64Array") - .replace("BigInt;", "bigint;") - .replace("BigInt)", "bigint)") - .replace( - "WasmModule & typeof RuntimeExports;", - indoc! {" - WasmModule & typeof RuntimeExports & { - currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null; - currentLogCallback: ((message: string, isLex: boolean) => void) | null; - currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null; - currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null; - }; - "}, - ) - .replace( - "MainModuleFactory (options?: unknown): Promise", - "MainModuleFactory(options?: Partial): Promise", - ); - fs::write(file, content)?; - } - - // Post-process the source map to embed source content for optimized builds - let map_path = Path::new("lib") - .join("binding_web") - .join("lib") - .join("web-tree-sitter.wasm.map"); - if map_path.exists() { - if let Err(e) = embed_sources_in_map(&map_path) { - eprintln!("Warning: Failed to embed sources in source map: {e}"); - } - } - - Ok(()) -} - -/// This ensures that the wasi-sdk is available, downloading and extracting it if necessary, -/// and returns the path to the `clang` executable. -/// -/// If `TREE_SITTER_WASI_SDK_PATH` is set, it will use that path to look for the clang executable. -/// -/// Note that this is just a minimially modified version of -/// `tree_sitter_loader::ensure_wasi_sdk_exists`. In the loader, this functionality is implemented -/// as a private method of `Loader`. Rather than add this to the public API, we just -/// re-implement it. Any fixes and/or modifications made to the loader's copy should be reflected -/// here. -pub fn ensure_wasi_sdk_exists() -> Result { - let possible_executables = if cfg!(windows) { - vec![ - "clang.exe", - "wasm32-unknown-wasi-clang.exe", - "wasm32-wasi-clang.exe", - ] - } else { - vec!["clang", "wasm32-unknown-wasi-clang", "wasm32-wasi-clang"] - }; - - if let Ok(wasi_sdk_path) = std::env::var("TREE_SITTER_WASI_SDK_PATH") { - let wasi_sdk_dir = PathBuf::from(wasi_sdk_path); - - for exe in &possible_executables { - let clang_exe = wasi_sdk_dir.join("bin").join(exe); - if clang_exe.exists() { - return Ok(clang_exe); - } - } - - Err(LoaderError::WasiSDKClang(WasiSDKClangError { - wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), - possible_executables: possible_executables.clone(), - download: false, - }))?; - } - - let cache_dir = etcetera::choose_base_strategy()? - .cache_dir() - .join("tree-sitter"); - fs::create_dir_all(&cache_dir).map_err(|error| { - LoaderError::IO(IoError { - error, - path: Some(cache_dir.to_string_lossy().to_string()), - }) - })?; - - let wasi_sdk_dir = cache_dir.join("wasi-sdk"); - - for exe in &possible_executables { - let clang_exe = wasi_sdk_dir.join("bin").join(exe); - if clang_exe.exists() { - return Ok(clang_exe); - } - } - - fs::create_dir_all(&wasi_sdk_dir).map_err(|error| { - LoaderError::IO(IoError { - error, - path: Some(wasi_sdk_dir.to_string_lossy().to_string()), - }) - })?; - - let arch_os = if cfg!(target_os = "macos") { - if cfg!(target_arch = "aarch64") { - "arm64-macos" - } else { - "x86_64-macos" - } - } else if cfg!(target_os = "windows") { - if cfg!(target_arch = "aarch64") { - "arm64-windows" - } else { - "x86_64-windows" - } - } else if cfg!(target_os = "linux") { - if cfg!(target_arch = "aarch64") { - "arm64-linux" - } else { - "x86_64-linux" - } - } else { - Err(LoaderError::WasiSDKPlatform)? - }; - - let sdk_filename = format!("wasi-sdk-{WASI_SDK_VERSION}-{arch_os}.tar.gz"); - let wasi_sdk_major_version = WASI_SDK_VERSION - .trim_end_matches(char::is_numeric) // trim minor version... - .trim_end_matches('.'); // ...and '.' separator - let sdk_url = format!( - "https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-{wasi_sdk_major_version}/{sdk_filename}", - ); - - eprintln!("Downloading wasi-sdk from {sdk_url}..."); - let temp_tar_path = cache_dir.join(sdk_filename); - - let status = Command::new("curl") - .arg("-f") - .arg("-L") - .arg("-o") - .arg(&temp_tar_path) - .arg(&sdk_url) - .status() - .map_err(|e| LoaderError::Curl(sdk_url.clone(), e))?; - - if !status.success() { - Err(LoaderError::WasiSDKDownload(sdk_url))?; - } - - eprintln!("Extracting wasi-sdk to {}...", wasi_sdk_dir.display()); - extract_tar_gz_with_strip(&temp_tar_path, &wasi_sdk_dir)?; - - fs::remove_file(temp_tar_path).ok(); - for exe in &possible_executables { - let clang_exe = wasi_sdk_dir.join("bin").join(exe); - if clang_exe.exists() { - return Ok(clang_exe); - } - } - - Err(LoaderError::WasiSDKClang(WasiSDKClangError { - wasi_sdk_dir: wasi_sdk_dir.to_string_lossy().to_string(), - possible_executables, - download: true, - }))? -} - -/// Extracts a tar.gz archive with `tar`, stripping the first path component. -fn extract_tar_gz_with_strip(archive_path: &Path, destination: &Path) -> Result<()> { - let status = Command::new("tar") - .arg("-xzf") - .arg(archive_path) - .arg("--strip-components=1") - .arg("-C") - .arg(destination) - .status() - .map_err(|e| LoaderError::Tar(archive_path.to_string_lossy().to_string(), e))?; - - if !status.success() { - Err(LoaderError::Extraction( - archive_path.to_string_lossy().to_string(), - destination.to_string_lossy().to_string(), - ))?; - } - - Ok(()) -} - -pub fn run_wasm_stdlib() -> Result<()> { - let export_flags = include_str!("../../../lib/src/wasm/stdlib-symbols.txt") - .lines() - .map(|line| format!("-Wl,--export={}", &line[1..line.len() - 2])) - .collect::>(); - - let clang_exe = ensure_wasi_sdk_exists()?; - - let output = Command::new(&clang_exe) - .args([ - "-o", - "stdlib.wasm", - "-Os", - "-fPIC", - "-DTREE_SITTER_FEATURE_WASM", - "-Wl,--no-entry", - "-Wl,--stack-first", - "-Wl,-z", - "-Wl,stack-size=65536", - "-Wl,--import-undefined", - "-Wl,--import-memory", - "-Wl,--import-table", - "-Wl,--strip-debug", - "-Wl,--export=__wasm_call_ctors", - "-Wl,--export=__stack_pointer", - "-Wl,--export=reset_heap", - ]) - .args(&export_flags) - .arg("crates/language/wasm/src/stdlib.c") - .output()?; - - bail_on_err(&output, "Failed to compile the Tree-sitter Wasm stdlib")?; - - let xxd = Command::new("xxd") - .args(["-C", "-i", "stdlib.wasm"]) - .output()?; - - bail_on_err( - &xxd, - "Failed to run xxd on the compiled Tree-sitter Wasm stdlib", - )?; - - fs::write("lib/src/wasm/wasm-stdlib.h", xxd.stdout)?; - - fs::rename("stdlib.wasm", "target/stdlib.wasm")?; - - Ok(()) -} diff --git a/crates/xtask/src/bump.rs b/crates/xtask/src/bump.rs deleted file mode 100644 index 02254274..00000000 --- a/crates/xtask/src/bump.rs +++ /dev/null @@ -1,295 +0,0 @@ -use std::{cmp::Ordering, path::Path}; - -use anyhow::{anyhow, Context, Result}; -use indoc::indoc; -use semver::{Prerelease, Version}; - -use crate::{create_commit, BumpVersion}; - -pub fn get_latest_tag() -> Result { - let output = std::process::Command::new("git") - .args(["tag", "-l"]) - .output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to list tags: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - let mut tags = String::from_utf8(output.stdout)? - .lines() - .filter_map(|tag| Version::parse(tag.strip_prefix('v').unwrap_or(tag)).ok()) - .collect::>(); - - tags.sort_by( - |a, b| match (a.pre != Prerelease::EMPTY, b.pre != Prerelease::EMPTY) { - (true, true) | (false, false) => a.cmp(b), - (true, false) => Ordering::Less, - (false, true) => Ordering::Greater, - }, - ); - - tags.last() - .map(std::string::ToString::to_string) - .ok_or_else(|| anyhow!("No tags found")) -} - -pub fn run(args: BumpVersion) -> Result<()> { - let latest_tag = get_latest_tag()?; - let current_version = Version::parse(&latest_tag)?; - - let output = std::process::Command::new("git") - .args(["rev-parse", &format!("v{latest_tag}")]) - .output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to get tag SHA: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - let workspace_toml_version = Version::parse(&fetch_workspace_version()?)?; - - if current_version.major != workspace_toml_version.major - && current_version.minor != workspace_toml_version.minor - { - eprintln!( - indoc! {" - Seems like the workspace Cargo.toml ({}) version does not match up with the latest git tag ({}). - Please ensure you don't change that yourself, this subcommand will handle this for you. - "}, - workspace_toml_version, latest_tag - ); - return Ok(()); - } - - let next_version = args.version; - - println!("Bumping from {current_version} to {next_version}"); - update_crates(¤t_version, &next_version)?; - update_makefile(&next_version)?; - update_cmake(&next_version)?; - update_nix(&next_version)?; - update_npm(&next_version)?; - update_zig(&next_version)?; - tag_next_version(&next_version)?; - - Ok(()) -} - -fn tag_next_version(next_version: &Version) -> Result<()> { - let commit_sha = create_commit( - &format!("{next_version}"), - &[ - "Cargo.lock", - "Cargo.toml", - "Makefile", - "build.zig.zon", - "flake.nix", - "crates/cli/Cargo.toml", - "crates/cli/npm/package.json", - "crates/cli/npm/package-lock.json", - "crates/config/Cargo.toml", - "crates/highlight/Cargo.toml", - "crates/loader/Cargo.toml", - "crates/tags/Cargo.toml", - "CMakeLists.txt", - "lib/Cargo.toml", - "lib/binding_web/package.json", - "lib/binding_web/package-lock.json", - ], - )?; - - // Create tag - let output = std::process::Command::new("git") - .args([ - "tag", - "-a", - &format!("v{next_version}"), - "-m", - &format!("v{next_version}"), - &commit_sha, - ]) - .output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to create tag: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - println!("Tagged commit {commit_sha} with tag v{next_version}"); - - Ok(()) -} - -fn update_makefile(next_version: &Version) -> Result<()> { - let makefile = std::fs::read_to_string("Makefile")?; - let makefile = makefile - .lines() - .map(|line| { - if line.starts_with("VERSION") { - format!("VERSION := {next_version}") - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - std::fs::write("Makefile", makefile)?; - - Ok(()) -} - -fn update_cmake(next_version: &Version) -> Result<()> { - let cmake = std::fs::read_to_string("CMakeLists.txt")?; - let cmake = cmake - .lines() - .map(|line| { - if line.contains(" VERSION") { - let start_quote = line.find('"').unwrap(); - let end_quote = line.rfind('"').unwrap(); - format!( - "{}{next_version}{}", - &line[..=start_quote], - &line[end_quote..] - ) - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - std::fs::write("CMakeLists.txt", cmake)?; - - Ok(()) -} - -fn update_nix(next_version: &Version) -> Result<()> { - let nix = std::fs::read_to_string("flake.nix")?; - let nix = nix - .lines() - .map(|line| { - if line.trim_start().starts_with("version =") { - format!(" version = \"{next_version}\";") - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - std::fs::write("flake.nix", nix)?; - - Ok(()) -} - -fn update_crates(current_version: &Version, next_version: &Version) -> Result<()> { - let mut cmd = std::process::Command::new("cargo"); - cmd.arg("workspaces").arg("version"); - - if next_version.minor > current_version.minor { - cmd.arg("minor"); - } else { - cmd.arg("patch"); - } - - cmd.arg("--no-git-commit") - .arg("--yes") - .arg("--force") - .arg("tree-sitter{,-cli,-config,-generate,-loader,-highlight,-tags}") - .arg("--ignore-changes") - .arg("crates/language/*"); - - let status = cmd.status()?; - - if !status.success() { - return Err(anyhow!("Failed to update crates")); - } - - Ok(()) -} - -fn update_npm(next_version: &Version) -> Result<()> { - for npm_project in ["lib/binding_web", "crates/cli/npm"] { - let npm_path = Path::new(npm_project); - - let package_json_path = npm_path.join("package.json"); - - let package_json = serde_json::from_str::( - &std::fs::read_to_string(&package_json_path) - .with_context(|| format!("Failed to read {}", package_json_path.display()))?, - )?; - - let mut package_json = package_json - .as_object() - .ok_or_else(|| anyhow!("Invalid package.json"))? - .clone(); - package_json.insert( - "version".to_string(), - serde_json::Value::String(next_version.to_string()), - ); - - let package_json = serde_json::to_string_pretty(&package_json)? + "\n"; - - std::fs::write(package_json_path, package_json)?; - - let Ok(cmd) = std::process::Command::new("npm") - .arg("install") - .arg("--package-lock-only") - .arg("--ignore-scripts") - .current_dir(npm_path) - .output() - else { - return Ok(()); // npm is not `executable`, ignore - }; - - if !cmd.status.success() { - let stderr = String::from_utf8_lossy(&cmd.stderr); - return Err(anyhow!( - "Failed to run `npm install` in {}:\n{stderr}", - npm_path.display() - )); - } - } - - Ok(()) -} - -fn update_zig(next_version: &Version) -> Result<()> { - let zig = std::fs::read_to_string("build.zig.zon")? - .lines() - .map(|line| { - if line.starts_with(" .version") { - format!(" .version = \"{next_version}\",") - } else { - line.to_string() - } - }) - .collect::>() - .join("\n") - + "\n"; - - std::fs::write("build.zig.zon", zig)?; - - Ok(()) -} - -/// read Cargo.toml and get the version -fn fetch_workspace_version() -> Result { - std::fs::read_to_string("Cargo.toml")? - .lines() - .find(|line| line.starts_with("version = ")) - .and_then(|line| { - line.split_terminator('"') - .next_back() - .map(|s| s.to_string()) - }) - .ok_or_else(|| anyhow!("No version found in Cargo.toml")) -} diff --git a/crates/xtask/src/check_wasm_exports.rs b/crates/xtask/src/check_wasm_exports.rs deleted file mode 100644 index c93f7cd3..00000000 --- a/crates/xtask/src/check_wasm_exports.rs +++ /dev/null @@ -1,135 +0,0 @@ -use std::{ - collections::HashSet, - env, - io::BufRead, - path::PathBuf, - process::{Command, Stdio}, - time::Duration, -}; - -use anyhow::{anyhow, Result}; -use notify::{ - event::{AccessKind, AccessMode}, - EventKind, RecursiveMode, -}; -use notify_debouncer_full::new_debouncer; - -use crate::{bail_on_err, watch_wasm, CheckWasmExports}; - -const EXCLUDES: [&str; 25] = [ - // Unneeded because the JS side has its own way of implementing it - "ts_node_child_by_field_name", - "ts_node_edit", - // Precomputed and stored in the JS side - "ts_node_type", - "ts_node_grammar_type", - "ts_node_eq", - "ts_tree_cursor_current_field_name", - "ts_lookahead_iterator_current_symbol_name", - // Not used in Wasm - "ts_init", - "ts_set_allocator", - "ts_parser_print_dot_graphs", - "ts_tree_print_dot_graph", - "ts_parser_set_wasm_store", - "ts_parser_take_wasm_store", - "ts_parser_language", - "ts_node_language", - "ts_tree_language", - "ts_lookahead_iterator_language", - "ts_parser_logger", - "ts_parser_parse_string", - "ts_parser_parse_string_encoding", - // Query cursor is not managed by user in web bindings - "ts_query_cursor_delete", - "ts_query_cursor_match_limit", - "ts_query_cursor_remove_match", - "ts_query_cursor_set_point_range", - "ts_query_cursor_set_containing_byte_range", -]; - -pub fn run(args: &CheckWasmExports) -> Result<()> { - if args.watch { - watch_wasm!(check_wasm_exports); - } else { - check_wasm_exports()?; - } - - Ok(()) -} - -fn check_wasm_exports() -> Result<()> { - let mut wasm_exports = std::fs::read_to_string("lib/binding_web/lib/exports.txt")? - .lines() - .map(|s| s.replace("_wasm", "").replace("byte", "index")) - // remove leading and trailing quotes, trailing comma - .map(|s| s[1..s.len() - 2].to_string()) - .collect::>(); - - // Run wasm-objdump to see symbols used internally in binding.c but not exposed in any way. - let wasm_objdump = Command::new("wasm-objdump") - .args([ - "--details", - "lib/binding_web/debug/web-tree-sitter.wasm", - "--section", - "Name", - ]) - .output() - .expect("Failed to run wasm-objdump"); - bail_on_err(&wasm_objdump, "Failed to run wasm-objdump")?; - - wasm_exports.extend( - wasm_objdump - .stdout - .lines() - .map_while(Result::ok) - .skip_while(|line| !line.contains("- func")) - .filter_map(|line| { - if line.contains("func") { - if let Some(function) = line.split_whitespace().nth(2).map(String::from) { - let trimmed = function.trim_start_matches('<').trim_end_matches('>'); - if trimmed.starts_with("ts") && !trimmed.contains("__") { - return Some(trimmed.to_string()); - } - } - } - None - }), - ); - - let nm_cmd = env::var("NM").unwrap_or_else(|_| "nm".to_owned()); - let nm_child = Command::new(nm_cmd) - .arg("-W") - .arg("-U") - .arg("libtree-sitter.so") - .stdout(Stdio::piped()) - .output() - .expect("Failed to run nm"); - bail_on_err(&nm_child, "Failed to run nm")?; - let export_reader = nm_child - .stdout - .lines() - .map_while(Result::ok) - .filter(|line| line.contains(" T ")); - - let exports = export_reader - .filter_map(|line| line.split_whitespace().nth(2).map(String::from)) - .filter(|symbol| !EXCLUDES.contains(&symbol.as_str())) - .collect::>(); - - let mut missing = exports - .iter() - .filter(|&symbol| !wasm_exports.contains(symbol)) - .map(String::as_str) - .collect::>(); - missing.sort_unstable(); - - if !missing.is_empty() { - Err(anyhow!(format!( - "Unmatched Wasm exports:\n{}", - missing.join("\n") - )))?; - } - - Ok(()) -} diff --git a/crates/xtask/src/clippy.rs b/crates/xtask/src/clippy.rs deleted file mode 100644 index 664884f5..00000000 --- a/crates/xtask/src/clippy.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::process::Command; - -use anyhow::Result; - -use crate::{bail_on_err, Clippy}; - -pub fn run(args: &Clippy) -> Result<()> { - let mut clippy_command = Command::new("cargo"); - clippy_command.arg("clippy"); - - if let Some(package) = args.package.as_ref() { - clippy_command.args(["--package", package]); - } else { - clippy_command.arg("--workspace"); - } - - clippy_command - .arg("--release") - .arg("--all-targets") - .arg("--all-features") - .arg("--") - .arg("-D") - .arg("warnings"); - - if args.fix { - clippy_command.arg("--fix"); - } - - bail_on_err( - &clippy_command.spawn()?.wait_with_output()?, - "Clippy failed", - ) -} diff --git a/crates/xtask/src/embed_sources.rs b/crates/xtask/src/embed_sources.rs deleted file mode 100644 index ce8ec403..00000000 --- a/crates/xtask/src/embed_sources.rs +++ /dev/null @@ -1,61 +0,0 @@ -use anyhow::Result; -use std::fs; -use std::path::Path; - -/// Restores sourcesContent if it was stripped by Binaryen. -/// -/// This is a workaround for Binaryen where `wasm-opt -O2` and higher -/// optimization levels strip the `sourcesContent` field from source maps, -/// even when the source map was generated with `--sources` flag. -/// -/// This is fixed upstream in Binaryen as of Apr 9, 2025, but there hasn't been a release with the fix yet. -/// See: -/// -/// This reads the original source files and embeds them in the -/// source map's `sourcesContent` field, making debugging possible even -/// with optimized builds. -/// -/// TODO: Once Binaryen releases a version with the fix, and emscripten updates to that -/// version, and we update our emscripten version, this function can be removed. -pub fn embed_sources_in_map(map_path: &Path) -> Result<()> { - let map_content = fs::read_to_string(map_path)?; - let mut map: serde_json::Value = serde_json::from_str(&map_content)?; - - if let Some(sources_content) = map.get("sourcesContent") { - if let Some(arr) = sources_content.as_array() { - if !arr.is_empty() && arr.iter().any(|v| !v.is_null()) { - return Ok(()); - } - } - } - - let sources = map["sources"] - .as_array() - .ok_or_else(|| anyhow::anyhow!("No sources array in source map"))?; - - let map_dir = map_path.parent().unwrap_or(Path::new(".")); - let mut sources_content = Vec::new(); - - for source in sources { - let source_path = source.as_str().unwrap_or(""); - let full_path = map_dir.join(source_path); - - let content = if full_path.exists() { - match fs::read_to_string(&full_path) { - Ok(content) => serde_json::Value::String(content), - Err(_) => serde_json::Value::Null, - } - } else { - serde_json::Value::Null - }; - - sources_content.push(content); - } - - map["sourcesContent"] = serde_json::Value::Array(sources_content); - - let output = serde_json::to_string(&map)?; - fs::write(map_path, output)?; - - Ok(()) -} diff --git a/crates/xtask/src/fetch.rs b/crates/xtask/src/fetch.rs deleted file mode 100644 index 6fa431c6..00000000 --- a/crates/xtask/src/fetch.rs +++ /dev/null @@ -1,140 +0,0 @@ -use crate::{bail_on_err, root_dir, FetchFixtures, EMSCRIPTEN_VERSION}; -use anyhow::Result; -use std::{fs, process::Command}; - -pub fn run_fixtures(args: &FetchFixtures) -> Result<()> { - let fixtures_dir = root_dir().join("test").join("fixtures"); - let grammars_dir = fixtures_dir.join("grammars"); - let fixtures_path = fixtures_dir.join("fixtures.json"); - - // grammar name, tag - let mut fixtures: Vec<(String, String)> = - serde_json::from_str(&fs::read_to_string(&fixtures_path)?)?; - - for (grammar, tag) in &mut fixtures { - let grammar_dir = grammars_dir.join(&grammar); - let grammar_url = format!("https://github.com/tree-sitter/tree-sitter-{grammar}"); - - println!("Fetching the {grammar} grammar..."); - - if !grammar_dir.exists() { - let mut command = Command::new("git"); - command.args([ - "clone", - "--depth", - "1", - "--branch", - tag, - &grammar_url, - &grammar_dir.to_string_lossy(), - ]); - bail_on_err( - &command.spawn()?.wait_with_output()?, - &format!("Failed to clone the {grammar} grammar"), - )?; - } else { - let mut describe_command = Command::new("git"); - describe_command.current_dir(&grammar_dir).args([ - "describe", - "--tags", - "--exact-match", - "HEAD", - ]); - - let output = describe_command.output()?; - let current_tag = String::from_utf8_lossy(&output.stdout); - let current_tag = current_tag.trim(); - - if current_tag != tag { - println!("Updating {grammar} grammar from {current_tag} to {tag}..."); - - let mut fetch_command = Command::new("git"); - fetch_command.current_dir(&grammar_dir).args([ - "fetch", - "origin", - &format!("refs/tags/{tag}:refs/tags/{tag}"), - ]); - bail_on_err( - &fetch_command.spawn()?.wait_with_output()?, - &format!("Failed to fetch tag {tag} for {grammar} grammar"), - )?; - - let mut reset_command = Command::new("git"); - reset_command - .current_dir(&grammar_dir) - .args(["reset", "--hard", "HEAD"]); - bail_on_err( - &reset_command.spawn()?.wait_with_output()?, - &format!("Failed to reset {grammar} grammar working tree"), - )?; - - let mut checkout_command = Command::new("git"); - checkout_command - .current_dir(&grammar_dir) - .args(["checkout", tag]); - bail_on_err( - &checkout_command.spawn()?.wait_with_output()?, - &format!("Failed to checkout tag {tag} for {grammar} grammar"), - )?; - } else { - println!("{grammar} grammar is already at tag {tag}"); - } - } - } - - if args.update { - println!("Updating the fixtures lock file"); - fs::write( - &fixtures_path, - // format the JSON without extra newlines - serde_json::to_string(&fixtures)? - .replace("[[", "[\n [") - .replace("],", "],\n ") - .replace("]]", "]\n]"), - )?; - } - - Ok(()) -} - -pub fn run_emscripten() -> Result<()> { - let emscripten_dir = root_dir().join("target").join("emsdk"); - if emscripten_dir.exists() { - println!("Emscripten SDK already exists"); - return Ok(()); - } - println!("Cloning the Emscripten SDK..."); - - let mut command = Command::new("git"); - command.args([ - "clone", - "https://github.com/emscripten-core/emsdk.git", - &emscripten_dir.to_string_lossy(), - ]); - bail_on_err( - &command.spawn()?.wait_with_output()?, - "Failed to clone the Emscripten SDK", - )?; - - std::env::set_current_dir(&emscripten_dir)?; - - let emsdk = if cfg!(windows) { - "emsdk.bat" - } else { - "./emsdk" - }; - - let mut command = Command::new(emsdk); - command.args(["install", EMSCRIPTEN_VERSION]); - bail_on_err( - &command.spawn()?.wait_with_output()?, - "Failed to install Emscripten", - )?; - - let mut command = Command::new(emsdk); - command.args(["activate", EMSCRIPTEN_VERSION]); - bail_on_err( - &command.spawn()?.wait_with_output()?, - "Failed to activate Emscripten", - ) -} diff --git a/crates/xtask/src/generate.rs b/crates/xtask/src/generate.rs deleted file mode 100644 index 662fc3b1..00000000 --- a/crates/xtask/src/generate.rs +++ /dev/null @@ -1,193 +0,0 @@ -use std::{collections::BTreeSet, ffi::OsStr, fs, path::Path, process::Command, str::FromStr}; - -use anyhow::{Context, Result}; -use bindgen::RustTarget; - -use crate::{bail_on_err, GenerateFixtures}; - -const HEADER_PATH: &str = "lib/include/tree_sitter/api.h"; - -pub fn run_fixtures(args: &GenerateFixtures) -> Result<()> { - let output = std::process::Command::new("cargo") - .args(["build", "--release"]) - .spawn()? - .wait_with_output()?; - bail_on_err(&output, "Failed to run cargo build")?; - - let tree_sitter_binary = std::env::current_dir()? - .join("target") - .join("release") - .join("tree-sitter"); - - let grammars_dir = std::env::current_dir()? - .join("test") - .join("fixtures") - .join("grammars"); - - for grammar_file in find_grammar_files(grammars_dir.to_str().unwrap()).flatten() { - let grammar_dir = grammar_file.parent().unwrap(); - let grammar_name = grammar_dir.file_name().and_then(OsStr::to_str).unwrap(); - - println!( - "Regenerating {grammar_name} parser{}", - if args.wasm { " to Wasm" } else { "" } - ); - - if args.wasm { - let mut cmd = Command::new(&tree_sitter_binary); - let cmd = cmd.args([ - "build", - "--wasm", - "-o", - &format!("target/release/tree-sitter-{grammar_name}.wasm"), - grammar_dir.to_str().unwrap(), - ]); - bail_on_err( - &cmd.spawn()?.wait_with_output()?, - &format!("Failed to regenerate {grammar_name} parser to wasm"), - )?; - } else { - let output = Command::new(&tree_sitter_binary) - .arg("generate") - .arg("src/grammar.json") - .arg("--abi=latest") - .current_dir(grammar_dir) - .spawn()? - .wait_with_output()?; - bail_on_err( - &output, - &format!("Failed to regenerate {grammar_name} parser"), - )?; - } - } - - Ok(()) -} - -pub fn run_bindings() -> Result<()> { - let output = Command::new("cargo") - .args(["metadata", "--format-version", "1"]) - .output() - .unwrap(); - - let metadata = serde_json::from_slice::(&output.stdout).unwrap(); - - let Some(rust_version) = metadata - .get("packages") - .and_then(|packages| packages.as_array()) - .and_then(|packages| { - packages.iter().find_map(|package| { - if package["name"] == "tree-sitter" { - package.get("rust_version").and_then(|v| v.as_str()) - } else { - None - } - }) - }) - else { - panic!("Failed to find tree-sitter package in cargo metadata"); - }; - - let no_copy = [ - "TSInput", - "TSLanguage", - "TSLogger", - "TSLookaheadIterator", - "TSParser", - "TSTree", - "TSQuery", - "TSQueryCursor", - "TSQueryCapture", - "TSQueryMatch", - "TSQueryPredicateStep", - ]; - - let bindings = bindgen::Builder::default() - .header(HEADER_PATH) - .layout_tests(false) - .allowlist_type("^TS.*") - .allowlist_function("^ts_.*") - .allowlist_var("^TREE_SITTER.*") - .no_copy(no_copy.join("|")) - .prepend_enum_name(false) - .use_core() - .clang_arg("-D TREE_SITTER_FEATURE_WASM") - .rust_target(RustTarget::from_str(rust_version).unwrap()) - .generate() - .expect("Failed to generate bindings"); - - bindings - .write_to_file("lib/binding_rust/bindings.rs") - .with_context(|| "Failed to write bindings") -} - -pub fn run_wasm_exports() -> Result<()> { - let mut imports = BTreeSet::new(); - - let mut callback = |path: &str| -> Result<()> { - let output = Command::new("wasm-objdump") - .args(["--details", path, "--section", "Import"]) - .output()?; - bail_on_err(&output, "Failed to run wasm-objdump")?; - - let output = String::from_utf8_lossy(&output.stdout); - - for line in output.lines() { - if let Some(imp) = line.split("').next()) { - imports.insert(imp.to_string()); - } - } - - Ok(()) - }; - - for entry in fs::read_dir(Path::new("target"))? { - let Ok(entry) = entry else { - continue; - }; - let path = entry.path(); - if path.is_dir() { - for entry in fs::read_dir(&path)? { - let Ok(entry) = entry else { - continue; - }; - let path = entry.path(); - if path.is_file() - && path.extension() == Some(OsStr::new("wasm")) - && path - .file_name() - .unwrap() - .to_str() - .unwrap() - .starts_with("tree-sitter-") - { - callback(path.to_str().unwrap())?; - } - } - } - } - - for imp in imports { - println!("{imp}"); - } - - Ok(()) -} - -fn find_grammar_files( - dir: &str, -) -> impl Iterator> { - fs::read_dir(dir) - .expect("Failed to read directory") - .filter_map(Result::ok) - .flat_map(|entry| { - let path = entry.path(); - if path.is_dir() && !path.to_string_lossy().contains("node_modules") { - Box::new(find_grammar_files(path.to_str().unwrap())) as Box> - } else if path.is_file() && path.file_name() == Some(OsStr::new("grammar.js")) { - Box::new(std::iter::once(Ok(path))) as _ - } else { - Box::new(std::iter::empty()) as _ - } - }) -} diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs deleted file mode 100644 index 3814cf66..00000000 --- a/crates/xtask/src/main.rs +++ /dev/null @@ -1,386 +0,0 @@ -mod benchmark; -mod build_wasm; -mod bump; -mod check_wasm_exports; -mod clippy; -mod embed_sources; -mod fetch; -mod generate; -mod test; -mod test_schema; -mod upgrade_wasmtime; - -use std::{path::Path, process::Command}; - -use anstyle::{AnsiColor, Color, Style}; -use anyhow::Result; -use clap::{crate_authors, Args, FromArgMatches as _, Subcommand}; -use semver::Version; - -#[derive(Subcommand)] -#[command(about="Run various tasks", author=crate_authors!("\n"), styles=get_styles())] -enum Commands { - /// Runs `cargo benchmark` with some optional environment variables set. - Benchmark(Benchmark), - /// Compile the Tree-sitter Wasm library. This will create two files in the - /// `lib/binding_web` directory: `web-tree-sitter.js` and `web-tree-sitter.wasm`. - BuildWasm(BuildWasm), - /// Compile the Tree-sitter Wasm standard library. - BuildWasmStdlib, - /// Bumps the version of the workspace. - BumpVersion(BumpVersion), - /// Checks that Wasm exports are synced. - CheckWasmExports(CheckWasmExports), - /// Runs `cargo clippy`. - Clippy(Clippy), - /// Fetches emscripten. - FetchEmscripten, - /// Fetches the fixtures for testing tree-sitter. - FetchFixtures(FetchFixtures), - /// Generate the Rust bindings from the C library. - GenerateBindings, - /// Generates the fixtures for testing tree-sitter. - GenerateFixtures(GenerateFixtures), - /// Generates the JSON schema for the test runner summary. - GenerateTestSchema, - /// Generate the list of exports from Tree-sitter Wasm files. - GenerateWasmExports, - /// Run the test suite - Test(Test), - /// Run the Wasm test suite - TestWasm, - /// Upgrade the wasmtime dependency. - UpgradeWasmtime(UpgradeWasmtime), -} - -#[derive(Args)] -struct Benchmark { - /// The language to run the benchmarks for. - #[arg(long, short)] - language: Option, - /// The example file to run the benchmarks for. - #[arg(long, short)] - example_file_name: Option, - /// The number of times to parse each sample (default is 5). - #[arg(long, short, default_value = "5")] - repetition_count: u32, - /// Whether to run the benchmarks in debug mode. - #[arg(long, short = 'g')] - debug: bool, -} - -#[derive(Args)] -struct BuildWasm { - /// Compile the library more quickly, with fewer optimizations - /// and more runtime assertions. - #[arg(long, short = '0')] - debug: bool, - /// Run emscripten using docker, even if \`emcc\` is installed. - /// By default, \`emcc\` will be run directly when available. - #[arg(long, short)] - docker: bool, - /// Run emscripten with verbose output. - #[arg(long, short)] - verbose: bool, - /// Rebuild when relevant files are changed. - #[arg(long, short)] - watch: bool, - /// Emit TypeScript type definitions for the generated bindings, - /// requires `tsc` to be available. - #[arg(long, short)] - emit_tsd: bool, - /// Generate `CommonJS` modules instead of ES modules. - #[arg(long, short, env = "CJS")] - cjs: bool, -} - -#[derive(Args)] -struct BumpVersion { - /// The version to bump to. - #[arg(index = 1, required = true)] - version: Version, -} - -#[derive(Args)] -struct CheckWasmExports { - /// Recheck when relevant files are changed. - #[arg(long, short)] - watch: bool, -} - -#[derive(Args)] -struct Clippy { - /// Automatically apply lint suggestions (`clippy --fix`). - #[arg(long, short)] - fix: bool, - /// The package to run Clippy against (`cargo -p clippy`). - #[arg(long, short)] - package: Option, -} - -#[derive(Args)] -struct FetchFixtures { - /// Update all fixtures to the latest tag - #[arg(long, short)] - update: bool, -} - -#[derive(Args)] -struct GenerateFixtures { - /// Generates the parser to Wasm - #[arg(long, short)] - wasm: bool, -} - -#[derive(Args)] -struct Test { - /// Compile C code with the Clang address sanitizer. - #[arg(long, short)] - address_sanitizer: bool, - /// Run only the corpus tests for the given language. - #[arg(long, short)] - language: Option, - /// Run only the corpus tests whose name contain the given string. - #[arg(long, short)] - example: Option, - /// Run the given number of iterations of randomized tests (default 10). - #[arg(long, short)] - iterations: Option, - /// Set the seed used to control random behavior. - #[arg(long, short)] - seed: Option, - /// Print parsing log to stderr. - #[arg(long, short)] - debug: bool, - /// Generate an SVG graph of parsing logs. - #[arg(long, short = 'D')] - debug_graph: bool, - /// Run the tests with a debugger. - #[arg(short)] - g: bool, - #[arg(trailing_var_arg = true)] - args: Vec, - /// Don't capture the output - #[arg(long)] - nocapture: bool, - /// Enable the Wasm tests. - #[arg(long, short)] - wasm: bool, -} - -#[derive(Args)] -struct UpgradeWasmtime { - /// The version to upgrade to. - #[arg(long, short)] - version: Version, -} - -const BUILD_VERSION: &str = env!("CARGO_PKG_VERSION"); -const BUILD_SHA: Option<&str> = option_env!("BUILD_SHA"); -const EMSCRIPTEN_VERSION: &str = include_str!("../../loader/emscripten-version").trim_ascii(); -const EMSCRIPTEN_TAG: &str = concat!( - "docker.io/emscripten/emsdk:", - include_str!("../../loader/emscripten-version") -) -.trim_ascii(); - -fn main() { - let result = run(); - if let Err(err) = &result { - // Ignore BrokenPipe errors - if let Some(error) = err.downcast_ref::() { - if error.kind() == std::io::ErrorKind::BrokenPipe { - return; - } - } - if !err.to_string().is_empty() { - eprintln!("{err:?}"); - } - std::process::exit(1); - } -} - -fn run() -> Result<()> { - let version = BUILD_SHA.map_or_else( - || BUILD_VERSION.to_string(), - |build_sha| format!("{BUILD_VERSION} ({build_sha})"), - ); - let version: &'static str = Box::leak(version.into_boxed_str()); - - let cli = clap::Command::new("xtask") - .help_template( - "\ -{before-help}{name} {version} -{author-with-newline}{about-with-newline} -{usage-heading} {usage} - -{all-args}{after-help} -", - ) - .version(version) - .subcommand_required(true) - .arg_required_else_help(true) - .disable_help_subcommand(true) - .disable_colored_help(false); - let command = Commands::from_arg_matches(&Commands::augment_subcommands(cli).get_matches())?; - - match command { - Commands::Benchmark(benchmark_options) => benchmark::run(&benchmark_options)?, - Commands::BuildWasm(build_wasm_options) => build_wasm::run_wasm(&build_wasm_options)?, - Commands::BuildWasmStdlib => build_wasm::run_wasm_stdlib()?, - Commands::BumpVersion(bump_options) => bump::run(bump_options)?, - Commands::CheckWasmExports(check_options) => check_wasm_exports::run(&check_options)?, - Commands::Clippy(clippy_options) => clippy::run(&clippy_options)?, - Commands::FetchEmscripten => fetch::run_emscripten()?, - Commands::FetchFixtures(fetch_fixture_options) => { - fetch::run_fixtures(&fetch_fixture_options)?; - } - Commands::GenerateBindings => generate::run_bindings()?, - Commands::GenerateFixtures(generate_fixtures_options) => { - generate::run_fixtures(&generate_fixtures_options)?; - } - Commands::GenerateTestSchema => test_schema::run_test_schema()?, - Commands::GenerateWasmExports => generate::run_wasm_exports()?, - Commands::Test(test_options) => test::run(&test_options)?, - Commands::TestWasm => test::run_wasm()?, - Commands::UpgradeWasmtime(upgrade_wasmtime_options) => { - upgrade_wasmtime::run(&upgrade_wasmtime_options)?; - } - } - - Ok(()) -} - -fn root_dir() -> &'static Path { - Path::new(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .parent() - .unwrap() -} - -fn bail_on_err(output: &std::process::Output, prefix: &str) -> Result<()> { - if !output.status.success() { - let stderr = String::from_utf8_lossy(&output.stderr); - anyhow::bail!("{prefix}:\n{stderr}"); - } - Ok(()) -} - -#[must_use] -const fn get_styles() -> clap::builder::Styles { - clap::builder::Styles::styled() - .usage( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Yellow))), - ) - .header( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Yellow))), - ) - .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green)))) - .invalid( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Red))), - ) - .error( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Red))), - ) - .valid( - Style::new() - .bold() - .fg_color(Some(Color::Ansi(AnsiColor::Green))), - ) - .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White)))) -} - -pub fn create_commit(msg: &str, paths: &[&str]) -> Result { - for path in paths { - let output = Command::new("git").args(["add", path]).output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to add {path}: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - } - - let output = Command::new("git").args(["commit", "-m", msg]).output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to commit: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - let output = Command::new("git").args(["rev-parse", "HEAD"]).output()?; - if !output.status.success() { - anyhow::bail!( - "Failed to get commit SHA: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - - Ok(String::from_utf8(output.stdout)?.trim().to_string()) -} - -#[macro_export] -macro_rules! watch_wasm { - ($watch_fn:expr) => { - if let Err(e) = $watch_fn() { - eprintln!("{e}"); - } else { - println!("Build succeeded"); - } - - let watch_files = [ - "lib/tree-sitter.c", - "lib/exports.txt", - "lib/imports.js", - "lib/prefix.js", - ] - .iter() - .map(PathBuf::from) - .collect::>(); - let (tx, rx) = std::sync::mpsc::channel(); - let mut debouncer = new_debouncer(Duration::from_secs(1), None, tx)?; - debouncer.watch("lib/binding_web", RecursiveMode::NonRecursive)?; - - for result in rx { - match result { - Ok(events) => { - for event in events { - if event.kind == EventKind::Access(AccessKind::Close(AccessMode::Write)) - && event - .paths - .iter() - .filter_map(|p| p.file_name()) - .any(|p| watch_files.contains(&PathBuf::from(p))) - { - if let Err(e) = $watch_fn() { - eprintln!("{e}"); - } else { - println!("Build succeeded"); - } - } - } - } - Err(errors) => { - return Err(anyhow!( - "{}", - errors - .into_iter() - .map(|e| e.to_string()) - .collect::>() - .join("\n") - )); - } - } - } - }; -} diff --git a/crates/xtask/src/test.rs b/crates/xtask/src/test.rs deleted file mode 100644 index 6b8d8243..00000000 --- a/crates/xtask/src/test.rs +++ /dev/null @@ -1,145 +0,0 @@ -use std::{ - env, - path::Path, - process::{Command, Stdio}, -}; - -use anyhow::{anyhow, Result}; -use regex::Regex; - -use crate::{bail_on_err, Test}; - -pub fn run(args: &Test) -> Result<()> { - let test_flags = if args.address_sanitizer { - env::set_var("CFLAGS", "-fsanitize=undefined,address"); - - // When the Tree-sitter C library is compiled with the address sanitizer, the address - // sanitizer runtime library needs to be linked into the final test executable. When - // using Xcode clang, the Rust linker doesn't know where to find that library, so we - // need to specify linker flags directly. - let output = Command::new("cc").arg("-print-runtime-dir").output()?; - bail_on_err(&output, "Failed to get clang runtime dir")?; - let runtime_dir = String::from_utf8(output.stdout)?; - if runtime_dir.contains("/Xcode.app/") { - env::set_var( - "RUSTFLAGS", - format!( - "-C link-arg=-L{runtime_dir} -C link-arg=-lclang_rt.asan_osx_dynamic -C link-arg=-Wl,-rpath,{runtime_dir}" - ), - ); - } - - // Specify a `--target` explicitly. This is required for address sanitizer support. - let output = Command::new("rustup") - .arg("show") - .arg("active-toolchain") - .output()?; - bail_on_err(&output, "Failed to get active Rust toolchain")?; - let toolchain = String::from_utf8(output.stdout)?; - let re = Regex::new(r"(stable|beta|nightly)-([_a-z0-9-]+).*")?; - let captures = re - .captures(&toolchain) - .ok_or_else(|| anyhow!("Failed to parse toolchain '{toolchain}'"))?; - let current_target = captures.get(2).unwrap().as_str(); - format!("--target={current_target}") - } else { - String::new() - }; - if let Some(language) = &args.language { - env::set_var("TREE_SITTER_LANGUAGE", language); - } - if let Some(example) = &args.example { - env::set_var("TREE_SITTER_EXAMPLE_INCLUDE", example); - } - if let Some(seed) = args.seed { - env::set_var("TREE_SITTER_SEED", seed.to_string()); - } - if let Some(iterations) = args.iterations { - env::set_var("TREE_SITTER_ITERATIONS", iterations.to_string()); - } - if args.debug { - env::set_var("TREE_SITTER_LOG", "1"); - } - if args.debug_graph { - env::set_var("TREE_SITTER_LOG_GRAPHS", "1"); - } - - if args.g { - let mut cargo_cmd = Command::new("cargo"); - cargo_cmd - .arg("test") - .arg("--all") - .arg(&test_flags) - .arg("--no-run") - .arg("--message-format=json"); - - let cargo_cmd = cargo_cmd.stdout(Stdio::piped()).spawn()?; - - let jq_cmd = Command::new("jq") - .arg("-rs") - .arg(r#"map(select(.target.name == "tree_sitter_cli" and .executable))[0].executable"#) - .stdin(cargo_cmd.stdout.unwrap()) - .output()?; - - let test_binary = String::from_utf8(jq_cmd.stdout)?; - - let mut lldb_cmd = Command::new("lldb"); - lldb_cmd.arg(test_binary.trim()).arg("--").args(&args.args); - bail_on_err( - &lldb_cmd.spawn()?.wait_with_output()?, - &format!("Failed to run {lldb_cmd:?}"), - )?; - } else { - let mut cargo_cmd = Command::new("cargo"); - cargo_cmd.arg("test").arg("--all"); - if args.wasm { - cargo_cmd.arg("--features").arg("wasm"); - } - if !test_flags.is_empty() { - cargo_cmd.arg(&test_flags); - } - cargo_cmd.args(&args.args); - - if args.nocapture { - #[cfg(not(target_os = "windows"))] - cargo_cmd.arg("--"); - - cargo_cmd.arg("--nocapture"); - } - bail_on_err( - &cargo_cmd.spawn()?.wait_with_output()?, - &format!("Failed to run {cargo_cmd:?}"), - )?; - } - - Ok(()) -} - -pub fn run_wasm() -> Result<()> { - std::env::set_current_dir("lib/binding_web")?; - - let node_modules_dir = Path::new("node_modules"); - let npm = if cfg!(target_os = "windows") { - "npm.cmd" - } else { - "npm" - }; - - if !node_modules_dir.join("chai").exists() || !node_modules_dir.join("mocha").exists() { - println!("Installing test dependencies..."); - let output = Command::new(npm).arg("install").output()?; - bail_on_err(&output, "Failed to install test dependencies")?; - } - - let child = Command::new(npm).arg("test").spawn()?; - let output = child.wait_with_output()?; - bail_on_err(&output, &format!("Failed to run `{npm} test`"))?; - - // Display test results - let output = String::from_utf8_lossy(&output.stdout); - for line in output.lines() { - println!("{line}"); - } - - Ok(()) -} diff --git a/crates/xtask/src/test_schema.rs b/crates/xtask/src/test_schema.rs deleted file mode 100644 index a2f65ed2..00000000 --- a/crates/xtask/src/test_schema.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::path::PathBuf; - -use anyhow::Result; -use serde_json::to_writer_pretty; - -use tree_sitter_cli::test::TestSummary; - -pub fn run_test_schema() -> Result<()> { - let schema = schemars::schema_for!(TestSummary); - - let xtask_path: PathBuf = env!("CARGO_MANIFEST_DIR").into(); - let schema_path = xtask_path - .parent() - .unwrap() - .parent() - .unwrap() - .join("docs") - .join("src") - .join("assets") - .join("schemas") - .join("test-summary.schema.json"); - let mut file = std::fs::File::create(schema_path)?; - - Ok(to_writer_pretty(&mut file, &schema)?) -} diff --git a/crates/xtask/src/upgrade_wasmtime.rs b/crates/xtask/src/upgrade_wasmtime.rs deleted file mode 100644 index 90e5b0f2..00000000 --- a/crates/xtask/src/upgrade_wasmtime.rs +++ /dev/null @@ -1,101 +0,0 @@ -use std::process::Command; - -use anyhow::{Context, Result}; -use semver::Version; - -use crate::{create_commit, UpgradeWasmtime}; - -const WASMTIME_RELEASE_URL: &str = "https://github.com/bytecodealliance/wasmtime/releases/download"; - -fn update_cargo(version: &Version) -> Result<()> { - let file = std::fs::read_to_string("lib/Cargo.toml")?; - let mut old_lines = file.lines(); - let mut new_lines = Vec::with_capacity(old_lines.size_hint().0); - - while let Some(line) = old_lines.next() { - new_lines.push(line.to_string()); - if line == "[dependencies.wasmtime-c-api]" { - let _ = old_lines.next(); - new_lines.push(format!("version = \"{version}\"")); - } - } - - std::fs::write("lib/Cargo.toml", new_lines.join("\n") + "\n")?; - - Command::new("cargo") - .arg("update") - .status() - .map(|_| ()) - .with_context(|| "Failed to execute cargo update") -} - -fn zig_fetch(lines: &mut Vec, version: &Version, url_suffix: &str) -> Result<()> { - let url = &format!("{WASMTIME_RELEASE_URL}/v{version}/wasmtime-v{version}-{url_suffix}"); - println!(" Fetching {url}"); - lines.push(format!(" .url = \"{url}\",")); - - let output = Command::new("zig") - .arg("fetch") - .arg(url) - .output() - .with_context(|| format!("Failed to execute zig fetch {url}"))?; - - let hash = String::from_utf8_lossy(&output.stdout); - lines.push(format!(" .hash = \"{}\",", hash.trim_end())); - - Ok(()) -} - -fn update_zig(version: &Version) -> Result<()> { - let file = std::fs::read_to_string("build.zig.zon")?; - let mut old_lines = file.lines(); - let new_lines = &mut Vec::with_capacity(old_lines.size_hint().0); - - macro_rules! match_wasmtime_zig_dep { - ($line:ident, {$($platform:literal => [$($arch:literal),*]),*,}) => { - match $line { - $($(concat!(" .wasmtime_c_api_", $arch, "_", $platform, " = .{") => { - let (_, _) = (old_lines.next(), old_lines.next()); - let suffix = if $platform == "windows" || $platform == "mingw" { - concat!($arch, "-", $platform, "-c-api.zip") - } else { - concat!($arch, "-", $platform, "-c-api.tar.xz") - }; - zig_fetch(new_lines, version, suffix)?; - })*)* - _ => {} - } - }; - } - - while let Some(line) = old_lines.next() { - new_lines.push(line.to_string()); - match_wasmtime_zig_dep!(line, { - "android" => ["aarch64", "x86_64"], - "linux" => ["aarch64", "armv7", "i686", "riscv64gc", "s390x", "x86_64"], - "macos" => ["aarch64", "x86_64"], - "mingw" => ["x86_64"], - "musl" => ["aarch64", "x86_64"], - "windows" => ["aarch64", "i686", "x86_64"], - }); - } - - std::fs::write("build.zig.zon", new_lines.join("\n") + "\n")?; - - Ok(()) -} - -pub fn run(args: &UpgradeWasmtime) -> Result<()> { - println!("Upgrading wasmtime for Rust"); - update_cargo(&args.version)?; - - println!("Upgrading wasmtime for Zig"); - update_zig(&args.version)?; - - create_commit( - &format!("build(deps): bump wasmtime-c-api to v{}", args.version), - &["lib/Cargo.toml", "Cargo.lock", "build.zig.zon"], - )?; - - Ok(()) -} diff --git a/docs/.gitignore b/docs/.gitignore index 7585238e..339efff8 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1 +1,3 @@ -book +vendor +_site +.bundle diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 00000000..ee114290 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' +gem 'github-pages', group: :jekyll_plugins +gem "webrick" diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock new file mode 100644 index 00000000..7204a9a7 --- /dev/null +++ b/docs/Gemfile.lock @@ -0,0 +1,273 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (7.1.3) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) + base64 (0.2.0) + bigdecimal (3.1.6) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.23.10) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + dnsruby (1.61.9) + simpleidn (~> 0.1) + drb (2.2.0) + ruby2_keywords + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.8.1) + faraday (2.7.4) + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-net_http (3.0.2) + ffi (1.15.5) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (228) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.3) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.4.0) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.13.6, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.9) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 3.0, < 5.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.0) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + jekyll (3.9.3) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.21.2) + mutex_m (0.2.0) + nokogiri (1.16.5-x86_64-linux) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.7.3) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.3.3) + strscan + rouge (3.26.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + strscan (3.1.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) + webrick (1.8.1) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + github-pages + webrick + +BUNDLED WITH + 2.4.8 diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..891551df --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1,2 @@ +markdown: kramdown +theme: jekyll-theme-cayman diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html new file mode 100644 index 00000000..587ab4f0 --- /dev/null +++ b/docs/_layouts/default.html @@ -0,0 +1,137 @@ + + + + + + + + Tree-sitter|{{ page.title }} + + + + + + + +
+ + + + +
+ {{ content }} +
+
+ + + + + + + + diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss new file mode 100644 index 00000000..b838211f --- /dev/null +++ b/docs/assets/css/style.scss @@ -0,0 +1,203 @@ +--- +--- + +@import 'jekyll-theme-cayman'; + +$padding: 20px; +$sidebar-width: 300px; +$sidebar-transition: left 0.25s; +$container-width: 1024px; + +body { + overflow: scroll; +} + +a[href^="http"]:after { + content: ""; + display: inline-block; + transform: translate(0px, 2px); + width: .9em; + height: .9em; + margin-left: 3px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23777'%3E%3Cpath d='M20 3h-5a1 1 0 1 0 0 2h3L8 14a1 1 0 1 0 2 2l9-10v3a1 1 0 1 0 2 0V4a1 1 0 0 0-1-1zM5 3L3 5v14l2 2h14l2-2v-6a1 1 0 1 0-2 0v6H5V5h6a1 1 0 1 0 0-2H5z'/%3E%3C/svg%3E"); + background-size: cover; +} + +#container { + position: relative; + max-width: $container-width; + margin: 0 auto; +} + +#main-content, #sidebar { + padding: $padding 0; +} + +#main-content code:not(pre code, a code) { + color: #c7254e; + font-size: 0.9em; + background-color: #f8f8f8; + border: 1px solid #eaeaea; + border-radius: 3px; + margin: 0 2px; + padding: 0 5px; +} + +#sidebar { + position: fixed; + background: white; + top: 0; + bottom: 0; + width: $sidebar-width; + overflow-y: auto; + border-right: 1px solid #ccc; + z-index: 1; + + .github-repo { + display: inline-block; + padding-left: 3.75em; + font-size: .85em; + } +} + +#sidebar-toggle-link { + font-size: 24px; + position: fixed; + background-color: white; + opacity: 0.75; + box-shadow: 1px 1px 5px #aaa; + left: $sidebar-width; + padding: 5px 10px; + display: none; + z-index: 100; + text-decoration: none !important; + color: #aaa; +} + +#main-content { + position: relative; + padding: $padding; + padding-left: $sidebar-width + $padding; +} + +.nav-link.active { + text-decoration: underline; +} + +a > span { + text-decoration: inherit; +} + +.table-of-contents-section { + border-bottom: 1px solid #ccc; +} + +.logo { + display: block; +} + +.table-of-contents-section.active { + background-color: #edffcb; +} + +.table-of-contents-section { + padding: 10px 20px; +} + +#table-of-contents { + ul { + padding: 0; + margin: 0; + } + + li { + display: block; + padding: 5px 20px; + } +} + +@media (max-width: 900px) { + #sidebar { + left: 0; + transition: $sidebar-transition; + } + + #sidebar-toggle-link { + display: block; + transition: $sidebar-transition; + } + + #main-content { + left: $sidebar-width; + padding-left: $padding; + transition: $sidebar-transition; + } + + body.sidebar-hidden { + #sidebar { + left: -$sidebar-width; + } + + #main-content { + left: 0; + } + + #sidebar-toggle-link { + left: 0; + } + } +} + +#playground-container { + .CodeMirror { + height: auto; + max-height: 350px; + border: 1px solid #aaa; + } + + .CodeMirror-scroll { + height: auto; + max-height: 350px; + } + + h4, select, .field, label { + display: inline-block; + margin-right: 20px; + } + + #logging-checkbox { + height: 15px; + } + + .CodeMirror div.CodeMirror-cursor { + border-left: 3px solid red; + } + + h4#about { + margin: 10ex 0 0 0; + } +} + +#output-container { + padding: 0 10px; + margin: 0; +} + +#output-container-scroll { + padding: 0; + position: relative; + margin-top: 0; + overflow: auto; + max-height: 350px; + border: 1px solid #aaa; +} + +a.highlighted { + background-color: #ddd; + text-decoration: underline; +} + +.query-error { + text-decoration: underline red dashed; + -webkit-text-decoration: underline red dashed; +} diff --git a/docs/src/assets/images/favicon-16x16.png b/docs/assets/images/favicon-16x16.png similarity index 100% rename from docs/src/assets/images/favicon-16x16.png rename to docs/assets/images/favicon-16x16.png diff --git a/docs/src/assets/images/favicon-32x32.png b/docs/assets/images/favicon-32x32.png similarity index 100% rename from docs/src/assets/images/favicon-32x32.png rename to docs/assets/images/favicon-32x32.png diff --git a/docs/src/assets/images/tree-sitter-small.png b/docs/assets/images/tree-sitter-small.png similarity index 100% rename from docs/src/assets/images/tree-sitter-small.png rename to docs/assets/images/tree-sitter-small.png diff --git a/docs/assets/js/playground.js b/docs/assets/js/playground.js new file mode 100644 index 00000000..5864d979 --- /dev/null +++ b/docs/assets/js/playground.js @@ -0,0 +1,459 @@ +let tree; + +(async () => { + const CAPTURE_REGEX = /@\s*([\w._-]+)/g; + const COLORS_BY_INDEX = [ + 'blue', + 'chocolate', + 'darkblue', + 'darkcyan', + 'darkgreen', + 'darkred', + 'darkslategray', + 'dimgray', + 'green', + 'indigo', + 'navy', + 'red', + 'sienna', + ]; + + const codeInput = document.getElementById('code-input'); + const languageSelect = document.getElementById('language-select'); + const loggingCheckbox = document.getElementById('logging-checkbox'); + const outputContainer = document.getElementById('output-container'); + const outputContainerScroll = document.getElementById('output-container-scroll'); + const playgroundContainer = document.getElementById('playground-container'); + const queryCheckbox = document.getElementById('query-checkbox'); + const queryContainer = document.getElementById('query-container'); + const queryInput = document.getElementById('query-input'); + const updateTimeSpan = document.getElementById('update-time'); + const languagesByName = {}; + + loadState(); + + await TreeSitter.init(); + + const parser = new TreeSitter(); + const codeEditor = CodeMirror.fromTextArea(codeInput, { + lineNumbers: true, + showCursorWhenSelecting: true + }); + + const queryEditor = CodeMirror.fromTextArea(queryInput, { + lineNumbers: true, + showCursorWhenSelecting: true + }); + + const cluster = new Clusterize({ + rows: [], + noDataText: null, + contentElem: outputContainer, + scrollElem: outputContainerScroll + }); + const renderTreeOnCodeChange = debounce(renderTree, 50); + const saveStateOnChange = debounce(saveState, 2000); + const runTreeQueryOnChange = debounce(runTreeQuery, 50); + + let languageName = languageSelect.value; + let treeRows = null; + let treeRowHighlightedIndex = -1; + let parseCount = 0; + let isRendering = 0; + let query; + + codeEditor.on('changes', handleCodeChange); + codeEditor.on('viewportChange', runTreeQueryOnChange); + codeEditor.on('cursorActivity', debounce(handleCursorMovement, 150)); + queryEditor.on('changes', debounce(handleQueryChange, 150)); + + loggingCheckbox.addEventListener('change', handleLoggingChange); + queryCheckbox.addEventListener('change', handleQueryEnableChange); + languageSelect.addEventListener('change', handleLanguageChange); + outputContainer.addEventListener('click', handleTreeClick); + + handleQueryEnableChange(); + await handleLanguageChange() + + playgroundContainer.style.visibility = 'visible'; + + async function handleLanguageChange() { + const newLanguageName = languageSelect.value; + if (!languagesByName[newLanguageName]) { + const url = `${LANGUAGE_BASE_URL}/tree-sitter-${newLanguageName}.wasm` + languageSelect.disabled = true; + try { + languagesByName[newLanguageName] = await TreeSitter.Language.load(url); + } catch (e) { + console.error(e); + languageSelect.value = languageName; + return + } finally { + languageSelect.disabled = false; + } + } + + tree = null; + languageName = newLanguageName; + parser.setLanguage(languagesByName[newLanguageName]); + handleCodeChange(); + handleQueryChange(); + } + + async function handleCodeChange(_editor, changes) { + const newText = `${codeEditor.getValue()}\n`; + const edits = tree && changes && changes.map(treeEditForEditorChange); + + const start = performance.now(); + if (edits) { + for (const edit of edits) { + tree.edit(edit); + } + } + const newTree = parser.parse(newText, tree); + const duration = (performance.now() - start).toFixed(1); + + updateTimeSpan.innerText = `${duration} ms`; + if (tree) tree.delete(); + tree = newTree; + parseCount++; + renderTreeOnCodeChange(); + runTreeQueryOnChange(); + saveStateOnChange(); + } + + async function renderTree() { + isRendering++; + const cursor = tree.walk(); + + const currentRenderCount = parseCount; + let row = ''; + const rows = []; + let finishedRow = false; + let visitedChildren = false; + let indentLevel = 0; + + for (let i = 0;; i++) { + if (i > 0 && i % 10000 === 0) { + await new Promise(r => setTimeout(r, 0)); + if (parseCount !== currentRenderCount) { + cursor.delete(); + isRendering--; + return; + } + } + + let displayName; + if (cursor.nodeIsMissing) { + displayName = `MISSING ${cursor.nodeType}` + } else if (cursor.nodeIsNamed) { + displayName = cursor.nodeType; + } + + if (visitedChildren) { + if (displayName) { + finishedRow = true; + } + + if (cursor.gotoNextSibling()) { + visitedChildren = false; + } else if (cursor.gotoParent()) { + visitedChildren = true; + indentLevel--; + } else { + break; + } + } else { + if (displayName) { + if (finishedRow) { + row += ''; + rows.push(row); + finishedRow = false; + } + const start = cursor.startPosition; + const end = cursor.endPosition; + const id = cursor.nodeId; + let fieldName = cursor.currentFieldName; + if (fieldName) { + fieldName += ': '; + } else { + fieldName = ''; + } + row = `
${' '.repeat(indentLevel)}${fieldName}${displayName} [${start.row}, ${start.column}] - [${end.row}, ${end.column}]`; + finishedRow = true; + } + + if (cursor.gotoFirstChild()) { + visitedChildren = false; + indentLevel++; + } else { + visitedChildren = true; + } + } + } + if (finishedRow) { + row += '
'; + rows.push(row); + } + + cursor.delete(); + cluster.update(rows); + treeRows = rows; + isRendering--; + handleCursorMovement(); + } + + function runTreeQuery(_, startRow, endRow) { + if (endRow == null) { + const viewport = codeEditor.getViewport(); + startRow = viewport.from; + endRow = viewport.to; + } + + codeEditor.operation(() => { + const marks = codeEditor.getAllMarks(); + marks.forEach(m => m.clear()); + + if (tree && query) { + const captures = query.captures( + tree.rootNode, + {row: startRow, column: 0}, + {row: endRow, column: 0}, + ); + let lastNodeId; + for (const {name, node} of captures) { + if (node.id === lastNodeId) continue; + lastNodeId = node.id; + const {startPosition, endPosition} = node; + codeEditor.markText( + {line: startPosition.row, ch: startPosition.column}, + {line: endPosition.row, ch: endPosition.column}, + { + inclusiveLeft: true, + inclusiveRight: true, + css: `color: ${colorForCaptureName(name)}` + } + ); + } + } + }); + } + + function handleQueryChange() { + if (query) { + query.delete(); + query.deleted = true; + query = null; + } + + queryEditor.operation(() => { + queryEditor.getAllMarks().forEach(m => m.clear()); + if (!queryCheckbox.checked) return; + + const queryText = queryEditor.getValue(); + + try { + query = parser.getLanguage().query(queryText); + let match; + + let row = 0; + queryEditor.eachLine((line) => { + while (match = CAPTURE_REGEX.exec(line.text)) { + queryEditor.markText( + {line: row, ch: match.index}, + {line: row, ch: match.index + match[0].length}, + { + inclusiveLeft: true, + inclusiveRight: true, + css: `color: ${colorForCaptureName(match[1])}` + } + ); + } + row++; + }); + } catch (error) { + const startPosition = queryEditor.posFromIndex(error.index); + const endPosition = { + line: startPosition.line, + ch: startPosition.ch + (error.length || Infinity) + }; + + if (error.index === queryText.length) { + if (startPosition.ch > 0) { + startPosition.ch--; + } else if (startPosition.row > 0) { + startPosition.row--; + startPosition.column = Infinity; + } + } + + queryEditor.markText( + startPosition, + endPosition, + { + className: 'query-error', + inclusiveLeft: true, + inclusiveRight: true, + attributes: {title: error.message} + } + ); + } + }); + + runTreeQuery(); + saveQueryState(); + } + + function handleCursorMovement() { + if (isRendering) return; + + const selection = codeEditor.getDoc().listSelections()[0]; + let start = {row: selection.anchor.line, column: selection.anchor.ch}; + let end = {row: selection.head.line, column: selection.head.ch}; + if ( + start.row > end.row || + ( + start.row === end.row && + start.column > end.column + ) + ) { + const swap = end; + end = start; + start = swap; + } + const node = tree.rootNode.namedDescendantForPosition(start, end); + if (treeRows) { + if (treeRowHighlightedIndex !== -1) { + const row = treeRows[treeRowHighlightedIndex]; + if (row) treeRows[treeRowHighlightedIndex] = row.replace('highlighted', 'plain'); + } + treeRowHighlightedIndex = treeRows.findIndex(row => row.includes(`data-id=${node.id}`)); + if (treeRowHighlightedIndex !== -1) { + const row = treeRows[treeRowHighlightedIndex]; + if (row) treeRows[treeRowHighlightedIndex] = row.replace('plain', 'highlighted'); + } + cluster.update(treeRows); + const lineHeight = cluster.options.item_height; + const scrollTop = outputContainerScroll.scrollTop; + const containerHeight = outputContainerScroll.clientHeight; + const offset = treeRowHighlightedIndex * lineHeight; + if (scrollTop > offset - 20) { + $(outputContainerScroll).animate({scrollTop: offset - 20}, 150); + } else if (scrollTop < offset + lineHeight + 40 - containerHeight) { + $(outputContainerScroll).animate({scrollTop: offset - containerHeight + 40}, 150); + } + } + } + + function handleTreeClick(event) { + if (event.target.tagName === 'A') { + event.preventDefault(); + const [startRow, startColumn, endRow, endColumn] = event + .target + .dataset + .range + .split(',') + .map(n => parseInt(n)); + codeEditor.focus(); + codeEditor.setSelection( + {line: startRow, ch: startColumn}, + {line: endRow, ch: endColumn} + ); + } + } + + function handleLoggingChange() { + if (loggingCheckbox.checked) { + parser.setLogger((message, lexing) => { + if (lexing) { + console.log(" ", message) + } else { + console.log(message) + } + }); + } else { + parser.setLogger(null); + } + } + + function handleQueryEnableChange() { + if (queryCheckbox.checked) { + queryContainer.style.visibility = ''; + queryContainer.style.position = ''; + } else { + queryContainer.style.visibility = 'hidden'; + queryContainer.style.position = 'absolute'; + } + handleQueryChange(); + } + + function treeEditForEditorChange(change) { + const oldLineCount = change.removed.length; + const newLineCount = change.text.length; + const lastLineLength = change.text[newLineCount - 1].length; + + const startPosition = {row: change.from.line, column: change.from.ch}; + const oldEndPosition = {row: change.to.line, column: change.to.ch}; + const newEndPosition = { + row: startPosition.row + newLineCount - 1, + column: newLineCount === 1 + ? startPosition.column + lastLineLength + : lastLineLength + }; + + const startIndex = codeEditor.indexFromPos(change.from); + let newEndIndex = startIndex + newLineCount - 1; + let oldEndIndex = startIndex + oldLineCount - 1; + for (let i = 0; i < newLineCount; i++) newEndIndex += change.text[i].length; + for (let i = 0; i < oldLineCount; i++) oldEndIndex += change.removed[i].length; + + return { + startIndex, oldEndIndex, newEndIndex, + startPosition, oldEndPosition, newEndPosition + }; + } + + function colorForCaptureName(capture) { + const id = query.captureNames.indexOf(capture); + return COLORS_BY_INDEX[id % COLORS_BY_INDEX.length]; + } + + function loadState() { + const language = localStorage.getItem("language"); + const sourceCode = localStorage.getItem("sourceCode"); + const query = localStorage.getItem("query"); + const queryEnabled = localStorage.getItem("queryEnabled"); + if (language != null && sourceCode != null && query != null) { + queryInput.value = query; + codeInput.value = sourceCode; + languageSelect.value = language; + queryCheckbox.checked = (queryEnabled === 'true'); + } + } + + function saveState() { + localStorage.setItem("language", languageSelect.value); + localStorage.setItem("sourceCode", codeEditor.getValue()); + saveQueryState(); + } + + function saveQueryState() { + localStorage.setItem("queryEnabled", queryCheckbox.checked); + localStorage.setItem("query", queryEditor.getValue()); + } + + function debounce(func, wait, immediate) { + let timeout; + return function() { + const context = this, args = arguments; + const later = function() { + timeout = null; + if (!immediate) func.apply(context, args); + }; + const callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) func.apply(context, args); + }; + } +})(); diff --git a/docs/book.toml b/docs/book.toml deleted file mode 100644 index 0894c988..00000000 --- a/docs/book.toml +++ /dev/null @@ -1,32 +0,0 @@ -[book] -authors = [ - "Max Brunsfeld ", - "Amaan Qureshi ", -] -language = "en" -src = "src" -title = "Tree-sitter" - -[output.html] -additional-css = [ - "src/assets/css/playground.css", - "src/assets/css/mdbook-admonish.css", -] -additional-js = ["src/assets/js/playground.js"] -git-repository-url = "https://github.com/tree-sitter/tree-sitter" -git-repository-icon = "fa-github" -edit-url-template = "https://github.com/tree-sitter/tree-sitter/edit/master/docs/{path}" - -[output.html.search] -limit-results = 20 -use-boolean-and = true -boost-title = 2 -boost-hierarchy = 2 -boost-paragraph = 1 -expand = true - -[preprocessor] - -[preprocessor.admonish] -command = "mdbook-admonish" -assets_version = "3.0.2" # do not edit: managed by `mdbook-admonish install` diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..8bd6bee1 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,68 @@ +--- +title: Introduction +--- + +# Introduction + +Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. Tree-sitter aims to be: + +* **General** enough to parse any programming language +* **Fast** enough to parse on every keystroke in a text editor +* **Robust** enough to provide useful results even in the presence of syntax errors +* **Dependency-free** so that the runtime library (which is written in pure [C](https://github.com/tree-sitter/tree-sitter/tree/master/lib)) can be embedded in any application + +### Language Bindings + +There are currently bindings that allow Tree-sitter to be used from the following languages: + +#### Official + +* [C#](https://github.com/tree-sitter/csharp-tree-sitter) +* [Go](https://github.com/tree-sitter/go-tree-sitter) +* [Haskell](https://github.com/tree-sitter/haskell-tree-sitter) +* [Java (JDK 22)](https://github.com/tree-sitter/java-tree-sitter) +* [JavaScript (Node.js)](https://github.com/tree-sitter/node-tree-sitter) +* [JavaScript (Wasm)](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web) +* [Kotlin](https://github.com/tree-sitter/kotlin-tree-sitter) +* [Python](https://github.com/tree-sitter/py-tree-sitter) +* [Rust](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_rust) + +#### Third-party + +* [Delphi](https://github.com/modersohn/delphi-tree-sitter) +* [ELisp](https://github.com/emacs-tree-sitter/elisp-tree-sitter) +* [Go](https://github.com/smacker/go-tree-sitter) +* [Guile](https://github.com/Z572/guile-ts) +* [Java (Android)](https://github.com/AndroidIDEOfficial/android-tree-sitter) +* [Java (JDK 8+)](https://github.com/bonede/tree-sitter-ng) +* [Java (JDK 11+)](https://github.com/seart-group/java-tree-sitter) +* [Julia](https://github.com/MichaelHatherly/TreeSitter.jl) +* [Lua](https://github.com/euclidianAce/ltreesitter) +* [Lua](https://github.com/xcb-xwii/lua-tree-sitter) +* [OCaml](https://github.com/semgrep/ocaml-tree-sitter-core) +* [Odin](https://github.com/laytan/odin-tree-sitter) +* [Perl](https://metacpan.org/pod/Text::Treesitter) +* [R](https://github.com/DavisVaughan/r-tree-sitter) +* [Ruby](https://github.com/Faveod/ruby-tree-sitter) +* [Swift](https://github.com/ChimeHQ/SwiftTreeSitter) + +### Parsers + +A list of known parsers can be found in the [wiki](https://github.com/tree-sitter/tree-sitter/wiki/List-of-parsers). + +### Talks on Tree-sitter + +* [Strange Loop 2018](https://www.thestrangeloop.com/2018/tree-sitter---a-new-parsing-system-for-programming-tools.html) +* [FOSDEM 2018](https://www.youtube.com/watch?v=0CGzC_iss-8) +* [GitHub Universe 2017](https://www.youtube.com/watch?v=a1rC79DHpmY) + +### Underlying Research + +The design of Tree-sitter was greatly influenced by the following research papers: + +* [Practical Algorithms for Incremental Software Development Environments](https://www2.eecs.berkeley.edu/Pubs/TechRpts/1997/CSD-97-946.pdf) +* [Context Aware Scanning for Parsing Extensible Languages](https://www-users.cse.umn.edu/~evw/pubs/vanwyk07gpce/vanwyk07gpce.pdf) +* [Efficient and Flexible Incremental Parsing](https://harmonia.cs.berkeley.edu/papers/twagner-parsing.pdf) +* [Incremental Analysis of Real Programming Languages](https://harmonia.cs.berkeley.edu/papers/twagner-glr.pdf) +* [Error Detection and Recovery in LR Parsers](https://what-when-how.com/compiler-writing/bottom-up-parsing-compiler-writing-part-13) +* [Error Recovery for LR Parsers](https://apps.dtic.mil/sti/pdfs/ADA043470.pdf) diff --git a/docs/package.nix b/docs/package.nix deleted file mode 100644 index 1d07631f..00000000 --- a/docs/package.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ - stdenv, - lib, - version, - mdbook, - mdbook-admonish, -}: -stdenv.mkDerivation { - inherit version; - - src = ./.; - pname = "tree-sitter-docs"; - - nativeBuildInputs = [ - mdbook - mdbook-admonish - ]; - - buildPhase = '' - mdbook build - ''; - - installPhase = '' - mkdir -p $out/share/doc - cp -r book $out/share/doc/tree-sitter - ''; - - meta = { - description = "Tree-sitter documentation"; - homepage = "https://tree-sitter.github.io/tree-sitter"; - license = lib.licenses.mit; - }; -} diff --git a/docs/section-2-using-parsers.md b/docs/section-2-using-parsers.md new file mode 100644 index 00000000..266ed2a7 --- /dev/null +++ b/docs/section-2-using-parsers.md @@ -0,0 +1,958 @@ +--- +title: Using Parsers +permalink: using-parsers +--- + +# Using Parsers + +All of Tree-sitter's parsing functionality is exposed through C APIs. Applications written in higher-level languages can use Tree-sitter via binding libraries like [node-tree-sitter](https://github.com/tree-sitter/node-tree-sitter) or the [tree-sitter rust crate](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_rust), which have their own documentation. + +This document will describe the general concepts of how to use Tree-sitter, which should be relevant regardless of what language you're using. It also goes into some C-specific details that are useful if you're using the C API directly or are building a new binding to a different language. + +All of the API functions shown here are declared and documented in the [`tree_sitter/api.h`](https://github.com/tree-sitter/tree-sitter/blob/master/lib/include/tree_sitter/api.h) header file. You may also want to browse the [online Rust API docs](https://docs.rs/tree-sitter), which correspond to the C APIs closely. + +## Getting Started + +### Building the Library + +To build the library on a POSIX system, just run `make` in the Tree-sitter directory. This will create a static library called `libtree-sitter.a` as well as dynamic libraries. + +Alternatively, you can incorporate the library in a larger project's build system by adding one source file to the build. This source file needs two directories to be in the include path when compiled: + +**source file:** + +- `tree-sitter/lib/src/lib.c` + +**include directories:** + +- `tree-sitter/lib/src` +- `tree-sitter/lib/include` + +### The Basic Objects + +There are four main types of objects involved when using Tree-sitter: languages, parsers, syntax trees, and syntax nodes. In C, these are called `TSLanguage`, `TSParser`, `TSTree`, and `TSNode`. + +- A `TSLanguage` is an opaque object that defines how to parse a particular programming language. The code for each `TSLanguage` is generated by Tree-sitter. Many languages are already available in separate git repositories within the [Tree-sitter GitHub organization](https://github.com/tree-sitter). See [the next page](./creating-parsers) for how to create new languages. +- A `TSParser` is a stateful object that can be assigned a `TSLanguage` and used to produce a `TSTree` based on some source code. +- A `TSTree` represents the syntax tree of an entire source code file. It contains `TSNode` instances that indicate the structure of the source code. It can also be edited and used to produce a new `TSTree` in the event that the source code changes. +- A `TSNode` represents a single node in the syntax tree. It tracks its start and end positions in the source code, as well as its relation to other nodes like its parent, siblings and children. + +### An Example Program + +Here's an example of a simple C program that uses the Tree-sitter [JSON parser](https://github.com/tree-sitter/tree-sitter-json). + +```c +// Filename - test-json-parser.c + +#include +#include +#include +#include + +// Declare the `tree_sitter_json` function, which is +// implemented by the `tree-sitter-json` library. +const TSLanguage *tree_sitter_json(void); + +int main() { + // Create a parser. + TSParser *parser = ts_parser_new(); + + // Set the parser's language (JSON in this case). + ts_parser_set_language(parser, tree_sitter_json()); + + // Build a syntax tree based on source code stored in a string. + const char *source_code = "[1, null]"; + TSTree *tree = ts_parser_parse_string( + parser, + NULL, + source_code, + strlen(source_code) + ); + + // Get the root node of the syntax tree. + TSNode root_node = ts_tree_root_node(tree); + + // Get some child nodes. + TSNode array_node = ts_node_named_child(root_node, 0); + TSNode number_node = ts_node_named_child(array_node, 0); + + // Check that the nodes have the expected types. + assert(strcmp(ts_node_type(root_node), "document") == 0); + assert(strcmp(ts_node_type(array_node), "array") == 0); + assert(strcmp(ts_node_type(number_node), "number") == 0); + + // Check that the nodes have the expected child counts. + assert(ts_node_child_count(root_node) == 1); + assert(ts_node_child_count(array_node) == 5); + assert(ts_node_named_child_count(array_node) == 2); + assert(ts_node_child_count(number_node) == 0); + + // Print the syntax tree as an S-expression. + char *string = ts_node_string(root_node); + printf("Syntax tree: %s\n", string); + + // Free all of the heap-allocated memory. + free(string); + ts_tree_delete(tree); + ts_parser_delete(parser); + return 0; +} +``` + +This program uses the Tree-sitter C API, which is declared in the header file `tree-sitter/api.h`, so we need to add the `tree-sitter/lib/include` directory to the include path. We also need to link `libtree-sitter.a` into the binary. We compile the source code of the JSON language directly into the binary as well. + +```sh +clang \ + -I tree-sitter/lib/include \ + test-json-parser.c \ + tree-sitter-json/src/parser.c \ + tree-sitter/libtree-sitter.a \ + -o test-json-parser + +./test-json-parser +``` + +## Basic Parsing + +### Providing the Code + +In the example above, we parsed source code stored in a simple string using the `ts_parser_parse_string` function: + +```c +TSTree *ts_parser_parse_string( + TSParser *self, + const TSTree *old_tree, + const char *string, + uint32_t length +); +``` + +You may want to parse source code that's stored in a custom data structure, like a [piece table](https://en.wikipedia.org/wiki/Piece_table) or a [rope](). In this case, you can use the more general `ts_parser_parse` function: + +```c +TSTree *ts_parser_parse( + TSParser *self, + const TSTree *old_tree, + TSInput input +); +``` + +The `TSInput` structure lets you provide your own function for reading a chunk of text at a given byte offset and row/column position. The function can return text encoded in either UTF8 or UTF16. This interface allows you to efficiently parse text that is stored in your own data structure. + +```c +typedef struct { + void *payload; + const char *(*read)( + void *payload, + uint32_t byte_offset, + TSPoint position, + uint32_t *bytes_read + ); + TSInputEncoding encoding; +} TSInput; +``` + +### Syntax Nodes + +Tree-sitter provides a [DOM](https://en.wikipedia.org/wiki/Document_Object_Model)-style interface for inspecting syntax trees. A syntax node's _type_ is a string that indicates which grammar rule the node represents. + +```c +const char *ts_node_type(TSNode); +``` + +Syntax nodes store their position in the source code both in terms of raw bytes and row/column coordinates: + +```c +uint32_t ts_node_start_byte(TSNode); +uint32_t ts_node_end_byte(TSNode); + +typedef struct { + uint32_t row; + uint32_t column; +} TSPoint; + +TSPoint ts_node_start_point(TSNode); +TSPoint ts_node_end_point(TSNode); +``` + +### Retrieving Nodes + +Every tree has a _root node_: + +```c +TSNode ts_tree_root_node(const TSTree *); +``` + +Once you have a node, you can access the node's children: + +```c +uint32_t ts_node_child_count(TSNode); +TSNode ts_node_child(TSNode, uint32_t); +``` + +You can also access its siblings and parent: + +```c +TSNode ts_node_next_sibling(TSNode); +TSNode ts_node_prev_sibling(TSNode); +TSNode ts_node_parent(TSNode); +``` + +These methods may all return a _null node_ to indicate, for example, that a node does not _have_ a next sibling. You can check if a node is null: + +```c +bool ts_node_is_null(TSNode); +``` + +### Named vs Anonymous Nodes + +Tree-sitter produces [_concrete_ syntax trees](https://en.wikipedia.org/wiki/Parse_tree) - trees that contain nodes for every individual token in the source code, including things like commas and parentheses. This is important for use-cases that deal with individual tokens, like [syntax highlighting](https://en.wikipedia.org/wiki/Syntax_highlighting). But some types of code analysis are easier to perform using an [_abstract_ syntax tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree) - a tree in which the less important details have been removed. Tree-sitter's trees support these use cases by making a distinction between _named_ and _anonymous_ nodes. + +Consider a grammar rule like this: + +```js +if_statement: ($) => seq("if", "(", $._expression, ")", $._statement); +``` + +A syntax node representing an `if_statement` in this language would have 5 children: the condition expression, the body statement, as well as the `if`, `(`, and `)` tokens. The expression and the statement would be marked as _named_ nodes, because they have been given explicit names in the grammar. But the `if`, `(`, and `)` nodes would _not_ be named nodes, because they are represented in the grammar as simple strings. + +You can check whether any given node is named: + +```c +bool ts_node_is_named(TSNode); +``` + +When traversing the tree, you can also choose to skip over anonymous nodes by using the `_named_` variants of all of the methods described above: + +```c +TSNode ts_node_named_child(TSNode, uint32_t); +uint32_t ts_node_named_child_count(TSNode); +TSNode ts_node_next_named_sibling(TSNode); +TSNode ts_node_prev_named_sibling(TSNode); +``` + +If you use this group of methods, the syntax tree functions much like an abstract syntax tree. + +### Node Field Names + +To make syntax nodes easier to analyze, many grammars assign unique _field names_ to particular child nodes. The next page [explains](./creating-parsers#using-fields) how to do this on your own grammars. If a syntax node has fields, you can access its children using their field name: + +```c +TSNode ts_node_child_by_field_name( + TSNode self, + const char *field_name, + uint32_t field_name_length +); +``` + +Fields also have numeric ids that you can use, if you want to avoid repeated string comparisons. You can convert between strings and ids using the `TSLanguage`: + +```c +uint32_t ts_language_field_count(const TSLanguage *); +const char *ts_language_field_name_for_id(const TSLanguage *, TSFieldId); +TSFieldId ts_language_field_id_for_name(const TSLanguage *, const char *, uint32_t); +``` + +The field ids can be used in place of the name: + +```c +TSNode ts_node_child_by_field_id(TSNode, TSFieldId); +``` + +## Advanced Parsing + +### Editing + +In applications like text editors, you often need to re-parse a file after its source code has changed. Tree-sitter is designed to support this use case efficiently. There are two steps required. First, you must _edit_ the syntax tree, which adjusts the ranges of its nodes so that they stay in sync with the code. + +```c +typedef struct { + uint32_t start_byte; + uint32_t old_end_byte; + uint32_t new_end_byte; + TSPoint start_point; + TSPoint old_end_point; + TSPoint new_end_point; +} TSInputEdit; + +void ts_tree_edit(TSTree *, const TSInputEdit *); +``` + +Then, you can call `ts_parser_parse` again, passing in the old tree. This will create a new tree that internally shares structure with the old tree. + +When you edit a syntax tree, the positions of its nodes will change. If you have stored any `TSNode` instances outside of the `TSTree`, you must update their positions separately, using the same `TSInput` value, in order to update their cached positions. + +```c +void ts_node_edit(TSNode *, const TSInputEdit *); +``` + +This `ts_node_edit` function is _only_ needed in the case where you have retrieved `TSNode` instances _before_ editing the tree, and then _after_ editing the tree, you want to continue to use those specific node instances. Often, you'll just want to re-fetch nodes from the edited tree, in which case `ts_node_edit` is not needed. + +### Multi-language Documents + +Sometimes, different parts of a file may be written in different languages. For example, templating languages like [EJS](https://ejs.co) and [ERB](https://ruby-doc.org/stdlib-2.5.1/libdoc/erb/rdoc/ERB.html) allow you to generate HTML by writing a mixture of HTML and another language like JavaScript or Ruby. + +Tree-sitter handles these types of documents by allowing you to create a syntax tree based on the text in certain _ranges_ of a file. + +```c +typedef struct { + TSPoint start_point; + TSPoint end_point; + uint32_t start_byte; + uint32_t end_byte; +} TSRange; + +void ts_parser_set_included_ranges( + TSParser *self, + const TSRange *ranges, + uint32_t range_count +); +``` + +For example, consider this ERB document: + +```erb +
    + <% people.each do |person| %> +
  • <%= person.name %>
  • + <% end %> +
+``` + +Conceptually, it can be represented by three syntax trees with overlapping ranges: an ERB syntax tree, a Ruby syntax tree, and an HTML syntax tree. You could generate these syntax trees with the following code: + +```c +#include +#include + +// These functions are each implemented in their own repo. +const TSLanguage *tree_sitter_embedded_template(void); +const TSLanguage *tree_sitter_html(void); +const TSLanguage *tree_sitter_ruby(void); + +int main(int argc, const char **argv) { + const char *text = argv[1]; + unsigned len = strlen(text); + + // Parse the entire text as ERB. + TSParser *parser = ts_parser_new(); + ts_parser_set_language(parser, tree_sitter_embedded_template()); + TSTree *erb_tree = ts_parser_parse_string(parser, NULL, text, len); + TSNode erb_root_node = ts_tree_root_node(erb_tree); + + // In the ERB syntax tree, find the ranges of the `content` nodes, + // which represent the underlying HTML, and the `code` nodes, which + // represent the interpolated Ruby. + TSRange html_ranges[10]; + TSRange ruby_ranges[10]; + unsigned html_range_count = 0; + unsigned ruby_range_count = 0; + unsigned child_count = ts_node_child_count(erb_root_node); + + for (unsigned i = 0; i < child_count; i++) { + TSNode node = ts_node_child(erb_root_node, i); + if (strcmp(ts_node_type(node), "content") == 0) { + html_ranges[html_range_count++] = (TSRange) { + ts_node_start_point(node), + ts_node_end_point(node), + ts_node_start_byte(node), + ts_node_end_byte(node), + }; + } else { + TSNode code_node = ts_node_named_child(node, 0); + ruby_ranges[ruby_range_count++] = (TSRange) { + ts_node_start_point(code_node), + ts_node_end_point(code_node), + ts_node_start_byte(code_node), + ts_node_end_byte(code_node), + }; + } + } + + // Use the HTML ranges to parse the HTML. + ts_parser_set_language(parser, tree_sitter_html()); + ts_parser_set_included_ranges(parser, html_ranges, html_range_count); + TSTree *html_tree = ts_parser_parse_string(parser, NULL, text, len); + TSNode html_root_node = ts_tree_root_node(html_tree); + + // Use the Ruby ranges to parse the Ruby. + ts_parser_set_language(parser, tree_sitter_ruby()); + ts_parser_set_included_ranges(parser, ruby_ranges, ruby_range_count); + TSTree *ruby_tree = ts_parser_parse_string(parser, NULL, text, len); + TSNode ruby_root_node = ts_tree_root_node(ruby_tree); + + // Print all three trees. + char *erb_sexp = ts_node_string(erb_root_node); + char *html_sexp = ts_node_string(html_root_node); + char *ruby_sexp = ts_node_string(ruby_root_node); + printf("ERB: %s\n", erb_sexp); + printf("HTML: %s\n", html_sexp); + printf("Ruby: %s\n", ruby_sexp); + return 0; +} +``` + +This API allows for great flexibility in how languages can be composed. Tree-sitter is not responsible for mediating the interactions between languages. Instead, you are free to do that using arbitrary application-specific logic. + +### Concurrency + +Tree-sitter supports multi-threaded use cases by making syntax trees very cheap to copy. + +```c +TSTree *ts_tree_copy(const TSTree *); +``` + +Internally, copying a syntax tree just entails incrementing an atomic reference count. Conceptually, it provides you a new tree which you can freely query, edit, reparse, or delete on a new thread while continuing to use the original tree on a different thread. Note that individual `TSTree` instances are _not_ thread safe; you must copy a tree if you want to use it on multiple threads simultaneously. + +## Other Tree Operations + +### Walking Trees with Tree Cursors + +You can access every node in a syntax tree using the `TSNode` APIs [described above](#retrieving-nodes), but if you need to access a large number of nodes, the fastest way to do so is with a _tree cursor_. A cursor is a stateful object that allows you to walk a syntax tree with maximum efficiency. + +Note that the given input node is considered the root of the cursor, and the +cursor cannot walk outside this node, so going to the parent or any sibling +of the root node will return `false`. This has no unexpected effects if the given +input node is the actual `root` node of the tree, but is something to keep in mind +when using nodes that are not the `root` node. + +You can initialize a cursor from any node: + +```c +TSTreeCursor ts_tree_cursor_new(TSNode); +``` + +You can move the cursor around the tree: + +```c +bool ts_tree_cursor_goto_first_child(TSTreeCursor *); +bool ts_tree_cursor_goto_next_sibling(TSTreeCursor *); +bool ts_tree_cursor_goto_parent(TSTreeCursor *); +``` + +These methods return `true` if the cursor successfully moved and `false` if there was no node to move to. + +You can always retrieve the cursor's current node, as well as the [field name](#node-field-names) that is associated with the current node. + +```c +TSNode ts_tree_cursor_current_node(const TSTreeCursor *); +const char *ts_tree_cursor_current_field_name(const TSTreeCursor *); +TSFieldId ts_tree_cursor_current_field_id(const TSTreeCursor *); +``` + +## Pattern Matching with Queries + +Many code analysis tasks involve searching for patterns in syntax trees. Tree-sitter provides a small declarative language for expressing these patterns and searching for matches. The language is similar to the format of Tree-sitter's [unit test system](./creating-parsers#command-test). + +### Query Syntax + +A _query_ consists of one or more _patterns_, where each pattern is an [S-expression](https://en.wikipedia.org/wiki/S-expression) that matches a certain set of nodes in a syntax tree. The expression to match a given node consists of a pair of parentheses containing two things: the node's type, and optionally, a series of other S-expressions that match the node's children. For example, this pattern would match any `binary_expression` node whose children are both `number_literal` nodes: + +```scheme +(binary_expression (number_literal) (number_literal)) +``` + +Children can also be omitted. For example, this would match any `binary_expression` where at least _one_ of child is a `string_literal` node: + +```scheme +(binary_expression (string_literal)) +``` + +#### Fields + +In general, it's a good idea to make patterns more specific by specifying [field names](#node-field-names) associated with child nodes. You do this by prefixing a child pattern with a field name followed by a colon. For example, this pattern would match an `assignment_expression` node where the `left` child is a `member_expression` whose `object` is a `call_expression`. + +```scheme +(assignment_expression + left: (member_expression + object: (call_expression))) +``` + +#### Negated Fields + +You can also constrain a pattern so that it only matches nodes that _lack_ a certain field. To do this, add a field name prefixed by a `!` within the parent pattern. For example, this pattern would match a class declaration with no type parameters: + +```scheme +(class_declaration + name: (identifier) @class_name + !type_parameters) +``` + +#### Anonymous Nodes + +The parenthesized syntax for writing nodes only applies to [named nodes](#named-vs-anonymous-nodes). To match specific anonymous nodes, you write their name between double quotes. For example, this pattern would match any `binary_expression` where the operator is `!=` and the right side is `null`: + +```scheme +(binary_expression + operator: "!=" + right: (null)) +``` + +#### Capturing Nodes + +When matching patterns, you may want to process specific nodes within the pattern. Captures allow you to associate names with specific nodes in a pattern, so that you can later refer to those nodes by those names. Capture names are written _after_ the nodes that they refer to, and start with an `@` character. + +For example, this pattern would match any assignment of a `function` to an `identifier`, and it would associate the name `the-function-name` with the identifier: + +```scheme +(assignment_expression + left: (identifier) @the-function-name + right: (function)) +``` + +And this pattern would match all method definitions, associating the name `the-method-name` with the method name, `the-class-name` with the containing class name: + +```scheme +(class_declaration + name: (identifier) @the-class-name + body: (class_body + (method_definition + name: (property_identifier) @the-method-name))) +``` + +#### Quantification Operators + +You can match a repeating sequence of sibling nodes using the postfix `+` and `*` _repetition_ operators, which work analogously to the `+` and `*` operators [in regular expressions](https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts). The `+` operator matches _one or more_ repetitions of a pattern, and the `*` operator matches _zero or more_. + +For example, this pattern would match a sequence of one or more comments: + +```scheme +(comment)+ +``` + +This pattern would match a class declaration, capturing all of the decorators if any were present: + +```scheme +(class_declaration + (decorator)* @the-decorator + name: (identifier) @the-name) +``` + +You can also mark a node as optional using the `?` operator. For example, this pattern would match all function calls, capturing a string argument if one was present: + +```scheme +(call_expression + function: (identifier) @the-function + arguments: (arguments (string)? @the-string-arg)) +``` + +#### Grouping Sibling Nodes + +You can also use parentheses for grouping a sequence of _sibling_ nodes. For example, this pattern would match a comment followed by a function declaration: + +```scheme +( + (comment) + (function_declaration) +) +``` + +Any of the quantification operators mentioned above (`+`, `*`, and `?`) can also be applied to groups. For example, this pattern would match a comma-separated series of numbers: + +```scheme +( + (number) + ("," (number))* +) +``` + +#### Alternations + +An alternation is written as a pair of square brackets (`[]`) containing a list of alternative patterns. +This is similar to _character classes_ from regular expressions (`[abc]` matches either a, b, or c). + +For example, this pattern would match a call to either a variable or an object property. +In the case of a variable, capture it as `@function`, and in the case of a property, capture it as `@method`: + +```scheme +(call_expression + function: [ + (identifier) @function + (member_expression + property: (property_identifier) @method) + ]) +``` + +This pattern would match a set of possible keyword tokens, capturing them as `@keyword`: + +```scheme +[ + "break" + "delete" + "else" + "for" + "function" + "if" + "return" + "try" + "while" +] @keyword +``` + +#### Wildcard Node + +A wildcard node is represented with an underscore (`_`), it matches any node. +This is similar to `.` in regular expressions. +There are two types, `(_)` will match any named node, +and `_` will match any named or anonymous node. + +For example, this pattern would match any node inside a call: + +```scheme +(call (_) @call.inner) +``` + +#### Anchors + +The anchor operator, `.`, is used to constrain the ways in which child patterns are matched. It has different behaviors depending on where it's placed inside a query. + +When `.` is placed before the _first_ child within a parent pattern, the child will only match when it is the first named node in the parent. For example, the below pattern matches a given `array` node at most once, assigning the `@the-element` capture to the first `identifier` node in the parent `array`: + +```scheme +(array . (identifier) @the-element) +``` + +Without this anchor, the pattern would match once for every identifier in the array, with `@the-element` bound to each matched identifier. + +Similarly, an anchor placed after a pattern's _last_ child will cause that child pattern to only match nodes that are the last named child of their parent. The below pattern matches only nodes that are the last named child within a `block`. + +```scheme +(block (_) @last-expression .) +``` + +Finally, an anchor _between_ two child patterns will cause the patterns to only match nodes that are immediate siblings. The pattern below, given a long dotted name like `a.b.c.d`, will only match pairs of consecutive identifiers: `a, b`, `b, c`, and `c, d`. + +```scheme +(dotted_name + (identifier) @prev-id + . + (identifier) @next-id) +``` + +Without the anchor, non-consecutive pairs like `a, c` and `b, d` would also be matched. + +The restrictions placed on a pattern by an anchor operator ignore anonymous nodes. + +#### Predicates + +You can also specify arbitrary metadata and conditions associated with a pattern +by adding _predicate_ S-expressions anywhere within your pattern. Predicate S-expressions +start with a _predicate name_ beginning with a `#` character. After that, they can +contain an arbitrary number of `@`-prefixed capture names or strings. + +Tree-Sitter's CLI supports the following predicates by default: + +##### eq?, not-eq?, any-eq?, any-not-eq? + +This family of predicates allows you to match against a single capture or string +value. + +The first argument must be a capture, but the second can be either a capture to +compare the two captures' text, or a string to compare first capture's text +against. + +The base predicate is "#eq?", but its complement "#not-eq?" can be used to _not_ +match a value. + +Consider the following example targeting C: + +```scheme +((identifier) @variable.builtin + (#eq? @variable.builtin "self")) +``` + +This pattern would match any identifier that is `self`. + +And this pattern would match key-value pairs where the `value` is an identifier +with the same name as the key: + +```scheme +( + (pair + key: (property_identifier) @key-name + value: (identifier) @value-name) + (#eq? @key-name @value-name) +) +``` + +The prefix "any-" is meant for use with quantified captures. Here's +an example finding a segment of empty comments + +```scheme +((comment)+ @comment.empty + (#any-eq? @comment.empty "//")) +``` + +Note that "#any-eq?" will match a quantified capture if +_any_ of the nodes match the predicate, while by default a quantified capture +will only match if _all_ the nodes match the predicate. + +##### match?, not-match?, any-match?, any-not-match? + +These predicates are similar to the eq? predicates, but they use regular expressions +to match against the capture's text. + +The first argument must be a capture, and the second must be a string containing +a regular expression. + +For example, this pattern would match identifier whose name is written in `SCREAMING_SNAKE_CASE`: + +```scheme +((identifier) @constant + (#match? @constant "^[A-Z][A-Z_]+")) +``` + +Here's an example finding potential documentation comments in C + +```scheme +((comment)+ @comment.documentation + (#match? @comment.documentation "^///\\s+.*")) +``` + +Here's another example finding Cgo comments to potentially inject with C + +```scheme +((comment)+ @injection.content + . + (import_declaration + (import_spec path: (interpreted_string_literal) @_import_c)) + (#eq? @_import_c "\"C\"") + (#match? @injection.content "^//")) +``` + +##### any-of?, not-any-of? + +The "any-of?" predicate allows you to match a capture against multiple strings, +and will match if the capture's text is equal to any of the strings. + +Consider this example that targets JavaScript: + +```scheme +((identifier) @variable.builtin + (#any-of? @variable.builtin + "arguments" + "module" + "console" + "window" + "document")) +``` + +This will match any of the builtin variables in JavaScript. + +_Note_ — Predicates are not handled directly by the Tree-sitter C library. +They are just exposed in a structured form so that higher-level code can perform +the filtering. However, higher-level bindings to Tree-sitter like +[the Rust Crate](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_rust) +or the [WebAssembly binding](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web) +do implement a few common predicates like the `#eq?`, `#match?`, and `#any-of?` +predicates explained above. + +To recap about the predicates Tree-Sitter's bindings support: + +- `#eq?` checks for a direct match against a capture or string +- `#match?` checks for a match against a regular expression +- `#any-of?` checks for a match against a list of strings +- Adding `not-` to the beginning of any of these predicates will negate the match +- By default, a quantified capture will only match if _all_ of the nodes match the predicate +- Adding `any-` before the `eq` or `match` predicates will instead match if any of the nodes match the predicate + + +### The Query API + +Create a query by specifying a string containing one or more patterns: + +```c +TSQuery *ts_query_new( + const TSLanguage *language, + const char *source, + uint32_t source_len, + uint32_t *error_offset, + TSQueryError *error_type +); +``` + +If there is an error in the query, then the `error_offset` argument will be set to the byte offset of the error, and the `error_type` argument will be set to a value that indicates the type of error: + +```c +typedef enum { + TSQueryErrorNone = 0, + TSQueryErrorSyntax, + TSQueryErrorNodeType, + TSQueryErrorField, + TSQueryErrorCapture, +} TSQueryError; +``` + +The `TSQuery` value is immutable and can be safely shared between threads. To execute the query, create a `TSQueryCursor`, which carries the state needed for processing the queries. The query cursor should not be shared between threads, but can be reused for many query executions. + +```c +TSQueryCursor *ts_query_cursor_new(void); +``` + +You can then execute the query on a given syntax node: + +```c +void ts_query_cursor_exec(TSQueryCursor *, const TSQuery *, TSNode); +``` + +You can then iterate over the matches: + +```c +typedef struct { + TSNode node; + uint32_t index; +} TSQueryCapture; + +typedef struct { + uint32_t id; + uint16_t pattern_index; + uint16_t capture_count; + const TSQueryCapture *captures; +} TSQueryMatch; + +bool ts_query_cursor_next_match(TSQueryCursor *, TSQueryMatch *match); +``` + +This function will return `false` when there are no more matches. Otherwise, it will populate the `match` with data about which pattern matched and which nodes were captured. + +## Static Node Types + +In languages with static typing, it can be helpful for syntax trees to provide specific type information about individual syntax nodes. Tree-sitter makes this information available via a generated file called `node-types.json`. This _node types_ file provides structured data about every possible syntax node in a grammar. + +You can use this data to generate type declarations in statically-typed programming languages. For example, GitHub's [Semantic](https://github.com/github/semantic) uses these node types files to [generate Haskell data types](https://github.com/github/semantic/tree/master/semantic-ast) for every possible syntax node, which allows for code analysis algorithms to be structurally verified by the Haskell type system. + +The node types file contains an array of objects, each of which describes a particular type of syntax node using the following entries: + +#### Basic Info + +Every object in this array has these two entries: + +- `"type"` - A string that indicates which grammar rule the node represents. This corresponds to the `ts_node_type` function described [above](#syntax-nodes). +- `"named"` - A boolean that indicates whether this kind of node corresponds to a rule name in the grammar or just a string literal. See [above](#named-vs-anonymous-nodes) for more info. + +Examples: + +```json +{ + "type": "string_literal", + "named": true +} +{ + "type": "+", + "named": false +} +``` + +Together, these two fields constitute a unique identifier for a node type; no two top-level objects in the `node-types.json` should have the same values for both `"type"` and `"named"`. + +#### Internal Nodes + +Many syntax nodes can have _children_. The node type object describes the possible children that a node can have using the following entries: + +- `"fields"` - An object that describes the possible [fields](#node-field-names) that the node can have. The keys of this object are field names, and the values are _child type_ objects, described below. +- `"children"` - Another _child type_ object that describes all of the node's possible _named_ children _without_ fields. + +A _child type_ object describes a set of child nodes using the following entries: + +- `"required"` - A boolean indicating whether there is always _at least one_ node in this set. +- `"multiple"` - A boolean indicating whether there can be _multiple_ nodes in this set. +- `"types"`- An array of objects that represent the possible types of nodes in this set. Each object has two keys: `"type"` and `"named"`, whose meanings are described above. + +Example with fields: + +```json +{ + "type": "method_definition", + "named": true, + "fields": { + "body": { + "multiple": false, + "required": true, + "types": [{ "type": "statement_block", "named": true }] + }, + "decorator": { + "multiple": true, + "required": false, + "types": [{ "type": "decorator", "named": true }] + }, + "name": { + "multiple": false, + "required": true, + "types": [ + { "type": "computed_property_name", "named": true }, + { "type": "property_identifier", "named": true } + ] + }, + "parameters": { + "multiple": false, + "required": true, + "types": [{ "type": "formal_parameters", "named": true }] + } + } +} +``` + +Example with children: + +```json +{ + "type": "array", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { "type": "_expression", "named": true }, + { "type": "spread_element", "named": true } + ] + } +} +``` + +#### Supertype Nodes + +In Tree-sitter grammars, there are usually certain rules that represent abstract _categories_ of syntax nodes (e.g. "expression", "type", "declaration"). In the `grammar.js` file, these are often written as [hidden rules](./creating-parsers#hiding-rules) whose definition is a simple [`choice`](./creating-parsers#the-grammar-dsl) where each member is just a single symbol. + +Normally, hidden rules are not mentioned in the node types file, since they don't appear in the syntax tree. But if you add a hidden rule to the grammar's [`supertypes` list](./creating-parsers#the-grammar-dsl), then it _will_ show up in the node types file, with the following special entry: + +- `"subtypes"` - An array of objects that specify the _types_ of nodes that this 'supertype' node can wrap. + +Example: + +```json +{ + "type": "_declaration", + "named": true, + "subtypes": [ + { "type": "class_declaration", "named": true }, + { "type": "function_declaration", "named": true }, + { "type": "generator_function_declaration", "named": true }, + { "type": "lexical_declaration", "named": true }, + { "type": "variable_declaration", "named": true } + ] +} +``` + +Supertype nodes will also appear elsewhere in the node types file, as children of other node types, in a way that corresponds with how the supertype rule was used in the grammar. This can make the node types much shorter and easier to read, because a single supertype will take the place of multiple subtypes. + +Example: + +```json +{ + "type": "export_statement", + "named": true, + "fields": { + "declaration": { + "multiple": false, + "required": false, + "types": [{ "type": "_declaration", "named": true }] + }, + "source": { + "multiple": false, + "required": false, + "types": [{ "type": "string", "named": true }] + } + } +} +``` diff --git a/docs/section-3-creating-parsers.md b/docs/section-3-creating-parsers.md new file mode 100644 index 00000000..e0681732 --- /dev/null +++ b/docs/section-3-creating-parsers.md @@ -0,0 +1,1033 @@ +--- +title: Creating Parsers +permalink: creating-parsers +--- + +# Creating parsers + +Developing Tree-sitter grammars can have a difficult learning curve, but once you get the hang of it, it can be fun and even zen-like. This document will help you to get started and to develop a useful mental model. + +## Getting Started + +### Dependencies + +In order to develop a Tree-sitter parser, there are two dependencies that you need to install: + +* **Node.js** - Tree-sitter grammars are written in JavaScript, and Tree-sitter uses [Node.js][node.js] to interpret JavaScript files. It requires the `node` command to be in one of the directories in your [`PATH`][path-env]. You'll need Node.js version 6.0 or greater. +* **A C Compiler** - Tree-sitter creates parsers that are written in C. In order to run and test these parsers with the `tree-sitter parse` or `tree-sitter test` commands, you must have a C compiler installed. Tree-sitter will try to look for these compilers in the standard places for each platform. + +### Installation + +To create a Tree-sitter parser, you need to use [the `tree-sitter` CLI][tree-sitter-cli]. You can install the CLI in a few different ways: + +* Build the `tree-sitter-cli` [Rust crate][crate] from source using [`cargo`][cargo], the Rust package manager. This works on any platform. See [the contributing docs](./contributing#developing-tree-sitter) for more information. +* Install the `tree-sitter-cli` [Node.js module][node-module] using [`npm`][npm], the Node package manager. This approach is fast, but is only works on certain platforms, because it relies on pre-built binaries. +* Download a binary for your platform from [the latest GitHub release][releases], and put it into a directory on your `PATH`. + +### Project Setup + +The preferred convention is to name the parser repository "tree-sitter-" followed by the name of the language. + +```sh +mkdir tree-sitter-${YOUR_LANGUAGE_NAME} +cd tree-sitter-${YOUR_LANGUAGE_NAME} +``` + +You can use the `npm` command line tool to create a `package.json` file that describes your project, and allows your parser to be used from Node.js. + +```sh +# This will prompt you for input +npm init + +# This installs a small module that lets your parser be used from Node +npm install --save nan + +# This installs the Tree-sitter CLI itself +npm install --save-dev tree-sitter-cli +``` + +The last command will install the CLI into the `node_modules` folder in your working directory. An executable program called `tree-sitter` will be created inside of `node_modules/.bin/`. You may want to follow the Node.js convention of adding that folder to your `PATH` so that you can easily run this program when working in this directory. + +```sh +# In your shell profile script +export PATH=$PATH:./node_modules/.bin +``` + +Once you have the CLI installed, create a file called `grammar.js` with the following contents: + +```js +/// +// @ts-check + +module.exports = grammar({ + name: 'YOUR_LANGUAGE_NAME', + + rules: { + // TODO: add the actual grammar rules + source_file: $ => 'hello' + } +}); +``` + +Then run the following command: + +```sh +tree-sitter generate +``` + +This will generate the C code required to parse this trivial language, as well as a few files that are needed to compile and load this native parser as a Node.js module. + +You can test this parser by creating a source file with the contents "hello" and parsing it: + +```sh +echo 'hello' > example-file +tree-sitter parse example-file +``` + +Alternatively, in Windows PowerShell: + +```pwsh +"hello" | Out-File example-file -Encoding utf8 +tree-sitter parse example-file +``` + +This should print the following: + +```text +(source_file [0, 0] - [1, 0]) +``` + +You now have a working parser. + +## Tool Overview + +Let's go over all of the functionality of the `tree-sitter` command line tool. + +### Command: `generate` + +The most important command you'll use is `tree-sitter generate`. This command reads the `grammar.js` file in your current working directory and creates a file called `src/parser.c`, which implements the parser. After making changes to your grammar, just run `tree-sitter generate` again. + +The first time you run `tree-sitter generate`, it will also generate a few other files for bindings for the following languages: + +#### C/C++ + +* `Makefile` - This file tells `make` how to compile your language. +* `bindings/c/tree-sitter-language.h` - This file provides the C interface of your language. +* `bindings/c/tree-sitter-language.pc` - This file provides pkg-config metadata about your language's C library. +* `src/tree_sitter/parser.h` - This file provides some basic C definitions that are used in your generated `parser.c` file. +* `src/tree_sitter/alloc.h` - This file provides some memory allocation macros that are to be used in your external scanner, if you have one. +* `src/tree_sitter/array.h` - This file provides some array macros that are to be used in your external scanner, if you have one. + +#### Go + +* `bindings/go/binding.go` - This file wraps your language in a Go module. +* `bindings/go/binding_test.go` - This file contains a test for the Go package. + +#### Node + +* `binding.gyp` - This file tells Node.js how to compile your language. +* `bindings/node/index.js` - This is the file that Node.js initially loads when using your language. +* `bindings/node/binding.cc` - This file wraps your language in a JavaScript module for Node.js. + +#### Python + +* `pyproject.toml` - This file is the manifest of the Python package. +* `setup.py` - This file tells Python how to compile your language. +* `bindings/python/binding.c` - This file wraps your language in a Python module. +* `bindings/python/tree_sitter_language/__init__.py` - This file tells Python how to load your language. +* `bindings/python/tree_sitter_language/__init__.pyi` - This file provides type hints for your parser when used in Python. +* `bindings/python/tree_sitter_language/py.typed` - This file provides type hints for your parser when used in Python. + +#### Rust + +* `Cargo.toml` - This file is the manifest of the Rust package. +* `bindings/rust/lib.rs` - This file wraps your language in a Rust crate when used in Rust. +* `bindings/rust/build.rs` - This file wraps the building process for the Rust crate. + +#### Swift + +* `Package.swift` - This file tells Swift how to compile your language. +* `bindings/swift/TreeSitterLanguage/language.h` - This file wraps your language in a Swift module when used in Swift. + +If there is an ambiguity or *local ambiguity* in your grammar, Tree-sitter will detect it during parser generation, and it will exit with a `Unresolved conflict` error message. See below for more information on these errors. + +### Command: `build` + +The `build` command compiles your parser into a dynamically-loadable library, either as a shared object (`.so`, `.dylib`, or `.dll`) or as a WASM module. + +You can change the compiler executable via the `CC` environment variable and add extra flags via `CFLAGS`. For macOS or iOS, you can set `MACOSX_DEPLOYMENT_TARGET` or `IPHONEOS_DEPLOYMENT_TARGET` respectively to define the minimum supported version. + +You can specify whether to compile it as a wasm module with the `--wasm`/`-w` flag, and you can opt to use docker or podman to supply emscripten with the `--docker`/`-d` flag. This removes the need to install emscripten on your machine locally. + +You can specify where to output the shared object file (native or WASM) with the `--output`/`-o` flag, which accepts either an absolute path or relative path. Note that if you don't supply this flag, the CLI will attempt to figure out what the language name is based on the parent directory (so building in `tree-sitter-javascript` will resolve to `javascript`) to use for the output file. If it can't figure it out, it will default to `parser`, thus generating `parser.so` or `parser.wasm` in the current working directory. + +Lastly, you can also specify a path to the actual grammar directory, in case you are not currently in one. This is done by providing a path as the first *positional* argument. + +Example: + +```sh +tree-sitter build --wasm --output ./build/parser.wasm tree-sitter-javascript +``` + +Notice how the `tree-sitter-javascript` argument is the first positional argument. + +### Command: `test` + +The `tree-sitter test` command allows you to easily test that your parser is working correctly. + +For each rule that you add to the grammar, you should first create a *test* that describes how the syntax trees should look when parsing that rule. These tests are written using specially-formatted text files in the `test/corpus/` directory within your parser's root folder. + +For example, you might have a file called `test/corpus/statements.txt` that contains a series of entries like this: + +```text +================== +Return statements +================== + +func x() int { + return 1; +} + +--- + +(source_file + (function_definition + (identifier) + (parameter_list) + (primitive_type) + (block + (return_statement (number))))) +``` + +* The **name** of each test is written between two lines containing only `=` (equal sign) characters. +* Then the **input source code** is written, followed by a line containing three or more `-` (dash) characters. +* Then, the **expected output syntax tree** is written as an [S-expression][s-exp]. The exact placement of whitespace in the S-expression doesn't matter, but ideally the syntax tree should be legible. Note that the S-expression does not show syntax nodes like `func`, `(` and `;`, which are expressed as strings and regexes in the grammar. It only shows the *named* nodes, as described in [this section][named-vs-anonymous-nodes-section] of the page on parser usage. + + The expected output section can also *optionally* show the [*field names*][field-names-section] associated with each child node. To include field names in your tests, you write a node's field name followed by a colon, before the node itself in the S-expression: + +```text +(source_file + (function_definition + name: (identifier) + parameters: (parameter_list) + result: (primitive_type) + body: (block + (return_statement (number))))) +``` + +* If your language's syntax conflicts with the `===` and `---` test separators, you can optionally add an arbitrary identical suffix (in the below example, `|||`) to disambiguate them: + +```text +==================||| +Basic module +==================||| + +---- MODULE Test ---- +increment(n) == n + 1 +==== + +---||| + +(source_file + (module (identifier) + (operator (identifier) + (parameter_list (identifier)) + (plus (identifier_ref) (number))))) +``` + +These tests are important. They serve as the parser's API documentation, and they can be run every time you change the grammar to verify that everything still parses correctly. + +By default, the `tree-sitter test` command runs all of the tests in your `test/corpus/` folder. To run a particular test, you can use the `-f` flag: + +```sh +tree-sitter test -f 'Return statements' +``` + +The recommendation is to be comprehensive in adding tests. If it's a visible node, add it to a test file in your `test/corpus` directory. It's typically a good idea to test all of the permutations of each language construct. This increases test coverage, but doubly acquaints readers with a way to examine expected outputs and understand the "edges" of a language. + +#### Attributes + +Tests can be annotated with a few `attributes`. Attributes must be put in the header, below the test name, and start with a `:`. +A couple of attributes also take in a parameter, which require the use of parenthesis. + +**Note**: If you'd like to supply in multiple parameters, e.g. to run tests on multiple platforms or to test multiple languages, you can repeat the attribute on a new line. + +The following attributes are available: + +- `:skip` — This attribute will skip the test when running `tree-sitter test`. + This is useful when you want to temporarily disable running a test without deleting it. +- `:error` — This attribute will assert that the parse tree contains an error. It's useful to just validate that a certain input is invalid without displaying the whole parse tree, as such you should omit the parse tree below the `---` line. +- `:fail-fast` — This attribute will stop the testing additional tests if the test marked with this attribute fails. +- `:language(LANG)` — This attribute will run the tests using the parser for the specified language. This is useful for multi-parser repos, such as XML and DTD, or Typescript and TSX. The default parser will be the first entry in the `tree-sitter` field in the root `package.json`, so having a way to pick a second or even third parser is useful. +- `:platform(PLATFORM)` — This attribute specifies the platform on which the test should run. It is useful to test platform-specific behavior (e.g. Windows newlines are different from Unix). This attribute must match up with Rust's [`std::env::consts::OS`](https://doc.rust-lang.org/std/env/consts/constant.OS.html). + +Examples using attributes: + +```text +========================= +Test that will be skipped +:skip +========================= + +int main() {} + +------------------------- + +==================================== +Test that will run on Linux or macOS + +:platform(linux) +:platform(macos) +==================================== + +int main() {} + +------------------------------------ + +======================================================================== +Test that expects an error, and will fail fast if there's no parse error +:fail-fast +:error +======================================================================== + +int main ( {} + +------------------------------------------------------------------------ + +================================================= +Test that will parse with both Typescript and TSX +:language(typescript) +:language(tsx) +================================================= + +console.log('Hello, world!'); + +------------------------------------------------- +``` + +#### Automatic Compilation + +You might notice that the first time you run `tree-sitter test` after regenerating your parser, it takes some extra time. This is because Tree-sitter automatically compiles your C code into a dynamically-loadable library. It recompiles your parser as-needed whenever you update it by re-running `tree-sitter generate`. + +#### Syntax Highlighting Tests + +The `tree-sitter test` command will *also* run any syntax highlighting tests in the `test/highlight` folder, if it exists. For more information about syntax highlighting tests, see [the syntax highlighting page][syntax-highlighting-tests]. + +### Command: `parse` + +You can run your parser on an arbitrary file using `tree-sitter parse`. This will print the resulting the syntax tree, including nodes' ranges and field names, like this: + +```text +(source_file [0, 0] - [3, 0] + (function_declaration [0, 0] - [2, 1] + name: (identifier [0, 5] - [0, 9]) + parameters: (parameter_list [0, 9] - [0, 11]) + result: (type_identifier [0, 12] - [0, 15]) + body: (block [0, 16] - [2, 1] + (return_statement [1, 2] - [1, 10] + (expression_list [1, 9] - [1, 10] + (int_literal [1, 9] - [1, 10])))))) +``` + +You can pass any number of file paths and glob patterns to `tree-sitter parse`, and it will parse all of the given files. The command will exit with a non-zero status code if any parse errors occurred. You can also prevent the syntax trees from being printed using the `--quiet` flag. Additionally, the `--stat` flag prints out aggregated parse success/failure information for all processed files. This makes `tree-sitter parse` usable as a secondary testing strategy: you can check that a large number of files parse without error: + +```sh +tree-sitter parse 'examples/**/*.go' --quiet --stat +``` + +### Command: `highlight` + +You can run syntax highlighting on an arbitrary file using `tree-sitter highlight`. This can either output colors directly to your terminal using ansi escape codes, or produce HTML (if the `--html` flag is passed). For more information, see [the syntax highlighting page][syntax-highlighting]. + +### The Grammar DSL + +The following is a complete list of built-in functions you can use in your `grammar.js` to define rules. Use-cases for some of these functions will be explained in more detail in later sections. + +* **Symbols (the `$` object)** - Every grammar rule is written as a JavaScript function that takes a parameter conventionally called `$`. The syntax `$.identifier` is how you refer to another grammar symbol within a rule. Names starting with `$.MISSING` or `$.UNEXPECTED` should be avoided as they have special meaning for the `tree-sitter test` command. +* **String and Regex literals** - The terminal symbols in a grammar are described using JavaScript strings and regular expressions. Of course during parsing, Tree-sitter does not actually use JavaScript's regex engine to evaluate these regexes; it generates its own regex-matching logic as part of each parser. Regex literals are just used as a convenient way of writing regular expressions in your grammar. +* **Regex Limitations** - Currently, only a subset of the Regex engine is actually +supported. This is due to certain features like lookahead and lookaround assertions +not feasible to use in an LR(1) grammar, as well as certain flags being unnecessary +for tree-sitter. However, plenty of features are supported by default: + + * Character classes + * Character ranges + * Character sets + * Quantifiers + * Alternation + * Grouping + * Unicode character escapes + * Unicode property escapes + +* **Sequences : `seq(rule1, rule2, ...)`** - This function creates a rule that matches any number of other rules, one after another. It is analogous to simply writing multiple symbols next to each other in [EBNF notation][ebnf]. +* **Alternatives : `choice(rule1, rule2, ...)`** - This function creates a rule that matches *one* of a set of possible rules. The order of the arguments does not matter. This is analogous to the `|` (pipe) operator in EBNF notation. +* **Repetitions : `repeat(rule)`** - This function creates a rule that matches *zero-or-more* occurrences of a given rule. It is analogous to the `{x}` (curly brace) syntax in EBNF notation. +* **Repetitions : `repeat1(rule)`** - This function creates a rule that matches *one-or-more* occurrences of a given rule. The previous `repeat` rule is implemented in terms of `repeat1` but is included because it is very commonly used. +* **Options : `optional(rule)`** - This function creates a rule that matches *zero or one* occurrence of a given rule. It is analogous to the `[x]` (square bracket) syntax in EBNF notation. +* **Precedence : `prec(number, rule)`** - This function marks the given rule with a numerical precedence which will be used to resolve [*LR(1) Conflicts*][lr-conflict] at parser-generation time. When two rules overlap in a way that represents either a true ambiguity or a *local* ambiguity given one token of lookahead, Tree-sitter will try to resolve the conflict by matching the rule with the higher precedence. The default precedence of all rules is zero. This works similarly to the [precedence directives][yacc-prec] in Yacc grammars. +* **Left Associativity : `prec.left([number], rule)`** - This function marks the given rule as left-associative (and optionally applies a numerical precedence). When an LR(1) conflict arises in which all of the rules have the same numerical precedence, Tree-sitter will consult the rules' associativity. If there is a left-associative rule, Tree-sitter will prefer matching a rule that ends *earlier*. This works similarly to [associativity directives][yacc-prec] in Yacc grammars. +* **Right Associativity : `prec.right([number], rule)`** - This function is like `prec.left`, but it instructs Tree-sitter to prefer matching a rule that ends *later*. +* **Dynamic Precedence : `prec.dynamic(number, rule)`** - This function is similar to `prec`, but the given numerical precedence is applied at *runtime* instead of at parser generation time. This is only necessary when handling a conflict dynamically using the `conflicts` field in the grammar, and when there is a genuine *ambiguity*: multiple rules correctly match a given piece of code. In that event, Tree-sitter compares the total dynamic precedence associated with each rule, and selects the one with the highest total. This is similar to [dynamic precedence directives][bison-dprec] in Bison grammars. +* **Tokens : `token(rule)`** - This function marks the given rule as producing only +a single token. Tree-sitter's default is to treat each String or RegExp literal +in the grammar as a separate token. Each token is matched separately by the lexer +and returned as its own leaf node in the tree. The `token` function allows you to +express a complex rule using the functions described above (rather than as a single +regular expression) but still have Tree-sitter treat it as a single token. +The token function will only accept terminal rules, so `token($.foo)` will not work. +You can think of it as a shortcut for squashing complex rules of strings or regexes +down to a single token. +* **Immediate Tokens : `token.immediate(rule)`** - Usually, whitespace (and any other extras, such as comments) is optional before each token. This function means that the token will only match if there is no whitespace. +* **Aliases : `alias(rule, name)`** - This function causes the given rule to *appear* with an alternative name in the syntax tree. If `name` is a *symbol*, as in `alias($.foo, $.bar)`, then the aliased rule will *appear* as a [named node][named-vs-anonymous-nodes-section] called `bar`. And if `name` is a *string literal*, as in `alias($.foo, 'bar')`, then the aliased rule will appear as an [anonymous node][named-vs-anonymous-nodes-section], as if the rule had been written as the simple string. +* **Field Names : `field(name, rule)`** - This function assigns a *field name* to the child node(s) matched by the given rule. In the resulting syntax tree, you can then use that field name to access specific children. + +In addition to the `name` and `rules` fields, grammars have a few other optional public fields that influence the behavior of the parser. + +* **`extras`** - an array of tokens that may appear *anywhere* in the language. This is often used for whitespace and comments. The default value of `extras` is to accept whitespace. To control whitespace explicitly, specify `extras: $ => []` in your grammar. +* **`inline`** - an array of rule names that should be automatically *removed* from the grammar by replacing all of their usages with a copy of their definition. This is useful for rules that are used in multiple places but for which you *don't* want to create syntax tree nodes at runtime. +* **`conflicts`** - an array of arrays of rule names. Each inner array represents a set of rules that's involved in an *LR(1) conflict* that is *intended to exist* in the grammar. When these conflicts occur at runtime, Tree-sitter will use the GLR algorithm to explore all of the possible interpretations. If *multiple* parses end up succeeding, Tree-sitter will pick the subtree whose corresponding rule has the highest total *dynamic precedence*. +* **`externals`** - an array of token names which can be returned by an [*external scanner*](#external-scanners). External scanners allow you to write custom C code which runs during the lexing process in order to handle lexical rules (e.g. Python's indentation tokens) that cannot be described by regular expressions. +* **`precedences`** - an array of array of strings, where each array of strings defines named precedence levels in descending order. These names can be used in the `prec` functions to define precedence relative only to other names in the array, rather than globally. Can only be used with parse precedence, not lexical precedence. +* **`word`** - the name of a token that will match keywords for the purpose of the [keyword extraction](#keyword-extraction) optimization. +* **`supertypes`** an array of hidden rule names which should be considered to be 'supertypes' in the generated [*node types* file][static-node-types]. + +## Writing the Grammar + +Writing a grammar requires creativity. There are an infinite number of CFGs (context-free grammars) that can be used to describe any given language. In order to produce a good Tree-sitter parser, you need to create a grammar with two important properties: + +1. **An intuitive structure** - Tree-sitter's output is a [concrete syntax tree][cst]; each node in the tree corresponds directly to a [terminal or non-terminal symbol][non-terminal] in the grammar. So in order to produce an easy-to-analyze tree, there should be a direct correspondence between the symbols in your grammar and the recognizable constructs in the language. This might seem obvious, but it is very different from the way that context-free grammars are often written in contexts like [language specifications][language-spec] or [Yacc][yacc]/[Bison][bison] parsers. + +2. **A close adherence to LR(1)** - Tree-sitter is based on the [GLR parsing][glr-parsing] algorithm. This means that while it can handle any context-free grammar, it works most efficiently with a class of context-free grammars called [LR(1) Grammars][lr-grammars]. In this respect, Tree-sitter's grammars are similar to (but less restrictive than) [Yacc][yacc] and [Bison][bison] grammars, but *different* from [ANTLR grammars][antlr], [Parsing Expression Grammars][peg], or the [ambiguous grammars][ambiguous-grammar] commonly used in language specifications. + +It's unlikely that you'll be able to satisfy these two properties just by translating an existing context-free grammar directly into Tree-sitter's grammar format. There are a few kinds of adjustments that are often required. The following sections will explain these adjustments in more depth. + +### The First Few Rules + +It's usually a good idea to find a formal specification for the language you're trying to parse. This specification will most likely contain a context-free grammar. As you read through the rules of this CFG, you will probably discover a complex and cyclic graph of relationships. It might be unclear how you should navigate this graph as you define your grammar. + +Although languages have very different constructs, their constructs can often be categorized in to similar groups like *Declarations*, *Definitions*, *Statements*, *Expressions*, *Types*, and *Patterns*. In writing your grammar, a good first step is to create just enough structure to include all of these basic *groups* of symbols. For a language like Go, you might start with something like this: + +```js +{ + // ... + + rules: { + source_file: $ => repeat($._definition), + + _definition: $ => choice( + $.function_definition + // TODO: other kinds of definitions + ), + + function_definition: $ => seq( + 'func', + $.identifier, + $.parameter_list, + $._type, + $.block + ), + + parameter_list: $ => seq( + '(', + // TODO: parameters + ')' + ), + + _type: $ => choice( + 'bool' + // TODO: other kinds of types + ), + + block: $ => seq( + '{', + repeat($._statement), + '}' + ), + + _statement: $ => choice( + $.return_statement + // TODO: other kinds of statements + ), + + return_statement: $ => seq( + 'return', + $._expression, + ';' + ), + + _expression: $ => choice( + $.identifier, + $.number + // TODO: other kinds of expressions + ), + + identifier: $ => /[a-z]+/, + + number: $ => /\d+/ + } +} +``` + +Some of the details of this grammar will be explained in more depth later on, but if you focus on the `TODO` comments, you can see that the overall strategy is *breadth-first*. Notably, this initial skeleton does not need to directly match an exact subset of the context-free grammar in the language specification. It just needs to touch on the major groupings of rules in as simple and obvious a way as possible. + +With this structure in place, you can now freely decide what part of the grammar to flesh out next. For example, you might decide to start with *types*. One-by-one, you could define the rules for writing basic types and composing them into more complex types: + +```js +{ + // ... + + _type: $ => choice( + $.primitive_type, + $.array_type, + $.pointer_type + ), + + primitive_type: $ => choice( + 'bool', + 'int' + ), + + array_type: $ => seq( + '[', + ']', + $._type + ), + + pointer_type: $ => seq( + '*', + $._type + ) +} +``` + +After developing the *type* sublanguage a bit further, you might decide to switch to working on *statements* or *expressions* instead. It's often useful to check your progress by trying to parse some real code using `tree-sitter parse`. + +**And remember to add tests for each rule in your `test/corpus` folder!** + +### Structuring Rules Well + +Imagine that you were just starting work on the [Tree-sitter JavaScript parser][tree-sitter-javascript]. Naively, you might try to directly mirror the structure of the [ECMAScript Language Spec][ecmascript-spec]. To illustrate the problem with this approach, consider the following line of code: + +```js +return x + y; +``` + +According to the specification, this line is a `ReturnStatement`, the fragment `x + y` is an `AdditiveExpression`, and `x` and `y` are both `IdentifierReferences`. The relationship between these constructs is captured by a complex series of production rules: + +```text +ReturnStatement -> 'return' Expression +Expression -> AssignmentExpression +AssignmentExpression -> ConditionalExpression +ConditionalExpression -> LogicalORExpression +LogicalORExpression -> LogicalANDExpression +LogicalANDExpression -> BitwiseORExpression +BitwiseORExpression -> BitwiseXORExpression +BitwiseXORExpression -> BitwiseANDExpression +BitwiseANDExpression -> EqualityExpression +EqualityExpression -> RelationalExpression +RelationalExpression -> ShiftExpression +ShiftExpression -> AdditiveExpression +AdditiveExpression -> MultiplicativeExpression +MultiplicativeExpression -> ExponentiationExpression +ExponentiationExpression -> UnaryExpression +UnaryExpression -> UpdateExpression +UpdateExpression -> LeftHandSideExpression +LeftHandSideExpression -> NewExpression +NewExpression -> MemberExpression +MemberExpression -> PrimaryExpression +PrimaryExpression -> IdentifierReference +``` + +The language spec encodes the twenty different precedence levels of JavaScript expressions using twenty levels of indirection between `IdentifierReference` and `Expression`. If we were to create a concrete syntax tree representing this statement according to the language spec, it would have twenty levels of nesting, and it would contain nodes with names like `BitwiseXORExpression`, which are unrelated to the actual code. + +### Using Precedence + +To produce a readable syntax tree, we'd like to model JavaScript expressions using a much flatter structure like this: + +```js +{ + // ... + + _expression: $ => choice( + $.identifier, + $.unary_expression, + $.binary_expression, + // ... + ), + + unary_expression: $ => choice( + seq('-', $._expression), + seq('!', $._expression), + // ... + ), + + binary_expression: $ => choice( + seq($._expression, '*', $._expression), + seq($._expression, '+', $._expression), + // ... + ), +} +``` + +Of course, this flat structure is highly ambiguous. If we try to generate a parser, Tree-sitter gives us an error message: + +```text +Error: Unresolved conflict for symbol sequence: + + '-' _expression • '*' … + +Possible interpretations: + + 1: '-' (binary_expression _expression • '*' _expression) + 2: (unary_expression '-' _expression) • '*' … + +Possible resolutions: + + 1: Specify a higher precedence in `binary_expression` than in the other rules. + 2: Specify a higher precedence in `unary_expression` than in the other rules. + 3: Specify a left or right associativity in `unary_expression` + 4: Add a conflict for these rules: `binary_expression` `unary_expression` +``` + +Note: The • character in the error message indicates where exactly during +parsing the conflict occurs, or in other words, where the parser is encountering +ambiguity. + +For an expression like `-a * b`, it's not clear whether the `-` operator applies to the `a * b` or just to the `a`. This is where the `prec` function [described above](#the-grammar-dsl) comes into play. By wrapping a rule with `prec`, we can indicate that certain sequence of symbols should *bind to each other more tightly* than others. For example, the `'-', $._expression` sequence in `unary_expression` should bind more tightly than the `$._expression, '+', $._expression` sequence in `binary_expression`: + +```js +{ + // ... + + unary_expression: $ => prec(2, choice( + seq('-', $._expression), + seq('!', $._expression), + // ... + )) +} +``` + +### Using Associativity + +Applying a higher precedence in `unary_expression` fixes that conflict, but there is still another conflict: + +```text +Error: Unresolved conflict for symbol sequence: + + _expression '*' _expression • '*' … + +Possible interpretations: + + 1: _expression '*' (binary_expression _expression • '*' _expression) + 2: (binary_expression _expression '*' _expression) • '*' … + +Possible resolutions: + + 1: Specify a left or right associativity in `binary_expression` + 2: Add a conflict for these rules: `binary_expression` +``` + +For an expression like `a * b * c`, it's not clear whether we mean `a * (b * c)` or `(a * b) * c`. This is where `prec.left` and `prec.right` come into use. We want to select the second interpretation, so we use `prec.left`. + +```js +{ + // ... + + binary_expression: $ => choice( + prec.left(2, seq($._expression, '*', $._expression)), + prec.left(1, seq($._expression, '+', $._expression)), + // ... + ), +} +``` + +### Hiding Rules + +You may have noticed in the above examples that some of the grammar rule name like `_expression` and `_type` began with an underscore. Starting a rule's name with an underscore causes the rule to be *hidden* in the syntax tree. This is useful for rules like `_expression` in the grammars above, which always just wrap a single child node. If these nodes were not hidden, they would add substantial depth and noise to the syntax tree without making it any easier to understand. + +### Using Fields + +Often, it's easier to analyze a syntax node if you can refer to its children by *name* instead of by their position in an ordered list. Tree-sitter grammars support this using the `field` function. This function allows you to assign unique names to some or all of a node's children: + +```js +function_definition: $ => seq( + 'func', + field('name', $.identifier), + field('parameters', $.parameter_list), + field('return_type', $._type), + field('body', $.block) +) +``` + +Adding fields like this allows you to retrieve nodes using the [field APIs][field-names-section]. + +## Lexical Analysis + +Tree-sitter's parsing process is divided into two phases: parsing (which is described above) and [lexing][lexing] - the process of grouping individual characters into the language's fundamental *tokens*. There are a few important things to know about how Tree-sitter's lexing works. + +### Conflicting Tokens + +Grammars often contain multiple tokens that can match the same characters. For example, a grammar might contain the tokens (`"if"` and `/[a-z]+/`). Tree-sitter differentiates between these conflicting tokens in a few ways. + +1. **Context-aware Lexing** - Tree-sitter performs lexing on-demand, during the parsing process. At any given position in a source document, the lexer only tries to recognize tokens that are *valid* at that position in the document. + +2. **Lexical Precedence** - When the precedence functions described [above](#the-grammar-dsl) are used *within* the `token` function, the given explicit precedence values serve as instructions to the lexer. If there are two valid tokens that match the characters at a given position in the document, Tree-sitter will select the one with the higher precedence. + +3. **Match Length** - If multiple valid tokens with the same precedence match the characters at a given position in a document, Tree-sitter will select the token that matches the [longest sequence of characters][longest-match]. + +4. **Match Specificity** - If there are two valid tokens with the same precedence and which both match the same number of characters, Tree-sitter will prefer a token that is specified in the grammar as a `String` over a token specified as a `RegExp`. + +5. **Rule Order** - If none of the above criteria can be used to select one token over another, Tree-sitter will prefer the token that appears earlier in the grammar. + +If there is an external scanner it may have [an additional impact](#other-external-scanner-details) over regular tokens defined in the grammar. + +### Lexical Precedence vs. Parse Precedence + +One common mistake involves not distinguishing *lexical precedence* from *parse precedence*. Parse precedence determines which rule is chosen to interpret a given sequence of tokens. *Lexical precedence* determines which token is chosen to interpret at a given position of text and it is a lower-level operation that is done first. The above list fully captures Tree-sitter's lexical precedence rules, and you will probably refer back to this section of the documentation more often than any other. Most of the time when you really get stuck, you're dealing with a lexical precedence problem. Pay particular attention to the difference in meaning between using `prec` inside of the `token` function versus outside of it. The *lexical precedence* syntax is `token(prec(N, ...))`. + +### Keywords + +Many languages have a set of *keyword* tokens (e.g. `if`, `for`, `return`), as well as a more general token (e.g. `identifier`) that matches any word, including many of the keyword strings. For example, JavaScript has a keyword `instanceof`, which is used as a binary operator, like this: + +```js +if (a instanceof Something) b(); +``` + +The following, however, is not valid JavaScript: + +```js +if (a instanceofSomething) b(); +``` + +A keyword like `instanceof` cannot be followed immediately by another letter, because then it would be tokenized as an `identifier`, **even though an identifier is not valid at that position**. Because Tree-sitter uses context-aware lexing, as described [above](#conflicting-tokens), it would not normally impose this restriction. By default, Tree-sitter would recognize `instanceofSomething` as two separate tokens: the `instanceof` keyword followed by an `identifier`. + +### Keyword Extraction + +Fortunately, Tree-sitter has a feature that allows you to fix this, so that you can match the behavior of other standard parsers: the `word` token. If you specify a `word` token in your grammar, Tree-sitter will find the set of *keyword* tokens that match strings also matched by the `word` token. Then, during lexing, instead of matching each of these keywords individually, Tree-sitter will match the keywords via a two-step process where it *first* matches the `word` token. + +For example, suppose we added `identifier` as the `word` token in our JavaScript grammar: + +```js +grammar({ + name: 'javascript', + + word: $ => $.identifier, + + rules: { + _expression: $ => choice( + $.identifier, + $.unary_expression, + $.binary_expression + // ... + ), + + binary_expression: $ => choice( + prec.left(1, seq($._expression, 'instanceof', $._expression)) + // ... + ), + + unary_expression: $ => choice( + prec.left(2, seq('typeof', $._expression)) + // ... + ), + + identifier: $ => /[a-z_]+/ + } +}); +``` + +Tree-sitter would identify `typeof` and `instanceof` as keywords. Then, when parsing the invalid code above, rather than scanning for the `instanceof` token individually, it would scan for an `identifier` first, and find `instanceofSomething`. It would then correctly recognize the code as invalid. + +Aside from improving error detection, keyword extraction also has performance benefits. It allows Tree-sitter to generate a smaller, simpler lexing function, which means that **the parser will compile much more quickly**. + +### External Scanners + +Many languages have some tokens whose structure is impossible or inconvenient to describe with a regular expression. Some examples: + +* [Indent and dedent][indent-tokens] tokens in Python +* [Heredocs][heredoc] in Bash and Ruby +* [Percent strings][percent-string] in Ruby + +Tree-sitter allows you to handle these kinds of tokens using *external scanners*. An external scanner is a set of C functions that you, the grammar author, can write by hand in order to add custom logic for recognizing certain tokens. + +To use an external scanner, there are a few steps. First, add an `externals` section to your grammar. This section should list the names of all of your external tokens. These names can then be used elsewhere in your grammar. + +```js +grammar({ + name: 'my_language', + + externals: $ => [ + $.indent, + $.dedent, + $.newline + ], + + // ... +}); +``` + +Then, add another C source file to your project. Currently, its path must be `src/scanner.c` for the CLI to recognize it. Be sure to add this file to the `sources` section of your `binding.gyp` file so that it will be included when your project is compiled by Node.js and uncomment the appropriate block in your `bindings/rust/build.rs` file so that it will be included in your Rust crate. + +In this new source file, define an [`enum`][enum] type containing the names of all of your external tokens. The ordering of this enum must match the order in your grammar's `externals` array; the actual names do not matter. + +```c +#include "tree_sitter/parser.h" +#include "tree_sitter/alloc.h" +#include "tree_sitter/array.h" + +enum TokenType { + INDENT, + DEDENT, + NEWLINE +} +``` + +Finally, you must define five functions with specific names, based on your language's name and five actions: *create*, *destroy*, *serialize*, *deserialize*, and *scan*. + +#### Create + +```c +void *tree_sitter_my_language_external_scanner_create(void) { + // ... +} +``` + +This function should create your scanner object. It will only be called once anytime your language is set on a parser. Often, you will want to allocate memory on the heap and return a pointer to it. If your external scanner doesn't need to maintain any state, it's ok to return `NULL`. + +#### Destroy + +```c +void tree_sitter_my_language_external_scanner_destroy(void *payload) { + // ... +} +``` + +This function should free any memory used by your scanner. It is called once when a parser is deleted or assigned a different language. It receives as an argument the same pointer that was returned from the *create* function. If your *create* function didn't allocate any memory, this function can be a noop. + +#### Serialize + +```c +unsigned tree_sitter_my_language_external_scanner_serialize( + void *payload, + char *buffer +) { + // ... +} +``` + +This function should copy the complete state of your scanner into a given byte buffer, and return the number of bytes written. The function is called every time the external scanner successfully recognizes a token. It receives a pointer to your scanner and a pointer to a buffer. The maximum number of bytes that you can write is given by the `TREE_SITTER_SERIALIZATION_BUFFER_SIZE` constant, defined in the `tree_sitter/parser.h` header file. + +The data that this function writes will ultimately be stored in the syntax tree so that the scanner can be restored to the right state when handling edits or ambiguities. For your parser to work correctly, the `serialize` function must store its entire state, and `deserialize` must restore the entire state. For good performance, you should design your scanner so that its state can be serialized as quickly and compactly as possible. + +#### Deserialize + +```c +void tree_sitter_my_language_external_scanner_deserialize( + void *payload, + const char *buffer, + unsigned length +) { + // ... +} +``` + +This function should *restore* the state of your scanner based the bytes that were previously written by the `serialize` function. It is called with a pointer to your scanner, a pointer to the buffer of bytes, and the number of bytes that should be read. +It is good practice to explicitly erase your scanner state variables at the start of this function, before restoring their values from the byte buffer. + +#### Scan + +```c +bool tree_sitter_my_language_external_scanner_scan( + void *payload, + TSLexer *lexer, + const bool *valid_symbols +) { + // ... +} +``` + +This function is responsible for recognizing external tokens. It should return `true` if a token was recognized, and `false` otherwise. It is called with a "lexer" struct with the following fields: + +* **`int32_t lookahead`** - The current next character in the input stream, represented as a 32-bit unicode code point. +* **`TSSymbol result_symbol`** - The symbol that was recognized. Your scan function should *assign* to this field one of the values from the `TokenType` enum, described above. +* **`void (*advance)(TSLexer *, bool skip)`** - A function for advancing to the next character. If you pass `true` for the second argument, the current character will be treated as whitespace; whitespace won't be included in the text range associated with tokens emitted by the external scanner. +* **`void (*mark_end)(TSLexer *)`** - A function for marking the end of the recognized token. This allows matching tokens that require multiple characters of lookahead. By default (if you don't call `mark_end`), any character that you moved past using the `advance` function will be included in the size of the token. But once you call `mark_end`, then any later calls to `advance` will *not* increase the size of the returned token. You can call `mark_end` multiple times to increase the size of the token. +* **`uint32_t (*get_column)(TSLexer *)`** - A function for querying the current column position of the lexer. It returns the number of codepoints since the start of the current line. The codepoint position is recalculated on every call to this function by reading from the start of the line. +* **`bool (*is_at_included_range_start)(const TSLexer *)`** - A function for checking whether the parser has just skipped some characters in the document. When parsing an embedded document using the `ts_parser_set_included_ranges` function (described in the [multi-language document section][multi-language-section]), the scanner may want to apply some special behavior when moving to a disjoint part of the document. For example, in [EJS documents][ejs], the JavaScript parser uses this function to enable inserting automatic semicolon tokens in between the code directives, delimited by `<%` and `%>`. +* **`bool (*eof)(const TSLexer *)`** - A function for determining whether the lexer is at the end of the file. The value of `lookahead` will be `0` at the end of a file, but this function should be used instead of checking for that value because the `0` or "NUL" value is also a valid character that could be present in the file being parsed. +- **`void (*log)(const TSLexer *, const char * format, ...)`** - A `printf`-like function for logging. The log is viewable through e.g. `tree-sitter parse --debug` or the browser's console after checking the `log` option in the [Playground](./playground). + +The third argument to the `scan` function is an array of booleans that indicates which of external tokens are currently expected by the parser. You should only look for a given token if it is valid according to this array. At the same time, you cannot backtrack, so you may need to combine certain pieces of logic. + +```c +if (valid_symbols[INDENT] || valid_symbols[DEDENT]) { + + // ... logic that is common to both `INDENT` and `DEDENT` + + if (valid_symbols[INDENT]) { + + // ... logic that is specific to `INDENT` + + lexer->result_symbol = INDENT; + return true; + } +} +``` + +#### External Scanner Helpers + +##### Allocator + +Instead of using libc's `malloc`, `calloc`, `realloc`, and `free`, you should use the versions prefixed with `ts_` from `tree_sitter/alloc.h`. +These macros can allow a potential consumer to override the default allocator with their own implementation, but by default will use the libc functions. + +As a consumer of the tree-sitter core library as well as any parser libraries that might use allocations, you can enable overriding the default allocator and have it use the same one as the library allocator, of which you can set with `ts_set_allocator`. +To enable this overriding in scanners, you must compile them with the `TREE_SITTER_REUSE_ALLOCATOR` macro defined, and tree-sitter the library must be linked into your final app dynamically, since it needs to resolve the internal functions at runtime. If you are compiling +an executable binary that uses the core library, but want to load parsers dynamically at runtime, then you will have to use a special linker flag on Unix. For non-Darwin systems, that would be `--dynamic-list` and for Darwin systems, that would be `-exported_symbols_list`. +The CLI does exactly this, so you can use it as a reference (check out `cli/build.rs`). + +For example, assuming you wanted to allocate 100 bytes for your scanner, you'd do so like the following example: + +```c +#include "tree_sitter/parser.h" +#include "tree_sitter/alloc.h" + +// ... + +void *tree_sitter_my_language_external_scanner_create(void) { + return ts_calloc(100, 1); // or ts_malloc(100) +} + +// ... + +``` + +##### Arrays + +If you need to use array-like types in your scanner, such as tracking a stack of indentations or tags, you should use the array macros from `tree_sitter/array.h`. + +There are quite a few of them provided for you, but here's how you could get started tracking some . Check out the header itself for more detailed documentation. + +**NOTE**: Do not use any of the array functions or macros that are prefixed with an underscore and have comments saying that it is not what you are looking for. +These are internal functions used as helpers by other macros that are public. They are not meant to be used directly, nor are they what you want. + +```c +#include "tree_sitter/parser.h" +#include "tree_sitter/array.h" + +enum TokenType { + INDENT, + DEDENT, + NEWLINE, + STRING, +} + +// Create the array in your create function + +void *tree_sitter_my_language_external_scanner_create(void) { + return ts_calloc(1, sizeof(Array(int))); + + // or if you want to zero out the memory yourself + + Array(int) *stack = ts_malloc(sizeof(Array(int))); + array_init(&stack); + return stack; +} + +bool tree_sitter_my_language_external_scanner_scan( + void *payload, + TSLexer *lexer, + const bool *valid_symbols +) { + Array(int) *stack = payload; + if (valid_symbols[INDENT]) { + array_push(stack, lexer->get_column(lexer)); + lexer->result_symbol = INDENT; + return true; + } + if (valid_symbols[DEDENT]) { + array_pop(stack); // this returns the popped element by value, but we don't need it + lexer->result_symbol = DEDENT; + return true; + } + + // we can also use an array on the stack to keep track of a string + + Array(char) next_string = array_new(); + + if (valid_symbols[STRING] && lexer->lookahead == '"') { + lexer->advance(lexer, false); + while (lexer->lookahead != '"' && lexer->lookahead != '\n' && !lexer->eof(lexer)) { + array_push(&next_string, lexer->lookahead); + lexer->advance(lexer, false); + } + + // assume we have some arbitrary constraint of not having more than 100 characters in a string + if (lexer->lookahead == '"' && next_string.size <= 100) { + lexer->advance(lexer, false); + lexer->result_symbol = STRING; + return true; + } + } + + return false; +} + +``` + +#### Other External Scanner Details + +If a token in the `externals` array is valid at a given position in the parse, the external scanner will be called first before anything else is done. This means the external scanner functions as a powerful override of Tree-sitter's lexing behavior, and can be used to solve problems that can't be cracked with ordinary lexical, parse, or dynamic precedence. + +If a syntax error is encountered during regular parsing, Tree-sitter's first action during error recovery will be to call the external scanner's `scan` function with all tokens marked valid. The scanner should detect this case and handle it appropriately. One simple method of detection is to add an unused token to the end of the `externals` array, for example `externals: $ => [$.token1, $.token2, $.error_sentinel]`, then check whether that token is marked valid to determine whether Tree-sitter is in error correction mode. + +If you put terminal keywords in the `externals` array, for example `externals: $ => ['if', 'then', 'else']`, then any time those terminals are present in the grammar they will be tokenized by the external scanner. It is similar to writing `externals: [$.if_keyword, $.then_keyword, $.else_keyword]` then using `alias($.if_keyword, 'if')` in the grammar. + +If in the `externals` array use literal keywords then lexing works in two steps, the external scanner will be called first and if it sets a resulting token and returns `true` then the token considered as recognized and Tree-sitter moves to a next token. But the external scanner may return `false` and in this case Tree-sitter fallbacks to the internal lexing mechanism. + +In case of some keywords defined in the `externals` array in a rule referencing form like `$.if_keyword` and there is no additional definition of that rule in the grammar rules, e.g., `if_keyword: $ => 'if'` then fallback to the internal lexer isn't possible because Tree-sitter doesn't know the actual keyword and it's fully the external scanner resposibilty to recognize such tokens. + +External scanners are a common cause of infinite loops. +Be very careful when emitting zero-width tokens from your external scanner, and if you consume characters in a loop be sure use the `eof` function to check whether you are at the end of the file. + +[ambiguous-grammar]: https://en.wikipedia.org/wiki/Ambiguous_grammar +[antlr]: https://www.antlr.org +[bison-dprec]: https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html +[bison]: https://en.wikipedia.org/wiki/GNU_bison +[c-linkage]: https://en.cppreference.com/w/cpp/language/language_linkage +[cargo]: https://doc.rust-lang.org/cargo/getting-started/installation.html +[crate]: https://crates.io/crates/tree-sitter-cli +[cst]: https://en.wikipedia.org/wiki/Parse_tree +[dfa]: https://en.wikipedia.org/wiki/Deterministic_finite_automaton +[ebnf]: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form +[ecmascript-spec]: https://262.ecma-international.org/6.0/ +[ejs]: https://ejs.co +[enum]: https://en.wikipedia.org/wiki/Enumerated_type#C +[glr-parsing]: https://en.wikipedia.org/wiki/GLR_parser +[heredoc]: https://en.wikipedia.org/wiki/Here_document +[indent-tokens]: https://en.wikipedia.org/wiki/Off-side_rule +[language-spec]: https://en.wikipedia.org/wiki/Programming_language_specification +[lexing]: https://en.wikipedia.org/wiki/Lexical_analysis +[longest-match]: https://en.wikipedia.org/wiki/Maximal_munch +[lr-conflict]: https://en.wikipedia.org/wiki/LR_parser#Conflicts_in_the_constructed_tables +[lr-grammars]: https://en.wikipedia.org/wiki/LR_parser +[multi-language-section]: ./using-parsers#multi-language-documents +[named-vs-anonymous-nodes-section]: ./using-parsers#named-vs-anonymous-nodes +[field-names-section]: ./using-parsers#node-field-names +[nan]: https://github.com/nodejs/nan +[node-module]: https://www.npmjs.com/package/tree-sitter-cli +[node.js]: https://nodejs.org +[static-node-types]: ./using-parsers#static-node-types +[non-terminal]: https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols +[npm]: https://docs.npmjs.com +[path-env]: https://en.wikipedia.org/wiki/PATH_(variable) +[peg]: https://en.wikipedia.org/wiki/Parsing_expression_grammar +[percent-string]: https://docs.ruby-lang.org/en/2.5.0/doc/syntax/literals_rdoc.html#label-Percent+Strings +[releases]: https://github.com/tree-sitter/tree-sitter/releases/latest +[s-exp]: https://en.wikipedia.org/wiki/S-expression +[syntax-highlighting]: ./syntax-highlighting +[syntax-highlighting-tests]: ./syntax-highlighting#unit-testing +[tree-sitter-cli]: https://github.com/tree-sitter/tree-sitter/tree/master/cli +[tree-sitter-javascript]: https://github.com/tree-sitter/tree-sitter-javascript +[yacc-prec]: https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html +[yacc]: https://en.wikipedia.org/wiki/Yacc diff --git a/docs/section-4-syntax-highlighting.md b/docs/section-4-syntax-highlighting.md new file mode 100644 index 00000000..788f327b --- /dev/null +++ b/docs/section-4-syntax-highlighting.md @@ -0,0 +1,460 @@ +--- +title: Syntax Highlighting +permalink: syntax-highlighting +--- + +# Syntax Highlighting + +Syntax highlighting is a very common feature in applications that deal with code. Tree-sitter has built-in support for syntax highlighting, via the [`tree-sitter-highlight`](https://github.com/tree-sitter/tree-sitter/tree/master/highlight) library, which is currently used on GitHub.com for highlighting code written in several languages. You can also perform syntax highlighting at the command line using the `tree-sitter highlight` command. + +This document explains how the Tree-sitter syntax highlighting system works, using the command line interface. If you are using `tree-sitter-highlight` library (either from C or from Rust), all of these concepts are still applicable, but the configuration data is provided using in-memory objects, rather than files. + +## Overview + +All of the files needed to highlight a given language are normally included in the same git repository as the Tree-sitter grammar for that language (for example, [`tree-sitter-javascript`](https://github.com/tree-sitter/tree-sitter-javascript), [`tree-sitter-ruby`](https://github.com/tree-sitter/tree-sitter-ruby)). In order to run syntax highlighting from the command-line, three types of files are needed: + +1. Per-user configuration in `~/.config/tree-sitter/config.json` +2. Language configuration in grammar repositories' `package.json` files. +3. Tree queries in the grammars repositories' `queries` folders. + +For an example of the language-specific files, see the [`package.json` file](https://github.com/tree-sitter/tree-sitter-ruby/blob/master/package.json) and [`queries` directory](https://github.com/tree-sitter/tree-sitter-ruby/tree/master/queries) in the `tree-sitter-ruby` repository. The following sections describe the behavior of each file. + +## Per-user Configuration + +The Tree-sitter CLI automatically creates two directories in your home folder. One holds a JSON configuration file, that lets you customize the behavior of the CLI. The other holds any compiled language parsers that you use. + +These directories are created in the "normal" place for your platform: + +* On Linux, `~/.config/tree-sitter` and `~/.cache/tree-sitter` +* On Mac, `~/Library/Application Support/tree-sitter` and `~/Library/Caches/tree-sitter` +* On Windows, `C:\Users\[username]\AppData\Roaming\tree-sitter` and `C:\Users\[username]\AppData\Local\tree-sitter` + +The CLI will work if there's no config file present, falling back on default values for each configuration option. To create a config file that you can edit, run this command: + +```sh +tree-sitter init-config +``` + +(This will print out the location of the file that it creates so that you can easily find and modify it.) + +### Paths + +The `tree-sitter highlight` command takes one or more file paths, and tries to automatically determine which language should be used to highlight those files. In order to do this, it needs to know *where* to look for Tree-sitter grammars on your filesystem. You can control this using the `"parser-directories"` key in your configuration file: + +```json +{ + "parser-directories": [ + "/Users/my-name/code", + "/Users/my-name/other-code" + ] +} +``` + +Currently, any folder within one of these *parser directories* whose name begins with `tree-sitter-` will be treated as a Tree-sitter grammar repository. + +### Theme + +The Tree-sitter highlighting system works by annotating ranges of source code with logical "highlight names" like `function.method`, `type.builtin`, `keyword`, etc. In order to decide what *color* should be used for rendering each highlight, a *theme* is needed. + +In your config file, the `"theme"` value is an object whose keys are dot-separated highlight names like `function.builtin` or `keyword`, and whose values are JSON expressions that represent text styling parameters. + +#### Highlight Names + +A theme can contain multiple keys that share a common subsequence. Examples: + +* `variable` and `variable.parameter` +* `function`, `function.builtin`, and `function.method` + +For a given highlight produced, styling will be determined based on the **longest matching theme key**. For example, the highlight `function.builtin.static` would match the key `function.builtin` rather than `function`. + +#### Styling Values + +Styling values can be any of the following: + +* Integers from 0 to 255, representing ANSI terminal color ids. +* Strings like `"#e45649"` representing hexadecimal RGB colors. +* Strings naming basic ANSI colors like `"red"`, `"black"`, `"purple"`, or `"cyan"`. +* Objects with the following keys: + * `color` - An integer or string as described above. + * `underline` - A boolean indicating whether the text should be underlined. + * `italic` - A boolean indicating whether the text should be italicized. + * `bold` - A boolean indicating whether the text should be bold-face. + +## Language Configuration + +The `package.json` file is used by package managers like `npm`. Within this file, the Tree-sitter CLI looks for data nested under the top-level `"tree-sitter"` key. This key is expected to contain an array of objects with the following keys: + +### Basics + +These keys specify basic information about the parser: + +* `scope` (required) - A string like `"source.js"` that identifies the language. Currently, we strive to match the scope names used by popular [TextMate grammars](https://macromates.com/manual/en/language_grammars) and by the [Linguist](https://github.com/github/linguist) library. + +* `path` (optional) - A relative path from the directory containing `package.json` to another directory containing the `src/` folder, which contains the actual generated parser. The default value is `"."` (so that `src/` is in the same folder as `package.json`), and this very rarely needs to be overridden. + +* `external-files` (optional) - A list of relative paths from the root dir of a +parser to files that should be checked for modifications during recompilation. +This is useful during development to have changes to other files besides scanner.c +be picked up by the cli. + +### Language Detection + +These keys help to decide whether the language applies to a given file: + +* `file-types` - An array of filename suffix strings. The grammar will be used for files whose names end with one of these suffixes. Note that the suffix may match an *entire* filename. + +* `first-line-regex` - A regex pattern that will be tested against the first line of a file in order to determine whether this language applies to the file. If present, this regex will be used for any file whose language does not match any grammar's `file-types`. + +* `content-regex` - A regex pattern that will be tested against the contents of the file in order to break ties in cases where multiple grammars matched the file using the above two criteria. If the regex matches, this grammar will be preferred over another grammar with no `content-regex`. If the regex does not match, a grammar with no `content-regex` will be preferred over this one. + +* `injection-regex` - A regex pattern that will be tested against a *language name* in order to determine whether this language should be used for a potential *language injection* site. Language injection is described in more detail in [a later section](#language-injection). + +### Query Paths + +These keys specify relative paths from the directory containing `package.json` to the files that control syntax highlighting: + +* `highlights` - Path to a *highlight query*. Default: `queries/highlights.scm` +* `locals` - Path to a *local variable query*. Default: `queries/locals.scm`. +* `injections` - Path to an *injection query*. Default: `queries/injections.scm`. + +The behaviors of these three files are described in the next section. + +### Example + +Typically, the `"tree-sitter"` array only needs to contain one object, which only needs to specify a few keys: + +```json +{ + "tree-sitter": [ + { + "scope": "source.ruby", + "file-types": [ + "rb", + "gemspec", + "Gemfile", + "Rakefile" + ], + "first-line-regex": "#!.*\\bruby$" + } + ] +} +``` + +## Queries + +Tree-sitter's syntax highlighting system is based on *tree queries*, which are a general system for pattern-matching on Tree-sitter's syntax trees. See [this section](./using-parsers#pattern-matching-with-queries) of the documentation for more information about tree queries. + +Syntax highlighting is controlled by *three* different types of query files that are usually included in the `queries` folder. The default names for the query files use the `.scm` file. We chose this extension because it commonly used for files written in [Scheme](https://en.wikipedia.org/wiki/Scheme_%28programming_language%29), a popular dialect of Lisp, and these query files use a Lisp-like syntax. + +Alternatively, you can think of `.scm` as an acronym for "Source Code Matching". + +### Highlights + +The most important query is called the highlights query. The highlights query uses *captures* to assign arbitrary *highlight names* to different nodes in the tree. Each highlight name can then be mapped to a color (as described [above](#theme)). Commonly used highlight names include `keyword`, `function`, `type`, `property`, and `string`. Names can also be dot-separated like `function.builtin`. + +#### Example Input + +For example, consider the following Go code: + +```go +func increment(a int) int { + return a + 1 +} +``` + +With this syntax tree: + +```scheme +(source_file + (function_declaration + name: (identifier) + parameters: (parameter_list + (parameter_declaration + name: (identifier) + type: (type_identifier))) + result: (type_identifier) + body: (block + (return_statement + (expression_list + (binary_expression + left: (identifier) + right: (int_literal))))))) +``` + +#### Example Query + +Suppose we wanted to render this code with the following colors: + +* keywords `func` and `return` in purple +* function `increment` in blue +* type `int` in green +* number `5` brown + +We can assign each of these categories a *highlight name* using a query like this: + +```scheme +; highlights.scm + +"func" @keyword +"return" @keyword +(type_identifier) @type +(int_literal) @number +(function_declaration name: (identifier) @function) +``` + +Then, in our config file, we could map each of these highlight names to a color: + +```json +{ + "theme": { + "keyword": "purple", + "function": "blue", + "type": "green", + "number": "brown" + } +} +``` + +#### Result + +Running `tree-sitter highlight` on this Go file would produce output like this: + +
+func increment(a int) int {
+    return a + 1
+}
+
+ +### Local Variables + +Good syntax highlighting helps the reader to quickly distinguish between the different types of *entities* in their code. Ideally, if a given entity appears in *multiple* places, it should be colored the same in each place. The Tree-sitter syntax highlighting system can help you to achieve this by keeping track of local scopes and variables. + +The *local variables* query is different from the highlights query in that, while the highlights query uses *arbitrary* capture names which can then be mapped to colors, the locals variable query uses a fixed set of capture names, each of which has a special meaning. + +The capture names are as follows: + +* `@local.scope` - indicates that a syntax node introduces a new local scope. +* `@local.definition` - indicates that a syntax node contains the *name* of a definition within the current local scope. +* `@local.reference` - indicates that a syntax node contains the *name* which *may* refer to an earlier definition within some enclosing scope. + +When highlighting a file, Tree-sitter will keep track of the set of scopes that contains any given position, and the set of definitions within each scope. When processing a syntax node that is captured as a `local.reference`, Tree-sitter will try to find a definition for a name that matches the node's text. If it finds a match, Tree-sitter will ensure that the *reference* and the *definition* are colored the same. + +The information produced by this query can also be *used* by the highlights query. You can *disable* a pattern for nodes which have been identified as local variables by adding the predicate `(#is-not? local)` to the pattern. This is used in the example below: + +#### Example Input + +Consider this Ruby code: + +```ruby +def process_list(list) + context = current_context + list.map do |item| + process_item(item, context) + end +end + +item = 5 +list = [item] +``` + +With this syntax tree: + +```scheme +(program + (method + name: (identifier) + parameters: (method_parameters + (identifier)) + (assignment + left: (identifier) + right: (identifier)) + (method_call + method: (call + receiver: (identifier) + method: (identifier)) + block: (do_block + (block_parameters + (identifier)) + (method_call + method: (identifier) + arguments: (argument_list + (identifier) + (identifier)))))) + (assignment + left: (identifier) + right: (integer)) + (assignment + left: (identifier) + right: (array + (identifier)))) +``` + +There are several different types of names within this method: + +* `process_list` is a method. +* Within this method, `list` is a formal parameter +* `context` is a local variable. +* `current_context` is *not* a local variable, so it must be a method. +* Within the `do` block, `item` is a formal parameter +* Later on, `item` and `list` are both local variables (not formal parameters). + +#### Example Queries + +Let's write some queries that let us clearly distinguish between these types of names. First, set up the highlighting query, as described in the previous section. We'll assign distinct colors to method calls, method definitions, and formal parameters: + +```scheme +; highlights.scm + +(call method: (identifier) @function.method) +(method_call method: (identifier) @function.method) + +(method name: (identifier) @function.method) + +(method_parameters (identifier) @variable.parameter) +(block_parameters (identifier) @variable.parameter) + +((identifier) @function.method + (#is-not? local)) +``` + +Then, we'll set up a local variable query to keep track of the variables and scopes. Here, we're indicating that methods and blocks create local *scopes*, parameters and assignments create *definitions*, and other identifiers should be considered *references*: + +```scheme +; locals.scm + +(method) @local.scope +(do_block) @local.scope + +(method_parameters (identifier) @local.definition) +(block_parameters (identifier) @local.definition) + +(assignment left:(identifier) @local.definition) + +(identifier) @local.reference +``` + +#### Result + +Running `tree-sitter highlight` on this ruby file would produce output like this: + +
+def process_list(list)
+  context = current_context
+  list.map do |item|
+    process_item(item, context)
+  end
+end
+
+item = 5
+list = [item]
+
+ +### Language Injection + +Some source files contain code written in multiple different languages. Examples include: + +* HTML files, which can contain JavaScript inside of ` + +{% if jekyll.environment == "development" %} + + +{% else %} + + +{% endif %} + + + diff --git a/docs/section-8-code-navigation-systems.md b/docs/section-8-code-navigation-systems.md new file mode 100644 index 00000000..04346e46 --- /dev/null +++ b/docs/section-8-code-navigation-systems.md @@ -0,0 +1,120 @@ +--- +title: Code Navigation Systems +permalink: code-navigation-systems +--- + +# Code Navigation Systems + +Tree-sitter can be used in conjunction with its [tree query language](https://tree-sitter.github.io/tree-sitter/using-parsers#pattern-matching-with-queries) as a part of code navigation systems. An example of such a system can be seen in the `tree-sitter tags` command, which emits a textual dump of the interesting syntactic nodes in its file argument. A notable application of this is GitHub's support for [search-based code navigation](https://docs.github.com/en/repositories/working-with-files/using-files/navigating-code-on-github#precise-and-search-based-navigation). This document exists to describe how to integrate with such systems, and how to extend this functionality to any language with a Tree-sitter grammar. + +## Tagging and captures + +_Tagging_ is the act of identifying the entities that can be named in a program. We use Tree-sitter queries to find those entities. Having found them, you use a syntax capture to label the entity and its name. + +The essence of a given tag lies in two pieces of data: the _role_ of the entity that is matched (i.e. whether it is a definition or a reference) and the _kind_ of that entity, which describes how the entity is used (i.e. whether it's a class definition, function call, variable reference, and so on). Our convention is to use a syntax capture following the `@role.kind` capture name format, and another inner capture, always called `@name`, that pulls out the name of a given identifier. + +You may optionally include a capture named `@doc` to bind a docstring. For convenience purposes, the tagging system provides two built-in functions, `#select-adjacent!` and `#strip!` that are convenient for removing comment syntax from a docstring. `#strip!` takes a capture as its first argument and a regular expression as its second, expressed as a quoted string. Any text patterns matched by the regular expression will be removed from the text associated with the passed capture. `#select-adjacent!`, when passed two capture names, filters the text associated with the first capture so that only nodes adjacent to the second capture are preserved. This can be useful when writing queries that would otherwise include too much information in matched comments. + +## Examples + +This [query](https://github.com/tree-sitter/tree-sitter-python/blob/78c4e9b6b2f08e1be23b541ffced47b15e2972ad/queries/tags.scm#L4-L5) recognizes Python function definitions and captures their declared name. The `function_definition` syntax node is defined in the [Python Tree-sitter grammar](https://github.com/tree-sitter/tree-sitter-python/blob/78c4e9b6b2f08e1be23b541ffced47b15e2972ad/grammar.js#L354). + +```scheme +(function_definition + name: (identifier) @name) @definition.function +``` + +A more sophisticated query can be found in the [JavaScript Tree-sitter repository](https://github.com/tree-sitter/tree-sitter-javascript/blob/fdeb68ac8d2bd5a78b943528bb68ceda3aade2eb/queries/tags.scm#L63-L70): + +```scheme +(assignment_expression + left: [ + (identifier) @name + (member_expression + property: (property_identifier) @name) + ] + right: [(arrow_function) (function)] +) @definition.function +``` + +An even more sophisticated query is in the [Ruby Tree-sitter repository](https://github.com/tree-sitter/tree-sitter-ruby/blob/1ebfdb288842dae5a9233e2509a135949023dd82/queries/tags.scm#L24-L43), which uses built-in functions to strip the Ruby comment character (`#`) from the docstrings associated with a class or singleton-class declaration, then selects only the docstrings adjacent to the node matched as `@definition.class`. + +```scheme +( + (comment)* @doc + . + [ + (class + name: [ + (constant) @name + (scope_resolution + name: (_) @name) + ]) @definition.class + (singleton_class + value: [ + (constant) @name + (scope_resolution + name: (_) @name) + ]) @definition.class + ] + (#strip! @doc "^#\\s*") + (#select-adjacent! @doc @definition.class) +) +``` + +The below table describes a standard vocabulary for kinds and roles during the tagging process. New applications may extend (or only recognize a subset of) these capture names, but it is desirable to standardize on the names below. + +| Category | Tag | +|--------------------------|-----------------------------| +| Class definitions | `@definition.class` | +| Function definitions | `@definition.function` | +| Interface definitions | `@definition.interface` | +| Method definitions | `@definition.method` | +| Module definitions | `@definition.module` | +| Function/method calls | `@reference.call` | +| Class reference | `@reference.class` | +| Interface implementation | `@reference.implementation` | + +## Command-line invocation + +You can use the `tree-sitter tags` command to test out a tags query file, passing as arguments one or more files to tag. We can run this tool from within the Tree-sitter Ruby repository, over code in a file called `test.rb`: + +```ruby +module Foo + class Bar + # won't be included + + # is adjacent, will be + def baz + end + end +end +``` + +Invoking `tree-sitter tags test.rb` produces the following console output, representing matched entities' name, role, location, first line, and docstring: + +```text + test.rb + Foo | module def (0, 7) - (0, 10) `module Foo` + Bar | class def (1, 8) - (1, 11) `class Bar` + baz | method def (2, 8) - (2, 11) `def baz` "is adjacent, will be" +``` + +It is expected that tag queries for a given language are located at `queries/tags.scm` in that language's repository. + +## Unit Testing + +Tags queries may be tested with `tree-sitter test`. Files under `test/tags/` are checked using the same comment system as [highlights queries](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#unit-testing). For example, the above Ruby tags can be tested with these comments: + +```ruby +module Foo + # ^ definition.module + class Bar + # ^ definition.class + + def baz + # ^ definition.method + end + end +end +``` diff --git a/docs/src/3-syntax-highlighting.md b/docs/src/3-syntax-highlighting.md deleted file mode 100644 index c6356fbb..00000000 --- a/docs/src/3-syntax-highlighting.md +++ /dev/null @@ -1,447 +0,0 @@ -# Syntax Highlighting - -Syntax highlighting is a very common feature in applications that deal with code. Tree-sitter has built-in support for -syntax highlighting via the [`tree-sitter-highlight`][highlight crate] library, which is now used on GitHub.com for highlighting -code written in several languages. You can also perform syntax highlighting at the command line using the -`tree-sitter highlight` command. - -This document explains how the Tree-sitter syntax highlighting system works, using the command line interface. If you are -using `tree-sitter-highlight` library (either from C or from Rust), all of these concepts are still applicable, but the -configuration data is provided using in-memory objects, rather than files. - -## Overview - -All the files needed to highlight a given language are normally included in the same git repository as the Tree-sitter -grammar for that language (for example, [`tree-sitter-javascript`][js grammar], [`tree-sitter-ruby`][ruby grammar]). -To run syntax highlighting from the command-line, three types of files are needed: - -1. Per-user configuration in `~/.config/tree-sitter/config.json` (see the [init-config][init-config] page for more info). -2. Language configuration in grammar repositories' `tree-sitter.json` files (see the [init][init] page for more info). -3. Tree queries in the grammars repositories' `queries` folders. - -For an example of the language-specific files, see the [`tree-sitter.json` file][ts json] and [`queries` directory][queries] -in the `tree-sitter-ruby` repository. The following sections describe the behavior of each file. - -## Language Configuration - -The `tree-sitter.json` file is used by the Tree-sitter CLI. Within this file, the CLI looks for data nested under the -top-level `"grammars"` key. This key is expected to contain an array of objects with the following keys: - -### Basics - -These keys specify basic information about the parser: - -- `scope` (required) — A string like `"source.js"` that identifies the language. We strive to match the scope names used -by popular [TextMate grammars][textmate] and by the [Linguist][linguist] library. - -- `path` (optional) — A relative path from the directory containing `tree-sitter.json` to another directory containing -the `src/` folder, which contains the actual generated parser. The default value is `"."` (so that `src/` is in the same -folder as `tree-sitter.json`), and this very rarely needs to be overridden. - -- `external-files` (optional) — A list of relative paths from the root dir of a -parser to files that should be checked for modifications during recompilation. -This is useful during development to have changes to other files besides scanner.c -be picked up by the cli. - -### Language Detection - -These keys help to decide whether the language applies to a given file: - -- `file-types` — An array of filename suffix strings. The grammar will be used for files whose names end with one of these -suffixes. Note that the suffix may match an *entire* filename. - -- `first-line-regex` — A regex pattern that will be tested against the first line of a file to determine whether this language -applies to the file. If present, this regex will be used for any file whose language does not match any grammar's `file-types`. - -- `content-regex` — A regex pattern that will be tested against the contents of the file to break ties in cases where -multiple grammars matched the file using the above two criteria. If the regex matches, this grammar will be preferred over -another grammar with no `content-regex`. If the regex does not match, a grammar with no `content-regex` will be preferred -over this one. - -- `injection-regex` — A regex pattern that will be tested against a *language name* ito determine whether this language -should be used for a potential *language injection* site. Language injection is described in more detail in [a later section](#language-injection). - -### Query Paths - -These keys specify relative paths from the directory containing `tree-sitter.json` to the files that control syntax highlighting: - -- `highlights` — Path to a *highlight query*. Default: `queries/highlights.scm` -- `locals` — Path to a *local variable query*. Default: `queries/locals.scm`. -- `injections` — Path to an *injection query*. Default: `queries/injections.scm`. - -The behaviors of these three files are described in the next section. - -## Queries - -Tree-sitter's syntax highlighting system is based on *tree queries*, which are a general system for pattern-matching on -Tree-sitter's syntax trees. See [this section][pattern matching] of the documentation for more information about tree queries. - -Syntax highlighting is controlled by *three* different types of query files that are usually included in the `queries` folder. -The default names for the query files use the `.scm` file. We chose this extension because it commonly used for files written -in [Scheme][scheme], a popular dialect of Lisp, and these query files use a Lisp-like syntax. - -### Highlights - -The most important query is called the highlights query. The highlights query uses *captures* to assign arbitrary -*highlight names* to different nodes in the tree. Each highlight name can then be mapped to a color -(as described in the [init-config command][theme]). Commonly used highlight names include -`keyword`, `function`, `type`, `property`, and `string`. Names can also be dot-separated like `function.builtin`. - -#### Example Go Snippet - -For example, consider the following Go code: - -```go -func increment(a int) int { - return a + 1 -} -``` - -With this syntax tree: - -```scheme -(source_file - (function_declaration - name: (identifier) - parameters: (parameter_list - (parameter_declaration - name: (identifier) - type: (type_identifier))) - result: (type_identifier) - body: (block - (return_statement - (expression_list - (binary_expression - left: (identifier) - right: (int_literal))))))) -``` - -#### Example Query - -Suppose we wanted to render this code with the following colors: - -- keywords `func` and `return` in purple -- function `increment` in blue -- type `int` in green -- number `5` brown - -We can assign each of these categories a *highlight name* using a query like this: - -```scheme -; highlights.scm - -"func" @keyword -"return" @keyword -(type_identifier) @type -(int_literal) @number -(function_declaration name: (identifier) @function) -``` - -Then, in our config file, we could map each of these highlight names to a color: - -```json -{ - "theme": { - "keyword": "purple", - "function": "blue", - "type": "green", - "number": "brown" - } -} -``` - -#### Highlights Result - -Running `tree-sitter highlight` on this Go file would produce output like this: - -```admonish example collapsible=true, title='Output' -
-func increment(a int) int {
-    return a + 1
-}
-
-``` - -### Local Variables - -Good syntax highlighting helps the reader to quickly distinguish between the different types of *entities* in their code. -Ideally, if a given entity appears in *multiple* places, it should be colored the same in each place. The Tree-sitter syntax -highlighting system can help you to achieve this by keeping track of local scopes and variables. - -The *local variables* query is different from the highlights query in that, while the highlights query uses *arbitrary* -capture names, which can then be mapped to colors, the locals variable query uses a fixed set of capture names, each of -which has a special meaning. - -The capture names are as follows: - -- `@local.scope` — indicates that a syntax node introduces a new local scope. -- `@local.definition` — indicates that a syntax node contains the *name* of a definition within the current local scope. -- `@local.reference` — indicates that a syntax node contains the *name*, which *may* refer to an earlier definition within -some enclosing scope. - -Additionally, to ignore certain nodes from being tagged, you can use the `@ignore` capture. This is useful if you want to -exclude a subset of nodes from being tagged. When writing a query leveraging this, you should ensure this pattern comes -before any other patterns that would be used for tagging, for example: - -```scheme -(expression (identifier) @ignore) - -(identifier) @local.reference -``` - -When highlighting a file, Tree-sitter will keep track of the set of scopes that contains any given position, and the set -of definitions within each scope. When processing a syntax node that is captured as a `local.reference`, Tree-sitter will -try to find a definition for a name that matches the node's text. If it finds a match, Tree-sitter will ensure that the -*reference*, and the *definition* are colored the same. - -The information produced by this query can also be *used* by the highlights query. You can *disable* a pattern for nodes, -which have been identified as local variables by adding the predicate `(#is-not? local)` to the pattern. This is used in -the example below: - -#### Example Ruby Snippet - -Consider this Ruby code: - -```ruby -def process_list(list) - context = current_context - list.map do |item| - process_item(item, context) - end -end - -item = 5 -list = [item] -``` - -With this syntax tree: - -```scheme -(program - (method - name: (identifier) - parameters: (method_parameters - (identifier)) - (assignment - left: (identifier) - right: (identifier)) - (method_call - method: (call - receiver: (identifier) - method: (identifier)) - block: (do_block - (block_parameters - (identifier)) - (method_call - method: (identifier) - arguments: (argument_list - (identifier) - (identifier)))))) - (assignment - left: (identifier) - right: (integer)) - (assignment - left: (identifier) - right: (array - (identifier)))) -``` - -There are several types of names within this method: - -- `process_list` is a method. -- Within this method, `list` is a formal parameter -- `context` is a local variable. -- `current_context` is *not* a local variable, so it must be a method. -- Within the `do` block, `item` is a formal parameter -- Later on, `item` and `list` are both local variables (not formal parameters). - -#### Example Queries - -Let's write some queries that let us clearly distinguish between these types of names. First, set up the highlighting query, -as described in the previous section. We'll assign distinct colors to method calls, method definitions, and formal parameters: - -```scheme -; highlights.scm - -(call method: (identifier) @function.method) -(method_call method: (identifier) @function.method) - -(method name: (identifier) @function.method) - -(method_parameters (identifier) @variable.parameter) -(block_parameters (identifier) @variable.parameter) - -((identifier) @function.method - (#is-not? local)) -``` - -Then, we'll set up a local variable query to keep track of the variables and scopes. Here, we're indicating that methods -and blocks create local *scopes*, parameters and assignments create *definitions*, and other identifiers should be considered -*references*: - -```scheme -; locals.scm - -(method) @local.scope -(do_block) @local.scope - -(method_parameters (identifier) @local.definition) -(block_parameters (identifier) @local.definition) - -(assignment left:(identifier) @local.definition) - -(identifier) @local.reference -``` - -#### Locals Result - -Running `tree-sitter highlight` on this ruby file would produce output like this: - -```admonish example collapsible=true, title='Output' -
-def process_list(list)
-  context = current_context
-  list.map do |item|
-    process_item(item, context)
-  end
-end
-
-item = 5
-list = [item]
-
-``` - -### Language Injection - -Some source files contain code written in multiple different languages. Examples include: - -- HTML files, which can contain JavaScript inside ` - - - - - diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md deleted file mode 100644 index 231085ae..00000000 --- a/docs/src/SUMMARY.md +++ /dev/null @@ -1,48 +0,0 @@ -# Summary - -[Introduction](./index.md) - -# User Guide - -- [Using Parsers](./using-parsers/index.md) - - [Getting Started](./using-parsers/1-getting-started.md) - - [Basic Parsing](./using-parsers/2-basic-parsing.md) - - [Advanced Parsing](./using-parsers/3-advanced-parsing.md) - - [Walking Trees](./using-parsers/4-walking-trees.md) - - [Queries](./using-parsers/queries/index.md) - - [Basic Syntax](./using-parsers/queries/1-syntax.md) - - [Operators](./using-parsers/queries/2-operators.md) - - [Predicates and Directives](./using-parsers/queries/3-predicates-and-directives.md) - - [API](./using-parsers/queries/4-api.md) - - [Static Node Types](./using-parsers/6-static-node-types.md) - - [ABI versions](./using-parsers/7-abi-versions.md) -- [Creating Parsers](./creating-parsers/index.md) - - [Getting Started](./creating-parsers/1-getting-started.md) - - [The Grammar DSL](./creating-parsers/2-the-grammar-dsl.md) - - [Writing the Grammar](./creating-parsers/3-writing-the-grammar.md) - - [External Scanners](./creating-parsers/4-external-scanners.md) - - [Writing Tests](./creating-parsers/5-writing-tests.md) - - [Publishing Parsers](./creating-parsers/6-publishing.md) -- [Syntax Highlighting](./3-syntax-highlighting.md) -- [Code Navigation](./4-code-navigation.md) -- [Implementation](./5-implementation.md) -- [Contributing](./6-contributing.md) -- [Playground](./7-playground.md) - -# Reference Guide - -- [Command Line Interface](./cli/index.md) - - [Init Config](./cli/init-config.md) - - [Init](./cli/init.md) - - [Generate](./cli/generate.md) - - [Build](./cli/build.md) - - [Parse](./cli/parse.md) - - [Test](./cli/test.md) - - [Version](./cli/version.md) - - [Fuzz](./cli/fuzz.md) - - [Query](./cli/query.md) - - [Highlight](./cli/highlight.md) - - [Tags](./cli/tags.md) - - [Playground](./cli/playground.md) - - [Dump Languages](./cli/dump-languages.md) - - [Complete](./cli/complete.md) diff --git a/docs/src/assets/css/mdbook-admonish.css b/docs/src/assets/css/mdbook-admonish.css deleted file mode 100644 index 45aeff05..00000000 --- a/docs/src/assets/css/mdbook-admonish.css +++ /dev/null @@ -1,348 +0,0 @@ -@charset "UTF-8"; -:is(.admonition) { - display: flow-root; - margin: 1.5625em 0; - padding: 0 1.2rem; - color: var(--fg); - page-break-inside: avoid; - background-color: var(--bg); - border: 0 solid black; - border-inline-start-width: 0.4rem; - border-radius: 0.2rem; - box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.05), 0 0 0.1rem rgba(0, 0, 0, 0.1); -} -@media print { - :is(.admonition) { - box-shadow: none; - } -} -:is(.admonition) > * { - box-sizing: border-box; -} -:is(.admonition) :is(.admonition) { - margin-top: 1em; - margin-bottom: 1em; -} -:is(.admonition) > .tabbed-set:only-child { - margin-top: 0; -} -html :is(.admonition) > :last-child { - margin-bottom: 1.2rem; -} - -a.admonition-anchor-link { - display: none; - position: absolute; - left: -1.2rem; - padding-right: 1rem; -} -a.admonition-anchor-link:link, a.admonition-anchor-link:visited { - color: var(--fg); -} -a.admonition-anchor-link:link:hover, a.admonition-anchor-link:visited:hover { - text-decoration: none; -} -a.admonition-anchor-link::before { - content: "§"; -} - -:is(.admonition-title, summary.admonition-title) { - position: relative; - min-height: 4rem; - margin-block: 0; - margin-inline: -1.6rem -1.2rem; - padding-block: 0.8rem; - padding-inline: 4.4rem 1.2rem; - font-weight: 700; - background-color: rgba(68, 138, 255, 0.1); - print-color-adjust: exact; - -webkit-print-color-adjust: exact; - display: flex; -} -:is(.admonition-title, summary.admonition-title) p { - margin: 0; -} -html :is(.admonition-title, summary.admonition-title):last-child { - margin-bottom: 0; -} -:is(.admonition-title, summary.admonition-title)::before { - position: absolute; - top: 0.625em; - inset-inline-start: 1.6rem; - width: 2rem; - height: 2rem; - background-color: #448aff; - print-color-adjust: exact; - -webkit-print-color-adjust: exact; - mask-image: url('data:image/svg+xml;charset=utf-8,'); - -webkit-mask-image: url('data:image/svg+xml;charset=utf-8,'); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-size: contain; - content: ""; -} -:is(.admonition-title, summary.admonition-title):hover a.admonition-anchor-link { - display: initial; -} - -details.admonition > summary.admonition-title::after { - position: absolute; - top: 0.625em; - inset-inline-end: 1.6rem; - height: 2rem; - width: 2rem; - background-color: currentcolor; - mask-image: var(--md-details-icon); - -webkit-mask-image: var(--md-details-icon); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-size: contain; - content: ""; - transform: rotate(0deg); - transition: transform 0.25s; -} -details[open].admonition > summary.admonition-title::after { - transform: rotate(90deg); -} - -:root { - --md-details-icon: url("data:image/svg+xml;charset=utf-8,"); -} - -:root { - --md-admonition-icon--admonish-note: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-abstract: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-info: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-tip: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-success: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-question: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-warning: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-failure: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-danger: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-bug: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-example: url("data:image/svg+xml;charset=utf-8,"); - --md-admonition-icon--admonish-quote: url("data:image/svg+xml;charset=utf-8,"); -} - -:is(.admonition):is(.admonish-note) { - border-color: #448aff; -} - -:is(.admonish-note) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(68, 138, 255, 0.1); -} -:is(.admonish-note) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #448aff; - mask-image: var(--md-admonition-icon--admonish-note); - -webkit-mask-image: var(--md-admonition-icon--admonish-note); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-abstract, .admonish-summary, .admonish-tldr) { - border-color: #00b0ff; -} - -:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(0, 176, 255, 0.1); -} -:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #00b0ff; - mask-image: var(--md-admonition-icon--admonish-abstract); - -webkit-mask-image: var(--md-admonition-icon--admonish-abstract); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-info, .admonish-todo) { - border-color: #00b8d4; -} - -:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(0, 184, 212, 0.1); -} -:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #00b8d4; - mask-image: var(--md-admonition-icon--admonish-info); - -webkit-mask-image: var(--md-admonition-icon--admonish-info); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-tip, .admonish-hint, .admonish-important) { - border-color: #00bfa5; -} - -:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(0, 191, 165, 0.1); -} -:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #00bfa5; - mask-image: var(--md-admonition-icon--admonish-tip); - -webkit-mask-image: var(--md-admonition-icon--admonish-tip); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-success, .admonish-check, .admonish-done) { - border-color: #00c853; -} - -:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(0, 200, 83, 0.1); -} -:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #00c853; - mask-image: var(--md-admonition-icon--admonish-success); - -webkit-mask-image: var(--md-admonition-icon--admonish-success); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-question, .admonish-help, .admonish-faq) { - border-color: #64dd17; -} - -:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(100, 221, 23, 0.1); -} -:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #64dd17; - mask-image: var(--md-admonition-icon--admonish-question); - -webkit-mask-image: var(--md-admonition-icon--admonish-question); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-warning, .admonish-caution, .admonish-attention) { - border-color: #ff9100; -} - -:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(255, 145, 0, 0.1); -} -:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #ff9100; - mask-image: var(--md-admonition-icon--admonish-warning); - -webkit-mask-image: var(--md-admonition-icon--admonish-warning); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-failure, .admonish-fail, .admonish-missing) { - border-color: #ff5252; -} - -:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(255, 82, 82, 0.1); -} -:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #ff5252; - mask-image: var(--md-admonition-icon--admonish-failure); - -webkit-mask-image: var(--md-admonition-icon--admonish-failure); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-danger, .admonish-error) { - border-color: #ff1744; -} - -:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(255, 23, 68, 0.1); -} -:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #ff1744; - mask-image: var(--md-admonition-icon--admonish-danger); - -webkit-mask-image: var(--md-admonition-icon--admonish-danger); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-bug) { - border-color: #f50057; -} - -:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(245, 0, 87, 0.1); -} -:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #f50057; - mask-image: var(--md-admonition-icon--admonish-bug); - -webkit-mask-image: var(--md-admonition-icon--admonish-bug); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-example) { - border-color: #7c4dff; -} - -:is(.admonish-example) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(124, 77, 255, 0.1); -} -:is(.admonish-example) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #7c4dff; - mask-image: var(--md-admonition-icon--admonish-example); - -webkit-mask-image: var(--md-admonition-icon--admonish-example); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -:is(.admonition):is(.admonish-quote, .admonish-cite) { - border-color: #9e9e9e; -} - -:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title) { - background-color: rgba(158, 158, 158, 0.1); -} -:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title)::before { - background-color: #9e9e9e; - mask-image: var(--md-admonition-icon--admonish-quote); - -webkit-mask-image: var(--md-admonition-icon--admonish-quote); - mask-repeat: no-repeat; - -webkit-mask-repeat: no-repeat; - mask-size: contain; - -webkit-mask-repeat: no-repeat; -} - -.navy :is(.admonition) { - background-color: var(--sidebar-bg); -} - -.ayu :is(.admonition), -.coal :is(.admonition) { - background-color: var(--theme-hover); -} - -.rust :is(.admonition) { - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -.rust .admonition-anchor-link:link, .rust .admonition-anchor-link:visited { - color: var(--sidebar-fg); -} diff --git a/docs/src/assets/css/playground.css b/docs/src/assets/css/playground.css deleted file mode 100644 index ab59ebec..00000000 --- a/docs/src/assets/css/playground.css +++ /dev/null @@ -1,468 +0,0 @@ -/* Base Variables */ -:root { - --light-bg: #f9f9f9; - --light-border: #e0e0e0; - --light-text: #333; - --light-hover-border: #c1c1c1; - --light-scrollbar-track: #f1f1f1; - --light-scrollbar-thumb: #c1c1c1; - --light-scrollbar-thumb-hover: #a8a8a8; - - --dark-bg: #1d1f21; - --dark-border: #2d2d2d; - --dark-text: #c5c8c6; - --dark-scrollbar-track: #25282c; - --dark-scrollbar-thumb: #4a4d51; - --dark-scrollbar-thumb-hover: #5a5d61; - - --primary-color: #0550ae; - --primary-color-alpha: rgba(5, 80, 174, 0.1); - --primary-color-alpha-dark: rgba(121, 192, 255, 0.1); - --selection-color: rgba(39, 95, 255, 0.3); -} - -/* Common Scrollbar Styles */ -::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -::-webkit-scrollbar-track { - border-radius: 4px; -} - -::-webkit-scrollbar-thumb { - border-radius: 4px; -} - -/* Base Light Theme Scrollbars */ -::-webkit-scrollbar-track { - background: var(--light-scrollbar-track); -} - -::-webkit-scrollbar-thumb { - background: var(--light-scrollbar-thumb); -} - -::-webkit-scrollbar-thumb:hover { - background: var(--light-scrollbar-thumb-hover); -} - -/* Dropdown Styling */ -.custom-select { - position: relative; - display: inline-block; -} - -.language-container { - display: flex; - align-items: center; - gap: 16px; - margin-bottom: 16px; -} - -#language-version { - color: var(--light-text); - font-size: 14px; - font-weight: 500; - padding: 4px 8px; - background: var(--light-bg); - border-radius: 4px; - border: 1px solid var(--light-border); -} - -#language-select { - background-color: var(--light-bg); - border: 1px solid var(--light-border); - border-radius: 4px; - padding: 4px 24px 4px 8px; - font-size: 14px; - color: var(--light-text); - cursor: pointer; - min-width: 120px; - appearance: none; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right 8px center; -} - -#copy-button { - background: none; - border: 1px solid var(--light-border); - border-radius: 4px; - padding: 6px; - cursor: pointer; - color: var(--light-text); - display: inline-flex; - align-items: center; - justify-content: center; - margin-left: 8px; -} - -#copy-button:hover { - background-color: var(--primary-color-alpha); - border-color: var(--light-hover-border); -} - -#copy-button:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 0 2px var(--primary-color-alpha); -} - -.toast { - position: fixed; - bottom: 20px; - right: 20px; - background-color: var(--lighbt-bg); - color: var(--light-text); - padding: 12px 16px; - border-radius: 6px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); - font-size: 14px; - font-weight: 500; - opacity: 0; - transform: translateY(20px); - transition: all 0.3s ease; - z-index: 1000; - pointer-events: none; -} - -.toast.show { - opacity: 1; - transform: translateY(0); -} - -.select-button { - background-color: var(--light-bg); - border: 1px solid var(--light-border); - border-radius: 4px; - padding: 4px 8px; - font-size: 14px; - color: var(--light-text); - cursor: pointer; - min-width: 120px; - display: flex; - align-items: center; - justify-content: space-between; -} - -#language-select:hover, -.select-button:hover { - border-color: var(--light-hover-border); -} - -#language-select:focus, -.select-button:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 0 2px var(--primary-color-alpha); -} - -/* Custom Checkbox Styling */ -input[type="checkbox"] { - appearance: none; - width: 16px; - height: 16px; - border: 1px solid var(--light-border); - border-radius: 3px; - margin-right: 6px; - position: relative; - cursor: pointer; - vertical-align: middle; -} - -input[type="checkbox"]:checked { - background-color: var(--primary-color); - border-color: var(--primary-color); -} - -input[type="checkbox"]:checked::after { - content: ''; - position: absolute; - left: 5px; - top: 2px; - width: 4px; - height: 8px; - border: solid white; - border-width: 0 2px 2px 0; - transform: rotate(45deg); -} - -input[type="checkbox"]:hover { - border-color: var(--light-hover-border); -} - -input[type="checkbox"]:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 0 2px var(--primary-color-alpha); -} - -/* Select Dropdown */ -.select-dropdown { - position: absolute; - top: 100%; - left: 0; - right: 0; - background-color: var(--light-bg); - border: 1px solid var(--light-border); - border-radius: 4px; - margin-top: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - display: none; - z-index: 1000; - max-height: 300px; - overflow-y: auto; -} - -.select-dropdown.show { - display: block; -} - -.option { - padding: 8px 12px; - cursor: pointer; -} - -.option:hover { - background-color: var(--primary-color-alpha); -} - -.option.selected { - background-color: var(--primary-color-alpha); -} - -/* CodeMirror Base Styles */ -.ts-playground .CodeMirror { - border-radius: 6px; - background-color: var(--light-bg) !important; - color: #080808 !important; -} - -.ts-playground .CodeMirror-scroll { - padding: 8px; - border: 1px solid var(--light-border); - border-radius: 6px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.ayu .ts-playground .CodeMirror-scroll, -.coal .ts-playground .CodeMirror-scroll, -.navy .ts-playground .CodeMirror-scroll { - border-color: var(--dark-border); -} - -.ts-playground .CodeMirror-gutters { - background: #ebebeb !important; - border-right: 1px solid #e8e8e8 !important; -} - -.ts-playground .CodeMirror-cursor { - border-left: 2px solid #000 !important; -} - -.ts-playground .CodeMirror-selected { - background: var(--selection-color) !important; -} - -.ts-playground .CodeMirror-activeline-background { - background: rgba(36, 99, 180, 0.12) !important; -} - -.query-error { - text-decoration: underline red dashed; - -webkit-text-decoration: underline red dashed; -} - -/* Output Container Styles */ -#output-container { - color: #080808; - background-color: var(--light-bg); - margin: 0; - white-space: pre; - font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; -} - -#output-container-scroll { - max-height: 400px; - overflow: auto; - padding: 8px; - border: 1px solid var(--light-border); - border-radius: 6px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - background-color: var(--light-bg); -} - -#output-container a { - color: var(--primary-color); - text-decoration: none; -} - -#output-container a:hover { - text-decoration: underline; -} - -#output-container a.node-link.anonymous { - color: #116329; -} - -#output-container a.node-link.anonymous:before { - content: '"'; -} - -#output-container a.node-link.anonymous:after { - content: '"'; -} - -#output-container a.node-link.error { - color: #cf222e; -} - -#output-container a.highlighted { - background-color: var(--selection-color); -} - -/* Dark Theme Overrides */ -.ayu, -.coal, -.navy { - - & #language-version, - & #language-select, - & #copy-button, - & .select-button { - background-color: var(--dark-bg); - border-color: var(--dark-border); - color: var(--dark-text); - } - - & #copy-button:hover, - & #language-select:hover, - & .select-button:hover { - border-color: var(--dark-border); - background-color: var(--primary-color-alpha-dark); - } - - & .toast { - background-color: var(--dark-bg); - color: var(--dark-text); - } - - #language-select:focus, - & .select-button:focus { - border-color: #79c0ff; - box-shadow: 0 0 0 2px var(--primary-color-alpha-dark); - } - - & input[type="checkbox"] { - border-color: var(--dark-border); - background-color: var(--dark-bg); - } - - & input[type="checkbox"]:checked { - background-color: #79c0ff; - border-color: #79c0ff; - } - - & label { - color: var(--dark-text); - } - - & .select-dropdown { - background-color: var(--dark-bg); - border-color: var(--dark-border); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); - } - - & .option:hover { - background-color: var(--primary-color-alpha-dark); - } - - & .option.selected { - background-color: var(--primary-color-alpha-dark); - } - - & .ts-playground .CodeMirror { - background-color: var(--dark-bg) !important; - color: var(--dark-text) !important; - } - - & .ts-playground .CodeMirror-gutters { - background: var(--dark-scrollbar-track) !important; - border-right-color: var(--dark-border) !important; - } - - & .ts-playground .CodeMirror-cursor { - border-left-color: #aeafad !important; - } - - & .ts-playground .CodeMirror-selected { - background: #373b41 !important; - } - - & .ts-playground .CodeMirror-activeline-background { - background: #282a2e !important; - } - - & #output-container { - color: var(--dark-text); - background-color: var(--dark-bg); - } - - & #output-container-scroll { - background-color: var(--dark-bg); - border-color: var(--dark-border); - } - - & #output-container a { - color: #79c0ff; - } - - & #output-container a.node-link.anonymous { - color: #7ee787; - } - - & #output-container a.node-link.error { - color: #ff7b72; - } - - & #output-container a.highlighted { - background-color: #373b41; - } - - /* Dark Theme Scrollbars */ - & ::-webkit-scrollbar-track { - background: var(--dark-scrollbar-track) !important; - } - - & ::-webkit-scrollbar-thumb { - background: var(--dark-scrollbar-thumb) !important; - } - - & ::-webkit-scrollbar-thumb:hover { - background: var(--dark-scrollbar-thumb-hover) !important; - } - - & * { - scrollbar-width: thin !important; - scrollbar-color: var(--dark-scrollbar-thumb) var(--dark-scrollbar-track) !important; - } -} - -/* Spacing Utilities */ -#language-select, -input[type="checkbox"], -label { - margin: 0 4px; -} - -#language-select { - margin-right: 16px; -} - -label { - font-size: 14px; - margin-right: 16px; - cursor: pointer; -} diff --git a/docs/src/assets/js/playground.js b/docs/src/assets/js/playground.js deleted file mode 100644 index ef65c371..00000000 --- a/docs/src/assets/js/playground.js +++ /dev/null @@ -1,663 +0,0 @@ -function initializeLocalTheme() { - const themeToggle = document.getElementById('theme-toggle'); - if (!themeToggle) return; - - // Load saved theme or use system preference - const savedTheme = localStorage.getItem('theme'); - const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; - const initialTheme = savedTheme || (prefersDark ? 'dark' : 'light'); - - // Set initial theme - document.documentElement.setAttribute('data-theme', initialTheme); - - themeToggle.addEventListener('click', () => { - const currentTheme = document.documentElement.getAttribute('data-theme'); - const newTheme = currentTheme === 'light' ? 'dark' : 'light'; - document.documentElement.setAttribute('data-theme', newTheme); - localStorage.setItem('theme', newTheme); - }); -} - -function initializeCustomSelect({ initialValue = null, addListeners = false }) { - const button = document.getElementById('language-button'); - const select = document.getElementById('language-select'); - if (!button || !select) return; - - const dropdown = button.nextElementSibling; - const selectedValue = button.querySelector('.selected-value'); - - if (initialValue) { - select.value = initialValue; - } - if (select.selectedIndex >= 0 && select.options[select.selectedIndex]) { - selectedValue.textContent = select.options[select.selectedIndex].text; - } else { - selectedValue.textContent = 'JavaScript'; - } - - if (addListeners) { - button.addEventListener('click', (e) => { - e.preventDefault(); // Prevent form submission - dropdown.classList.toggle('show'); - }); - - document.addEventListener('click', (e) => { - if (!button.contains(e.target)) { - dropdown.classList.remove('show'); - } - }); - - dropdown.querySelectorAll('.option').forEach(option => { - option.addEventListener('click', () => { - selectedValue.textContent = option.textContent; - select.value = option.dataset.value; - dropdown.classList.remove('show'); - - const event = new Event('change'); - select.dispatchEvent(event); - }); - }); - } -} - -window.initializePlayground = async (opts) => { - const { Parser, Language, Query } = window.TreeSitter; - - const { local } = opts; - if (local) { - initializeLocalTheme(); - } - initializeCustomSelect({ addListeners: true }); - - let tree; - - const CAPTURE_REGEX = /@\s*([\w\._-]+)/g; - const LIGHT_COLORS = [ - "#0550ae", // blue - "#ab5000", // rust brown - "#116329", // forest green - "#844708", // warm brown - "#6639ba", // purple - "#7d4e00", // orange brown - "#0969da", // bright blue - "#1a7f37", // green - "#cf222e", // red - "#8250df", // violet - "#6e7781", // gray - "#953800", // dark orange - "#1b7c83" // teal - ]; - - const DARK_COLORS = [ - "#79c0ff", // light blue - "#ffa657", // orange - "#7ee787", // light green - "#ff7b72", // salmon - "#d2a8ff", // light purple - "#ffa198", // pink - "#a5d6ff", // pale blue - "#56d364", // bright green - "#ff9492", // light red - "#e0b8ff", // pale purple - "#9ca3af", // gray - "#ffb757", // yellow orange - "#80cbc4" // light teal - ]; - - const codeInput = document.getElementById("code-input"); - const languageSelect = document.getElementById("language-select"); - const languageVersion = document.getElementById('language-version'); - const loggingCheckbox = document.getElementById("logging-checkbox"); - const anonymousNodes = document.getElementById('anonymous-nodes-checkbox'); - const outputContainer = document.getElementById("output-container"); - const outputContainerScroll = document.getElementById( - "output-container-scroll", - ); - const playgroundContainer = document.getElementById("playground-container"); - const queryCheckbox = document.getElementById("query-checkbox"); - const queryContainer = document.getElementById("query-container"); - const queryInput = document.getElementById("query-input"); - const accessibilityCheckbox = document.getElementById("accessibility-checkbox"); - const copyButton = document.getElementById("copy-button"); - const updateTimeSpan = document.getElementById("update-time"); - const languagesByName = {}; - - loadState(); - - await Parser.init(); - - const parser = new Parser(); - - const codeEditor = CodeMirror.fromTextArea(codeInput, { - lineNumbers: true, - showCursorWhenSelecting: true - }); - - codeEditor.on('keydown', (_, event) => { - const key = event.key; - if (key === 'ArrowLeft' || key === 'ArrowRight' || key === '?') { - event.stopPropagation(); // Prevent mdBook from going back/forward, or showing help - } - }); - - const queryEditor = CodeMirror.fromTextArea(queryInput, { - lineNumbers: true, - showCursorWhenSelecting: true, - }); - - queryEditor.on('keydown', (_, event) => { - const key = event.key; - if (key === 'ArrowLeft' || key === 'ArrowRight' || key === '?') { - event.stopPropagation(); // Prevent mdBook from going back/forward, or showing help - } - }); - - const cluster = new Clusterize({ - rows: [], - noDataText: null, - contentElem: outputContainer, - scrollElem: outputContainerScroll, - }); - const renderTreeOnCodeChange = debounce(renderTree, 50); - const saveStateOnChange = debounce(saveState, 2000); - const runTreeQueryOnChange = debounce(runTreeQuery, 50); - - let languageName = languageSelect.value; - let treeRows = null; - let treeRowHighlightedIndex = -1; - let parseCount = 0; - let isRendering = 0; - let query; - - codeEditor.on("changes", handleCodeChange); - codeEditor.on("viewportChange", runTreeQueryOnChange); - codeEditor.on("cursorActivity", debounce(handleCursorMovement, 150)); - queryEditor.on("changes", debounce(handleQueryChange, 150)); - - loggingCheckbox.addEventListener("change", handleLoggingChange); - anonymousNodes.addEventListener("change", renderTree); - queryCheckbox.addEventListener("change", handleQueryEnableChange); - accessibilityCheckbox.addEventListener("change", handleQueryChange); - languageSelect.addEventListener("change", handleLanguageChange); - outputContainer.addEventListener("click", handleTreeClick); - copyButton?.addEventListener("click", handleCopy); - - handleQueryEnableChange(); - await handleLanguageChange(); - - playgroundContainer.style.visibility = "visible"; - - async function handleLanguageChange() { - const newLanguageName = languageSelect.value; - if (!languagesByName[newLanguageName]) { - const url = `${LANGUAGE_BASE_URL}/tree-sitter-${newLanguageName}.wasm`; - languageSelect.disabled = true; - try { - languagesByName[newLanguageName] = await Language.load(url); - } catch (e) { - console.error(e); - languageSelect.value = languageName; - return; - } finally { - languageSelect.disabled = false; - } - } - - tree = null; - languageName = newLanguageName; - - const metadata = languagesByName[languageName].metadata; - if (languageVersion && metadata) { - languageVersion.textContent = `v${metadata.major_version}.${metadata.minor_version}.${metadata.patch_version}`; - languageVersion.style.visibility = 'visible'; - } else if (languageVersion) { - languageVersion.style.visibility = 'hidden'; - } - - parser.setLanguage(languagesByName[newLanguageName]); - handleCodeChange(); - handleQueryChange(); - } - - async function handleCodeChange(editor, changes) { - const newText = codeEditor.getValue() + "\n"; - const edits = tree && changes && changes.map(treeEditForEditorChange); - - const start = performance.now(); - if (edits) { - for (const edit of edits) { - tree.edit(edit); - } - } - const newTree = parser.parse(newText, tree); - const duration = (performance.now() - start).toFixed(1); - - updateTimeSpan.innerText = `${duration} ms`; - if (tree) tree.delete(); - tree = newTree; - parseCount++; - renderTreeOnCodeChange(); - runTreeQueryOnChange(); - saveStateOnChange(); - } - - async function renderTree() { - isRendering++; - const cursor = tree.walk(); - - let currentRenderCount = parseCount; - let row = ""; - let rows = []; - let finishedRow = false; - let visitedChildren = false; - let indentLevel = 0; - - for (let i = 0; ; i++) { - if (i > 0 && i % 10000 === 0) { - await new Promise((r) => setTimeout(r, 0)); - if (parseCount !== currentRenderCount) { - cursor.delete(); - isRendering--; - return; - } - } - - let displayName; - if (cursor.nodeIsMissing) { - const nodeTypeText = cursor.nodeIsNamed ? cursor.nodeType : `"${cursor.nodeType}"`; - displayName = `MISSING ${nodeTypeText}`; - } else if (cursor.nodeIsNamed) { - displayName = cursor.nodeType; - } else if (anonymousNodes.checked) { - displayName = cursor.nodeType - } - - if (visitedChildren) { - if (displayName) { - finishedRow = true; - } - - if (cursor.gotoNextSibling()) { - visitedChildren = false; - } else if (cursor.gotoParent()) { - visitedChildren = true; - indentLevel--; - } else { - break; - } - } else { - if (displayName) { - if (finishedRow) { - row += ""; - rows.push(row); - finishedRow = false; - } - const start = cursor.startPosition; - const end = cursor.endPosition; - const id = cursor.nodeId; - let fieldName = cursor.currentFieldName; - if (fieldName) { - fieldName += ": "; - } else { - fieldName = ""; - } - - const nodeClass = - displayName === 'ERROR' || displayName.startsWith('MISSING') - ? 'node-link error plain' - : cursor.nodeIsNamed - ? 'node-link named plain' - : 'node-link anonymous plain'; - - row = `
${" ".repeat(indentLevel)}${fieldName}` + - `` + - `${displayName} ` + - `[${start.row}, ${start.column}] - [${end.row}, ${end.column}]`; - finishedRow = true; - } - - if (cursor.gotoFirstChild()) { - visitedChildren = false; - indentLevel++; - } else { - visitedChildren = true; - } - } - } - if (finishedRow) { - row += "
"; - rows.push(row); - } - - cursor.delete(); - cluster.update(rows); - treeRows = rows; - isRendering--; - handleCursorMovement(); - } - - function getCaptureCSS(name) { - if (accessibilityCheckbox.checked) { - return `color: white; background-color: ${colorForCaptureName(name)}`; - } else { - return `color: ${colorForCaptureName(name)}`; - } - } - - function runTreeQuery(_, startRow, endRow) { - if (endRow == null) { - const viewport = codeEditor.getViewport(); - startRow = viewport.from; - endRow = viewport.to; - } - - codeEditor.operation(() => { - const marks = codeEditor.getAllMarks(); - marks.forEach((m) => m.clear()); - - if (tree && query) { - const captures = query.captures(tree.rootNode, { - startPosition: { row: startRow, column: 0 }, - endPosition: { row: endRow, column: 0 }, - }); - let lastNodeId; - for (const { name, node } of captures) { - if (node.id === lastNodeId) continue; - lastNodeId = node.id; - const { startPosition, endPosition } = node; - codeEditor.markText( - { line: startPosition.row, ch: startPosition.column }, - { line: endPosition.row, ch: endPosition.column }, - { - inclusiveLeft: true, - inclusiveRight: true, - css: getCaptureCSS(name), - }, - ); - } - } - }); - } - - // When we change from a dark theme to a light theme (and vice versa), the colors of the - // captures need to be updated. - const observer = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - if (mutation.attributeName === 'class') { - handleQueryChange(); - } - }); - }); - - observer.observe(document.documentElement, { - attributes: true, - attributeFilter: ['class'] - }); - - function handleQueryChange() { - if (query) { - query.delete(); - query.deleted = true; - query = null; - } - - queryEditor.operation(() => { - queryEditor.getAllMarks().forEach((m) => m.clear()); - if (!queryCheckbox.checked) return; - - const queryText = queryEditor.getValue(); - - try { - query = new Query(parser.language, queryText); - let match; - - let row = 0; - queryEditor.eachLine((line) => { - while ((match = CAPTURE_REGEX.exec(line.text))) { - queryEditor.markText( - { line: row, ch: match.index }, - { line: row, ch: match.index + match[0].length }, - { - inclusiveLeft: true, - inclusiveRight: true, - css: `color: ${colorForCaptureName(match[1])}`, - }, - ); - } - row++; - }); - } catch (error) { - const startPosition = queryEditor.posFromIndex(error.index); - const endPosition = { - line: startPosition.line, - ch: startPosition.ch + (error.length || Infinity), - }; - - if (error.index === queryText.length) { - if (startPosition.ch > 0) { - startPosition.ch--; - } else if (startPosition.row > 0) { - startPosition.row--; - startPosition.column = Infinity; - } - } - - queryEditor.markText(startPosition, endPosition, { - className: "query-error", - inclusiveLeft: true, - inclusiveRight: true, - attributes: { title: error.message }, - }); - } - }); - - runTreeQuery(); - saveQueryState(); - } - - function handleCursorMovement() { - if (isRendering) return; - - const selection = codeEditor.getDoc().listSelections()[0]; - let start = { row: selection.anchor.line, column: selection.anchor.ch }; - let end = { row: selection.head.line, column: selection.head.ch }; - if ( - start.row > end.row || - (start.row === end.row && start.column > end.column) - ) { - let swap = end; - end = start; - start = swap; - } - const node = tree.rootNode.namedDescendantForPosition(start, end); - if (treeRows) { - if (treeRowHighlightedIndex !== -1) { - const row = treeRows[treeRowHighlightedIndex]; - if (row) - treeRows[treeRowHighlightedIndex] = row.replace( - "highlighted", - "plain", - ); - } - treeRowHighlightedIndex = treeRows.findIndex((row) => - row.includes(`data-id=${node.id}`), - ); - if (treeRowHighlightedIndex !== -1) { - const row = treeRows[treeRowHighlightedIndex]; - if (row) - treeRows[treeRowHighlightedIndex] = row.replace( - "plain", - "highlighted", - ); - } - cluster.update(treeRows); - const lineHeight = cluster.options.item_height; - const scrollTop = outputContainerScroll.scrollTop; - const containerHeight = outputContainerScroll.clientHeight; - const offset = treeRowHighlightedIndex * lineHeight; - if (scrollTop > offset - 20) { - outputContainerScroll.scrollTo({ top: offset - 20, behavior: 'smooth' }); - } else if (scrollTop < offset + lineHeight + 40 - containerHeight) { - outputContainerScroll.scrollTo({ - top: offset - containerHeight + 40, - behavior: 'smooth' - }); - } - } - } - - function handleCopy() { - const selection = window.getSelection(); - selection.removeAllRanges(); - const range = document.createRange(); - range.selectNodeContents(outputContainer); - selection.addRange(range); - navigator.clipboard.writeText(selection.toString()); - selection.removeRange(range); - showToast('Tree copied to clipboard!'); - } - - function handleTreeClick(event) { - if (event.target.tagName === "A") { - event.preventDefault(); - const [startRow, startColumn, endRow, endColumn] = - event.target.dataset.range.split(",").map((n) => parseInt(n)); - codeEditor.focus(); - codeEditor.setSelection( - { line: startRow, ch: startColumn }, - { line: endRow, ch: endColumn }, - ); - } - } - - function handleLoggingChange() { - if (loggingCheckbox.checked) { - parser.setLogger((message, lexing) => { - if (lexing) { - console.log(" ", message); - } else { - console.log(message); - } - }); - } else { - parser.setLogger(null); - } - } - - function handleQueryEnableChange() { - if (queryCheckbox.checked) { - queryContainer.style.visibility = ""; - queryContainer.style.position = ""; - } else { - queryContainer.style.visibility = "hidden"; - queryContainer.style.position = "absolute"; - } - handleQueryChange(); - } - - function treeEditForEditorChange(change) { - const oldLineCount = change.removed.length; - const newLineCount = change.text.length; - const lastLineLength = change.text[newLineCount - 1].length; - - const startPosition = { row: change.from.line, column: change.from.ch }; - const oldEndPosition = { row: change.to.line, column: change.to.ch }; - const newEndPosition = { - row: startPosition.row + newLineCount - 1, - column: - newLineCount === 1 - ? startPosition.column + lastLineLength - : lastLineLength, - }; - - const startIndex = codeEditor.indexFromPos(change.from); - let newEndIndex = startIndex + newLineCount - 1; - let oldEndIndex = startIndex + oldLineCount - 1; - for (let i = 0; i < newLineCount; i++) newEndIndex += change.text[i].length; - for (let i = 0; i < oldLineCount; i++) - oldEndIndex += change.removed[i].length; - - return { - startIndex, - oldEndIndex, - newEndIndex, - startPosition, - oldEndPosition, - newEndPosition, - }; - } - - function colorForCaptureName(capture) { - const id = query.captureNames.indexOf(capture); - const isDark = document.querySelector('html').classList.contains('ayu') || - document.querySelector('html').classList.contains('coal') || - document.querySelector('html').classList.contains('navy'); - - const colors = isDark ? DARK_COLORS : LIGHT_COLORS; - return colors[id % colors.length]; - } - - function loadState() { - const language = localStorage.getItem("language"); - const sourceCode = localStorage.getItem("sourceCode"); - const anonNodes = localStorage.getItem("anonymousNodes"); - const query = localStorage.getItem("query"); - const queryEnabled = localStorage.getItem("queryEnabled"); - if (language != null && sourceCode != null && query != null) { - queryInput.value = query; - codeInput.value = sourceCode; - languageSelect.value = language; - initializeCustomSelect({ initialValue: language }); - anonymousNodes.checked = anonNodes === "true"; - queryCheckbox.checked = queryEnabled === "true"; - } - } - - function saveState() { - localStorage.setItem("language", languageSelect.value); - localStorage.setItem("sourceCode", codeEditor.getValue()); - localStorage.setItem("anonymousNodes", anonymousNodes.checked); - saveQueryState(); - } - - function saveQueryState() { - localStorage.setItem("queryEnabled", queryCheckbox.checked); - localStorage.setItem("query", queryEditor.getValue()); - } - - function debounce(func, wait, immediate) { - var timeout; - return function () { - var context = this, - args = arguments; - var later = function () { - timeout = null; - if (!immediate) func.apply(context, args); - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); - }; - } - - function showToast(message) { - const existingToast = document.querySelector('.toast'); - if (existingToast) { - existingToast.remove(); - } - - const toast = document.createElement('div'); - toast.className = 'toast'; - toast.textContent = message; - document.body.appendChild(toast); - - setTimeout(() => toast.classList.add('show'), 50); - - setTimeout(() => { - toast.classList.remove('show'); - setTimeout(() => toast.remove(), 200); - }, 1000); - } -}; diff --git a/docs/src/assets/schemas/config.schema.json b/docs/src/assets/schemas/config.schema.json deleted file mode 100644 index 92453f37..00000000 --- a/docs/src/assets/schemas/config.schema.json +++ /dev/null @@ -1,285 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "$schema": { - "type": "string" - }, - "grammars": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the grammar.", - "pattern": "^[a-z0-9_]+$" - }, - "camelcase": { - "type": "string", - "description": "The name converted to CamelCase.", - "pattern": "^\\w+$", - "examples": [ - "Rust", - "HTML" - ] - }, - "title": { - "type": "string", - "description": "The title of the language.", - "examples": [ - "Rust", - "HTML" - ] - }, - "scope": { - "type": "string", - "description": "The TextMate scope that represents this language.", - "pattern": "^(source|text)(\\.[\\w\\-]+)+$", - "examples": [ - "source.rust", - "text.html" - ] - }, - "path": { - "type": "string", - "default": ".", - "description": "The relative path to the directory containing the grammar." - }, - "external-files": { - "type": "array", - "description": "The relative paths to files that should be checked for modifications during recompilation.", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "file-types": { - "type": "array", - "description": "An array of filename suffix strings.", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "highlights": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - } - ], - "default": "queries/highlights.scm", - "description": "The path(s) to the grammar's highlight queries." - }, - "injections": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - } - ], - "default": "queries/injections.scm", - "description": "The path(s) to the grammar's injection queries." - }, - "locals": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - } - ], - "default": "queries/locals.scm", - "description": "The path(s) to the grammar's local variable queries." - }, - "tags": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - } - ], - "default": "queries/tags.scm", - "description": "The path(s) to the grammar's code navigation queries." - }, - "injection-regex": { - "type": "string", - "format": "regex", - "description": "A regex pattern that will be tested against a language name in order to determine whether this language should be used for a potential language injection site." - }, - "first-line-regex": { - "type": "string", - "format": "regex", - "description": "A regex pattern that will be tested against the first line of a file in order to determine whether this language applies to the file." - }, - "content-regex": { - "type": "string", - "format": "regex", - "description": "A regex pattern that will be tested against the contents of the file in order to break ties in cases where multiple grammars matched the file." - }, - "class-name": { - "type": "string", - "pattern": "^TreeSitter\\w+$", - "description": "The class name for the Swift, Java & Kotlin bindings" - } - }, - "additionalProperties": false, - "required": [ - "name", - "scope" - ] - }, - "minItems": 1 - }, - "metadata": { - "type": "object", - "properties": { - "version": { - "type": "string", - "description": "The current version of the project.", - "pattern": "^(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-]+)*))?$", - "$comment": "The CLI will use this version to update package.json, Cargo.toml, pyproject.toml, Makefile." - }, - "license": { - "type": "string", - "default": "MIT", - "description": "The project's license." - }, - "description": { - "type": "string", - "description": "The project's description.", - "examples": [ - "Rust grammar for tree-sitter" - ] - }, - "links": { - "type": "object", - "properties": { - "repository": { - "type": "string", - "format": "uri", - "description": "The project's repository." - }, - "funding": { - "type": "string", - "format": "uri", - "description": "The project's funding link." - } - }, - "additionalProperties": false, - "required": [ - "repository" - ] - }, - "authors": { - "type": "array", - "items": { - "type": "object", - "description": "The project's author(s).", - "properties": { - "name": { - "type": "string" - }, - "email": { - "type": "string", - "format": "email" - }, - "url": { - "type": "string", - "format": "uri" - } - }, - "additionalProperties": false, - "required": [ - "name" - ] - }, - "minItems": 1 - }, - "namespace": { - "type": "string", - "description": "The namespace for the Java & Kotlin packages.", - "default": "io.github.tree-sitter", - "$comment": "Used as is in the Maven/Gradle group name and transformed accordingly for the package names and directories (e.g. io.github.treesitter.jtreesitter.html - src/main/java/io/github/treesitter/jtreesitter/html)." - } - }, - "additionalProperties": false, - "required": [ - "version", - "links" - ] - }, - "bindings": { - "type": "object", - "description": "The language bindings that will be generated.", - "properties": { - "c": { - "type": "boolean", - "default": true - }, - "go": { - "type": "boolean", - "default": true - }, - "java": { - "type": "boolean", - "default": false - }, - "kotlin": { - "type": "boolean", - "default": false - }, - "node": { - "type": "boolean", - "default": true - }, - "python": { - "type": "boolean", - "default": true - }, - "rust": { - "type": "boolean", - "default": true - }, - "swift": { - "type": "boolean", - "default": true - }, - "zig": { - "type": "boolean", - "default": false - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false, - "required": [ - "grammars", - "metadata" - ] -} diff --git a/docs/src/assets/schemas/node-types.schema.json b/docs/src/assets/schemas/node-types.schema.json deleted file mode 100644 index 7ea8a5af..00000000 --- a/docs/src/assets/schemas/node-types.schema.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Tree-sitter node types specification", - "type": "array", - "items": { - "$ref": "#/definitions/NodeInfo" - }, - "definitions": { - "NodeInfo": { - "type": "object", - "required": [ - "type", - "named" - ], - "properties": { - "type": { - "type": "string" - }, - "named": { - "type": "boolean" - }, - "root": { - "type": "boolean", - "default": false - }, - "extra": { - "type": "boolean", - "default": false - }, - "fields": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/FieldInfo" - } - }, - "children": { - "$ref": "#/definitions/FieldInfo" - }, - "subtypes": { - "type": "array", - "items": { - "$ref": "#/definitions/NodeType" - } - } - }, - "oneOf": [ - { - "description": "Regular node", - "properties": { - "subtypes": false - } - }, - { - "description": "Supertype node", - "required": [ - "subtypes" - ], - "properties": { - "children": false, - "fields": false - } - } - ] - }, - "NodeType": { - "type": "object", - "required": [ - "type", - "named" - ], - "properties": { - "type": { - "type": "string", - "description": "The kind of node type" - }, - "named": { - "type": "boolean", - "description": "Whether the node type is named" - } - } - }, - "FieldInfo": { - "type": "object", - "required": [ - "multiple", - "required", - "types" - ], - "properties": { - "multiple": { - "type": "boolean", - "default": false - }, - "required": { - "type": "boolean", - "default": true - }, - "types": { - "type": "array", - "default": [], - "items": { - "$ref": "#/definitions/NodeType" - } - } - } - } - } -} diff --git a/docs/src/assets/schemas/test-summary.schema.json b/docs/src/assets/schemas/test-summary.schema.json deleted file mode 100644 index 6211d60c..00000000 --- a/docs/src/assets/schemas/test-summary.schema.json +++ /dev/null @@ -1,247 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "title": "TestSummary", - "description": "A stateful object used to collect results from running a grammar's test suite", - "type": "object", - "properties": { - "parse_results": { - "type": "array", - "items": { - "$ref": "#/$defs/TestResult" - } - }, - "parse_failures": { - "type": "array", - "items": { - "$ref": "#/$defs/TestFailure" - } - }, - "parse_stats": { - "$ref": "#/$defs/Stats" - }, - "highlight_results": { - "type": "array", - "items": { - "$ref": "#/$defs/TestResult" - } - }, - "tag_results": { - "type": "array", - "items": { - "$ref": "#/$defs/TestResult" - } - }, - "query_results": { - "type": "array", - "items": { - "$ref": "#/$defs/TestResult" - } - } - }, - "required": [ - "parse_results", - "parse_failures", - "parse_stats", - "highlight_results", - "tag_results", - "query_results" - ], - "$defs": { - "TestResult": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "$ref": "#/$defs/TestResult" - } - } - }, - "required": [ - "children" - ] - }, - { - "type": "object", - "properties": { - "outcome": { - "$ref": "#/$defs/TestOutcome" - }, - "parse_rate": { - "type": [ - "number", - "null" - ], - "format": "double" - }, - "test_num": { - "type": "integer", - "format": "uint", - "minimum": 0 - } - }, - "required": [ - "outcome", - "parse_rate", - "test_num" - ] - }, - { - "type": "object", - "properties": { - "outcome": { - "$ref": "#/$defs/TestOutcome" - }, - "test_num": { - "type": "integer", - "format": "uint", - "minimum": 0 - } - }, - "required": [ - "outcome", - "test_num" - ] - } - ] - }, - "TestOutcome": { - "oneOf": [ - { - "type": "string", - "enum": [ - "Passed", - "Failed", - "Updated", - "Skipped", - "Platform" - ] - }, - { - "type": "object", - "properties": { - "AssertionPassed": { - "type": "object", - "properties": { - "assertion_count": { - "type": "integer", - "format": "uint", - "minimum": 0 - } - }, - "required": [ - "assertion_count" - ] - } - }, - "required": [ - "AssertionPassed" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "AssertionFailed": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - }, - "required": [ - "error" - ] - } - }, - "required": [ - "AssertionFailed" - ], - "additionalProperties": false - } - ] - }, - "TestFailure": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "actual": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "is_cst": { - "type": "boolean" - } - }, - "required": [ - "name", - "actual", - "expected", - "is_cst" - ] - }, - "Stats": { - "type": "object", - "properties": { - "successful_parses": { - "type": "integer", - "format": "uint", - "minimum": 0 - }, - "total_parses": { - "type": "integer", - "format": "uint", - "minimum": 0 - }, - "total_bytes": { - "type": "integer", - "format": "uint", - "minimum": 0 - }, - "total_duration": { - "$ref": "#/$defs/Duration" - } - }, - "required": [ - "successful_parses", - "total_parses", - "total_bytes", - "total_duration" - ] - }, - "Duration": { - "type": "object", - "properties": { - "secs": { - "type": "integer", - "format": "uint64", - "minimum": 0 - }, - "nanos": { - "type": "integer", - "format": "uint32", - "minimum": 0 - } - }, - "required": [ - "secs", - "nanos" - ] - } - } -} \ No newline at end of file diff --git a/docs/src/cli/build.md b/docs/src/cli/build.md deleted file mode 100644 index 44ee8271..00000000 --- a/docs/src/cli/build.md +++ /dev/null @@ -1,45 +0,0 @@ -# `tree-sitter build` - -The `build` command compiles your parser into a dynamically-loadable library, -either as a shared object (`.so`, `.dylib`, or `.dll`) or as a Wasm module. - -```bash -tree-sitter build [OPTIONS] [PATH] # Aliases: b -``` - -You can change the compiler executable via the `CC` environment variable and add extra flags via `CFLAGS`. -For macOS or iOS, you can set `MACOSX_DEPLOYMENT_TARGET` or `IPHONEOS_DEPLOYMENT_TARGET` respectively to define the -minimum supported version. - -The path argument allows you to specify the directory of the parser to build. If you don't supply this argument, the CLI -will attempt to build the parser in the current working directory. - -## Options - -### `-w/--wasm` - -Compile the parser as a Wasm module. This command looks for the [Wasi SDK][wasi_sdk] indicated by the `TREE_SITTER_WASI_SDK_PATH` -environment variable. If you don't have the binary, the CLI will attempt to download it for you to `/tree-sitter/wasi-sdk/`, -where `` is resolved according to the [XDG base directory][XDG] or Window's [Known_Folder_Locations][Known_Folder]. - -### `-o/--output` - -Specify where to output the shared object file (native or Wasm). This flag accepts either an absolute path or a relative -path. If you don't supply this flag, the CLI will attempt to figure out what the language name is based on the parent -directory name to use for the output file. If the CLI can't figure it out, it will default to `parser`, thus generating -`parser.so` or `parser.wasm` in the current working directory. - -### `--reuse-allocator` - -Reuse the allocator that's set in the core library for the parser's external scanner. This is useful in applications -where the author overrides the default allocator with their own, and wants to ensure every parser that allocates memory -in the external scanner does so using their allocator. - -### `-0/--debug` - -Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or -`lldb`. - -[Known_Folder]: https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid -[wasi_sdk]: https://github.com/WebAssembly/wasi-sdk -[XDG]: https://specifications.freedesktop.org/basedir/latest/ diff --git a/docs/src/cli/complete.md b/docs/src/cli/complete.md deleted file mode 100644 index 4c9aabfc..00000000 --- a/docs/src/cli/complete.md +++ /dev/null @@ -1,16 +0,0 @@ -# `tree-sitter complete` - -The `complete` command generates a completion script for your shell. -This script can be used to enable autocompletion for the `tree-sitter` CLI. - -```bash -tree-sitter complete --shell # Aliases: comp -``` - -## Options - -### `--shell ` - -The shell for which to generate the completion script. - -Supported values: `bash`, `elvish`, `fish`, `power-shell`, `zsh`, and `nushell`. diff --git a/docs/src/cli/dump-languages.md b/docs/src/cli/dump-languages.md deleted file mode 100644 index f29daa57..00000000 --- a/docs/src/cli/dump-languages.md +++ /dev/null @@ -1,18 +0,0 @@ -# `tree-sitter dump-languages` - -The `dump-languages` command prints out a list of all the languages that the CLI knows about. This can be useful for debugging -purposes, or for scripting. The paths to search comes from the config file's [`parser-directories`][parser-directories] -object. - -```bash -tree-sitter dump-languages [OPTIONS] # Aliases: langs -``` - -## Options - -### `--config-path` - -The path to the configuration file. Ordinarily, the CLI will use the default location as explained in the [init-config](./init-config.md) -command. This flag allows you to explicitly override that default, and use a config defined elsewhere. - -[parser-directories]: ./init-config.md#parser-directories diff --git a/docs/src/cli/fuzz.md b/docs/src/cli/fuzz.md deleted file mode 100644 index 7f97f9ba..00000000 --- a/docs/src/cli/fuzz.md +++ /dev/null @@ -1,61 +0,0 @@ -# `tree-sitter fuzz` - -The `fuzz` command is used to fuzz a parser by performing random edits and ensuring that undoing these edits results in -consistent parse trees. It will fail if the parse trees are not equal, or if the changed ranges are inconsistent. - -```bash -tree-sitter fuzz [OPTIONS] # Aliases: f -``` - -## Options - -### `-s/--skip ` - -A list of test names to skip fuzzing. - -### `--subdir ` - -The directory containing the parser. This is primarily useful in multi-language repositories. - -### `-p/--grammar-path` - -The path to the directory containing the grammar. - -### `--lib-path` - -The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. - -### `--lang-name` - -If `--lib-path` is used, the name of the language used to extract the library's language function - -### `--edits ` - -The maximum number of edits to perform. The default is 3. - -### `--iterations ` - -The number of iterations to run. The default is 10. - -### `-i/--include ` - -Only run tests whose names match this regex. - -### `-e/--exclude ` - -Skip tests whose names match this regex. - -### `--log-graphs` - -Outputs logs of the graphs of the stack and parse trees during parsing, as well as the actual parsing and lexing message. -The graphs are constructed with [graphviz dot][dot], and the output is written to `log.html`. - -### `-l/--log` - -Outputs parsing and lexing logs. This logs to stderr. - -### `-r/--rebuild` - -Force a rebuild of the parser before running the fuzzer. - -[dot]: https://graphviz.org/doc/info/lang.html diff --git a/docs/src/cli/generate.md b/docs/src/cli/generate.md deleted file mode 100644 index df9111f0..00000000 --- a/docs/src/cli/generate.md +++ /dev/null @@ -1,71 +0,0 @@ -# `tree-sitter generate` - -The most important command for grammar development is `tree-sitter generate`, which reads the grammar in structured form -and outputs C files that can be compiled into a shared or static library (e.g., using the [`build`](./build.md) command). - -```bash -tree-sitter generate [OPTIONS] [GRAMMAR_PATH] # Aliases: gen, g -``` - -The optional `GRAMMAR_PATH` argument should point to the structured grammar, in one of two forms: -- `grammar.js` a (ESM or CJS) JavaScript file; if the argument is omitted, it defaults to `./grammar.js`. -- `grammar.json` a structured representation of the grammar that is created as a byproduct of `generate`; this can be used -to regenerate a missing `parser.c` without requiring a JavaScript runtime (useful when distributing parsers to consumers). - -If there is an ambiguity or *local ambiguity* in your grammar, Tree-sitter will detect it during parser generation, and -it will exit with a `Unresolved conflict` error message. To learn more about conflicts and how to handle them, see -the section on [`Structuring Rules Well`](../creating-parsers/3-writing-the-grammar.md#structuring-rules-well) -in the user guide. - -## Generated files - -- `src/parser.c` implements the parser logic specified in the grammar. -- `src/tree_sitter/parser.h` provides basic C definitions that are used in the generated `parser.c` file. -- `src/tree_sitter/alloc.h` provides memory allocation macros that can be used in an external scanner. -- `src/tree_sitter/array.h` provides array macros that can be used in an external scanner. -- `src/grammar.json` contains a structured representation of the grammar; can be used to regenerate the parser without having -to re-evaluate the `grammar.js`. -- `src/node-types.json` provides type information about individual syntax nodes; see the section on [`Static Node Types`](../using-parsers/6-static-node-types.md). - - -## Options - -### `-l/--log` - -Print the log of the parser generation process. This includes information such as what tokens are included in the error -recovery state, what keywords were extracted, what states were split and why, and the entry point state. - -### `--abi ` - -The ABI to use for parser generation. The default is ABI 15, with ABI 14 being a supported target. - -### `--no-parser` - -Only generate `grammar.json` and `node-types.json` - -### `-o/--output` - -The directory to place the generated parser in. The default is `src/` in the current directory. - -### `--report-states-for-rule ` - -Print the overview of states from the given rule. This is useful for debugging and understanding the generated parser's -item sets for all given states in a given rule. To solely view state count numbers for rules, pass in `-` for the rule argument. -To view the overview of states for every rule, pass in `*` for the rule argument. - -### `--json-summary` - -Report conflicts in a JSON format. - -### `--js-runtime ` - -The path to the JavaScript runtime executable to use when generating the parser. The default is `node`. -Note that you can also set this with `TREE_SITTER_JS_RUNTIME`. Starting from version 0.26, you can -also pass in `native` to use the experimental native QuickJS runtime that comes bundled with the CLI. -This avoids the dependency on a JavaScript runtime entirely. The native QuickJS runtime is compatible -with ESM as well as with CommonJS in strict mode. If your grammar depends on `npm` to install dependencies such as base -grammars, the native runtime can be used *after* running `npm install`. - -### `--disable-optimization` - -Disable optimizations when generating the parser. Currently, this only affects the merging of compatible parse states. diff --git a/docs/src/cli/highlight.md b/docs/src/cli/highlight.md deleted file mode 100644 index 1a4ed1f6..00000000 --- a/docs/src/cli/highlight.md +++ /dev/null @@ -1,64 +0,0 @@ -# `tree-sitter highlight` - -You can run syntax highlighting on an arbitrary file using `tree-sitter highlight`. This can either output colors directly -to your terminal using ANSI escape codes, or produce HTML (if the `--html` flag is passed). For more information, see -[the syntax highlighting page](../3-syntax-highlighting.md). - -```bash -tree-sitter highlight [OPTIONS] [PATHS]... # Aliases: hi -``` - -## Options - -### `-H/--html` - -Output an HTML document with syntax highlighting. - -### `--css-classes` - -Output HTML with CSS classes instead of inline styles. - -### `--check` - -Check that the highlighting captures conform strictly to the standards. - -### `--captures-path ` - -The path to a file with captures. These captures would be considered the "standard" captures to compare against. - -### `--query-paths ` - -The paths to query files to use for syntax highlighting. These should end in `highlights.scm`. - -### `--scope ` - -The language scope to use for syntax highlighting. This is useful when the language is ambiguous. - -### `-t/--time` - -Print the time taken to highlight the file. - -### `-q/--quiet` - -Suppress main output. - -### `--paths ` - -The path to a file that contains paths to source files to highlight - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - -### `--config-path ` - -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more -information. - -### `-n/--test-number ` - -Highlight the contents of a specific test. - -### `-r/--rebuild` - -Force a rebuild of the parser before running the fuzzer. diff --git a/docs/src/cli/index.md b/docs/src/cli/index.md deleted file mode 100644 index 042c0196..00000000 --- a/docs/src/cli/index.md +++ /dev/null @@ -1,8 +0,0 @@ -# CLI Overview - -The `tree-sitter` command-line interface is used to create, manage, test, and build tree-sitter parsers. It is controlled -by - -- a personal `tree-sitter/config.json` config file generated by [`tree-sitter init-config`](./init-config.md) -- a parser `tree-sitter.json` config file generated by [`tree-sitter init`](./init.md). - diff --git a/docs/src/cli/init-config.md b/docs/src/cli/init-config.md deleted file mode 100644 index 77aacd66..00000000 --- a/docs/src/cli/init-config.md +++ /dev/null @@ -1,153 +0,0 @@ -# `tree-sitter init-config` - -This command initializes a configuration file for the Tree-sitter CLI. - -```bash -tree-sitter init-config -``` - -These directories are created in the "default" location for your platform: - -* On Unix, `$XDG_CONFIG_HOME/tree-sitter` or `$HOME/.config/tree-sitter` -* On Windows, `%APPDATA%\tree-sitter` or `$HOME\AppData\Roaming\tree-sitter` - -```admonish info -The CLI will work if there's no config file present, falling back on default values for each configuration option. -``` - -When you run the `init-config` command, it will print out the location of the file that it creates so that you can easily -find and modify it. - -The configuration file is a JSON file that contains the following fields: - -## `parser-directories` - -The [`tree-sitter highlight`](./highlight.md) command takes one or more file paths, and tries to automatically determine, -which language should be used to highlight those files. To do this, it needs to know *where* to look for Tree-sitter grammars -on your filesystem. You can control this using the `"parser-directories"` key in your configuration file: - -```json -{ - "parser-directories": [ - "/Users/my-name/code", - "~/other-code", - "$HOME/another-code" - ] -} -``` - -Any folder within one of these *parser directories* whose name begins with `tree-sitter-` will be treated as a Tree-sitter -grammar repository. - -## `theme` - -The [Tree-sitter highlighting system](../3-syntax-highlighting.md) works by annotating ranges of source code with logical -"highlight names" like `function.method`, `type.builtin`, `keyword`, etc. To decide what *color* should be used for rendering -each highlight, a *theme* is needed. - -In your config file, the `"theme"` value is an object whose keys are dot-separated highlight names like -`function.builtin` or `keyword`, and whose values are JSON expressions that represent text styling parameters. - -### Highlight Names - -A theme can contain multiple keys that share a common subsequence. Examples: - -* `variable` and `variable.parameter` -* `function`, `function.builtin`, and `function.method` - -For a given highlight produced, styling will be determined based on the **longest matching theme key**. For example, the -highlight `function.builtin.static` would match the key `function.builtin` rather than `function`. - -### Styling Values - -Styling values can be any of the following: - -* Integers from 0 to 255, representing ANSI terminal color ids. -* Strings like `"#e45649"` representing hexadecimal RGB colors. -* Strings naming basic ANSI colors like `"red"`, `"black"`, `"purple"`, or `"cyan"`. -* Objects with the following keys: - * `color` — An integer or string as described above. - * `underline` — A boolean indicating whether the text should be underlined. - * `italic` — A boolean indicating whether the text should be italicized. - * `bold` — A boolean indicating whether the text should be bold-face. - -An example theme can be seen below: - -```json -{ - "function": 26, - "operator": { - "bold": true, - "color": 239 - }, - "variable.builtin": { - "bold": true - }, - "variable.parameter": { - "underline": true - }, - "type.builtin": { - "color": 23, - "bold": true - }, - "keyword": 56, - "type": 23, - "number": { - "bold": true, - "color": 94 - }, - "constant": 94, - "attribute": { - "color": 124, - "italic": true - }, - "comment": { - "color": 245, - "italic": true - }, - "constant.builtin": { - "color": 94, - "bold": true - }, -} -``` - -## `parse-theme` - -The [`tree-sitter parse`](./parse.md) command will output a pretty-printed CST when the `-c/--cst` option is used. You can -control what colors are used for various parts of the tree in your configuration file. - -```admonish note -Omitting a field will cause the relevant text to be rendered with its default color. -``` - -An example parse theme can be seen below: - -```json -{ - "parse-theme": { - // The color of node kinds - "node-kind": [20, 20, 20], - // The color of text associated with a node - "node-text": [255, 255, 255], - // The color of node fields - "field": [42, 42, 42], - // The color of the range information for unnamed nodes - "row-color": [255, 255, 255], - // The color of the range information for named nodes - "row-color-named": [255, 130, 0], - // The color of extra nodes - "extra": [255, 0, 255], - // The color of ERROR nodes - "error": [255, 0, 0], - // The color of MISSING nodes and their associated text - "missing": [153, 75, 0], - // The color of newline characters - "line-feed": [150, 150, 150], - // The color of backtick characters - "backtick": [0, 200, 0], - // The color of literals - "literal": [0, 0, 200], - } -} -``` diff --git a/docs/src/cli/init.md b/docs/src/cli/init.md deleted file mode 100644 index 568bc98f..00000000 --- a/docs/src/cli/init.md +++ /dev/null @@ -1,209 +0,0 @@ -# `tree-sitter init` - -The `init` command is your starting point for creating a new grammar. When you run it, it sets up a repository with all -the essential files and structure needed for grammar development. Since the command includes git-related files by default, -we recommend using git for version control of your grammar. - -```bash -tree-sitter init [OPTIONS] # Aliases: i -``` - -## Generated files - -### Required files - -The following required files are always created if missing: - -- `tree-sitter.json` - The main configuration file that determines how `tree-sitter` interacts with the grammar. If missing, -the `init` command will prompt the user for the required fields. See [below](./init.md#structure-of-tree-sitterjson) for -the full documentation of the structure of this file. -- `package.json` - The `npm` manifest for the parser. This file is required for some `tree-sitter` subcommands, and if the -grammar has dependencies (e.g., another published base grammar that this grammar extends). -- `grammar.js` - An empty template for the main grammar file; see [the section on creating parsers](../2-creating-parser). - -### Language bindings - -Language bindings are files that allow your parser to be directly used by projects written in the respective language. -The following bindings are created if enabled in `tree-sitter.json`: - -#### C/C++ - -- `Makefile` — This file tells [`make`][make] how to compile your language. -- `CMakeLists.txt` — This file tells [`cmake`][cmake] how to compile your language. -- `bindings/c/tree_sitter/tree-sitter-language.h` — This file provides the C interface of your language. -- `bindings/c/tree-sitter-language.pc` — This file provides [pkg-config][pkg-config] metadata about your language's C library. - -#### Go - -- `go.mod` — This file is the manifest of the Go module. -- `bindings/go/binding.go` — This file wraps your language in a Go module. -- `bindings/go/binding_test.go` — This file contains a test for the Go package. - -#### Node - -- `binding.gyp` — This file tells Node.js how to compile your language. -- `bindings/node/binding.cc` — This file wraps your language in a JavaScript module for Node.js. -- `bindings/node/index.js` — This is the file that Node.js initially loads when using your language. -- `bindings/node/index.d.ts` — This file provides type hints for your parser when used in TypeScript. -- `bindings/node/binding_test.js` — This file contains a test for the Node.js package. - -#### Java - -- `pom.xml` - This file is the manifest of the Maven package. -- `bindings/java/main/namespace/language/TreeSitterLanguage.java` - This file wraps your language in a Java class. -- `bindings/java/test/TreeSitterLanguageTest.java` - This file contains a test for the Java package. - -#### Python - -- `pyproject.toml` — This file is the manifest of the Python package. -- `setup.py` — This file tells Python how to compile your language. -- `bindings/python/tree_sitter_language/binding.c` — This file wraps your language in a Python module. -- `bindings/python/tree_sitter_language/__init__.py` — This file tells Python how to load your language. -- `bindings/python/tree_sitter_language/__init__.pyi` — This file provides type hints for your parser when used in Python. -- `bindings/python/tree_sitter_language/py.typed` — This file provides type hints for your parser when used in Python. -- `bindings/python/tests/test_binding.py` — This file contains a test for the Python package. - -#### Rust - -- `Cargo.toml` — This file is the manifest of the Rust package. -- `bindings/rust/build.rs` — This file tells Rust how to compile your language. -- `bindings/rust/lib.rs` — This file wraps your language in a Rust crate when used in Rust. - -#### Swift - -- `Package.swift` — This file tells Swift how to compile your language. -- `bindings/swift/TreeSitterLanguage/language.h` — This file wraps your language in a Swift module when used in Swift. -- `bindings/swift/TreeSitterLanguageTests/TreeSitterLanguageTests.swift` — This file contains a test for the Swift package. - -#### Zig - -- `build.zig` - This file tells Zig how to compile your language. -- `build.zig.zon` - This file is the manifest of the Zig package. -- `bindings/zig/root.zig` - This file wraps your language in a Zig module. -- `bindings/zig/test.zig` - This file contains a test for the Zig package. - -### Additional files - -In addition, the following files are created that aim to improve the development experience: - -- `.editorconfig` — This file tells your editor how to format your code. More information about this file can be found [here][editorconfig]. -- `.gitattributes` — This file tells Git how to handle line endings and tells GitHub which files are generated. -- `.gitignore` — This file tells Git which files to ignore when committing changes. - -## Structure of `tree-sitter.json` - -### The `grammars` field - -This field is an array of objects, though you typically only need one object in this array unless your repo has -multiple grammars (for example, `Typescript` and `TSX`), e.g., -```json -{ - "tree-sitter": [ - { - "scope": "source.ruby", - "file-types": [ - "rb", - "gemspec", - "Gemfile", - "Rakefile" - ], - "first-line-regex": "#!.*\\bruby$" - } - ] -} -``` - -#### Basic fields - -These keys specify basic information about the parser: - -- `scope` (required) — A string like `"source.js"` that identifies the language. -We strive to match the scope names used by popular [TextMate grammars][textmate] and by the [Linguist][linguist] library. - -- `path` — A relative path from the directory containing `tree-sitter.json` to another directory containing the `src/` -folder, which contains the actual generated parser. The default value is `"."` -(so that `src/` is in the same folder as `tree-sitter.json`), and this very rarely needs to be overridden. - -- `external-files` — A list of relative paths from the root dir of a -parser to files that should be checked for modifications during recompilation. -This is useful during development to have changes to other files besides scanner.c -be picked up by the cli. - -#### Language detection - -These keys help to decide whether the language applies to a given file: - -- `file-types` — An array of filename suffix strings (not including the dot). The grammar will be used for files whose names -end with one of these suffixes. Note that the suffix may match an *entire* filename. - -- `first-line-regex` — A regex pattern that will be tested against the first line of a file -to determine whether this language applies to the file. If present, this regex will be used for any file whose -language does not match any grammar's `file-types`. - -- `content-regex` — A regex pattern that will be tested against the contents of the file -to break ties in cases where multiple grammars matched the file using the above two criteria. If the regex matches, -this grammar will be preferred over another grammar with no `content-regex`. If the regex does not match, a grammar with -no `content-regex` will be preferred over this one. - -- `injection-regex` — A regex pattern that will be tested against a *language name* to determine whether this language -should be used for a potential *language injection* site. -Language injection is described in more detail in [the relevant section](../3-syntax-highlighting.md#language-injection). - -#### Query paths - -These keys specify relative paths from the directory containing `tree-sitter.json` to the files that control syntax highlighting: - -- `highlights` — Path to a *highlight query*. Default: `queries/highlights.scm` -- `locals` — Path to a *local variable query*. Default: `queries/locals.scm`. -- `injections` — Path to an *injection query*. Default: `queries/injections.scm`. -- `tags` — Path to a *tag query*. Default: `queries/tags.scm`. - -### The `metadata` field - -This field contains information that tree-sitter will use to populate relevant bindings' files, especially their versions. -Typically, this will all be set up when you run `tree-sitter init`, but you are welcome to update it as you see fit. - -- `version` (required) — The current version of your grammar, which should follow [semver][semver] -- `license` — The license of your grammar, which should be a valid [SPDX license][spdx] -- `description` — The brief description of your grammar -- `authors` (required) — An array of objects that contain a `name` field, and optionally an `email` and `url` field. -Each field is a string -- `links` — An object that contains a `repository` field, and optionally a `funding` field. Each field is a string -- `namespace` — The namespace for the `Java` and `Kotlin` bindings, defaults to `io.github.tree-sitter` if not provided - -### The `bindings` field - -This field controls what bindings are generated when the `init` command is run. -Each key is a language name, and the value is a boolean. - -- `c` (default: `true`) -- `go` (default: `true`) -- `java` (default: `false`) -- `node` (default: `true`) -- `python` (default: `true`) -- `rust` (default: `true`) -- `swift` (default: `false`) -- `zig` (default: `false`) - -## Options - -### `-u/--update` - -Update outdated generated files, if possible. - -**Note:** Existing files that may have been edited manually are _not_ updated in general. To force an update to such files, -remove them and call `tree-sitter init -u` again. - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - - -[cmake]: https://cmake.org/cmake/help/latest -[editorconfig]: https://editorconfig.org -[linguist]: https://github.com/github/linguist -[make]: https://www.gnu.org/software/make/manual/make.html -[pkg-config]: https://www.freedesktop.org/wiki/Software/pkg-config -[semver]: https://semver.org -[spdx]: https://spdx.org/licenses -[textmate]: https://macromates.com/manual/en/language_grammars diff --git a/docs/src/cli/parse.md b/docs/src/cli/parse.md deleted file mode 100644 index 2e9bc835..00000000 --- a/docs/src/cli/parse.md +++ /dev/null @@ -1,115 +0,0 @@ -# `tree-sitter parse` - -The `parse` command parses source files using a Tree-sitter parser. You can pass any number of file paths and glob patterns -to `tree-sitter parse`, and it will parse all the given files. If no paths are provided, input will be parsed from stdin. -The command will exit with a non-zero status code if any parse errors occurred. - -```bash -tree-sitter parse [OPTIONS] [PATHS]... # Aliases: p -``` - -## Options - -### `--paths ` - -The path to a file that contains paths to source files to parse. - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - -### `-l/--lib-path` - -The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. - -### `--lang-name` - -If `--lib-path` is used, the name of the language used to extract the library's language function - -### `--scope ` - -The language scope to use for parsing. This is useful when the language is ambiguous. - -### `-d/--debug` - -Outputs parsing and lexing logs. This logs to stderr. - -### `-0/--debug-build` - -Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or `lldb`. - -### `-D/--debug-graph` - -Outputs logs of the graphs of the stack and parse trees during parsing, as well as the actual parsing and lexing message. -The graphs are constructed with [graphviz dot][dot], and the output is written to `log.html`. - -### `--wasm` - -Compile and run the parser as a Wasm module (only if the tree-sitter CLI was built with `--features=wasm`). - -### `--dot` - -Output the parse tree with [graphviz dot][dot]. - -### `-x/--xml` - -Output the parse tree in XML format. - -### `-c/--cst` - -Output the parse tree in a pretty-printed CST format. - -### `-s/--stat` - -Show parsing statistics. - -### `--timeout ` - -Set the timeout for parsing a single file, in microseconds. - -### `-t/--time` - -Print the time taken to parse the file. If edits are provided, this will also print the time taken to parse the file after -each edit. - -### `-q/--quiet` - -Suppress main output. - -### `--edits ...` - -Apply edits after parsing the file. Edits are in the form of `row,col|position delcount insert_text` where row and col, -or position are 0-indexed. - -### `--encoding ` - -Set the encoding of the input file. By default, the CLI will look for the [`BOM`][bom] to determine if the file is encoded -in `UTF-16BE` or `UTF-16LE`. If no `BOM` is present, `UTF-8` is the default. One of `utf8`, `utf16-le`, `utf16-be`. - -### `--open-log` - -When using the `--debug-graph` option, open the log file in the default browser. - -### `-j/--json-summary` - -Output parsing results in a JSON format. - -### `--config-path ` - -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more -information. - -### `-n/--test-number ` - -Parse a specific test in the corpus. The test number is the same number that appears in the output of `tree-sitter test`. - -### `-r/--rebuild` - -Force a rebuild of the parser before running tests. - -### `--no-ranges` - -Omit the node's ranges from the default parse output. This is useful when copying S-Expressions to a test file. - -[dot]: https://graphviz.org/doc/info/lang.html -[bom]: https://en.wikipedia.org/wiki/Byte_order_mark diff --git a/docs/src/cli/playground.md b/docs/src/cli/playground.md deleted file mode 100644 index c0bfb495..00000000 --- a/docs/src/cli/playground.md +++ /dev/null @@ -1,26 +0,0 @@ -# `tree-sitter playground` - -The `playground` command allows you to start a local playground to test your parser interactively. - -```bash -tree-sitter playground [OPTIONS] # Aliases: play, pg, web-ui -``` - -```admonish note -For this to work, you must have already built the parser as a Wasm module. This can be done with the [`build`](./build.md) -subcommand (`tree-sitter build --wasm`). -``` - -## Options - -### `-q/--quiet` - -Don't automatically open the playground in the default browser. - -### `--grammar-path ` - -The path to the directory containing the grammar and wasm files. - -### `-e/--export ` - -Export static playground files to the specified directory instead of serving them. diff --git a/docs/src/cli/query.md b/docs/src/cli/query.md deleted file mode 100644 index fbd6dafd..00000000 --- a/docs/src/cli/query.md +++ /dev/null @@ -1,76 +0,0 @@ -# `tree-sitter query` - -The `query` command is used to run a query on a parser, and view the results. - -```bash -tree-sitter query [OPTIONS] [PATHS]... # Aliases: q -``` - -## Options - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - -### `--lib-path` - -The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. - -### `--lang-name` - -If `--lib-path` is used, the name of the language used to extract the library's language function - -### `-t/--time` - -Print the time taken to execute the query on the file. - -### `-q/--quiet` - -Suppress main output. - -### `--paths ` - -The path to a file that contains paths to source files in which the query will be executed. - -### `--byte-range ` - -The range of byte offsets in which the query will be executed. The format is `start_byte:end_byte`. - -### `--containing-byte-range ` - -The range of byte offsets in which the query will be executed. Only the matches that are fully contained within the provided -byte range will be returned. - -### `--row-range ` - -The range of rows in which the query will be executed. The format is `start_row:end_row`. - -### `--containing-row-range ` - -The range of rows in which the query will be executed. Only the matches that are fully contained within the provided row -range will be returned. - -### `--scope ` - -The language scope to use for parsing and querying. This is useful when the language is ambiguous. - -### `-c/--captures` - -Order the query results by captures instead of matches. - -### `--test` - -Whether to run query tests or not. - -### `--config-path ` - -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more -information. - -### `-n/--test-number ` - -Query the contents of a specific test. - -### `-r/--rebuild` - -Force a rebuild of the parser before executing the query. diff --git a/docs/src/cli/tags.md b/docs/src/cli/tags.md deleted file mode 100644 index 8275237e..00000000 --- a/docs/src/cli/tags.md +++ /dev/null @@ -1,43 +0,0 @@ -# `tree-sitter tags` - -You can run symbol tagging on an arbitrary file using `tree-sitter tags`. This will output a list of tags. -For more information, see [the code navigation page](../4-code-navigation.md#tagging-and-captures). - -```bash -tree-sitter tags [OPTIONS] [PATHS]... -``` - -## Options - -### `--scope ` - -The language scope to use for symbol tagging. This is useful when the language is ambiguous. - -### `-t/--time` - -Print the time taken to generate tags for the file. - -### `-q/--quiet` - -Suppress main output. - -### `--paths ` - -The path to a file that contains paths to source files to tag. - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - -### `--config-path ` - -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more -information. - -### `-n/--test-number ` - -Generate tags from the contents of a specific test. - -### `-r/--rebuild` - -Force a rebuild of the parser before running the tags. diff --git a/docs/src/cli/test.md b/docs/src/cli/test.md deleted file mode 100644 index 7e662f60..00000000 --- a/docs/src/cli/test.md +++ /dev/null @@ -1,93 +0,0 @@ -# `tree-sitter test` - -The `test` command is used to run the test suite for a parser. - -```bash -tree-sitter test [OPTIONS] # Aliases: t -``` - -## Options - -### `-i/--include ` - -Only run tests whose names match this regex. - -### `-e/--exclude ` - -Skip tests whose names match this regex. - -### `--file-name ` - -Only run tests from the given filename in the corpus. - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - -### `--lib-path` - -The path to the parser's dynamic library. This is used instead of the cached or automatically generated dynamic library. - -### `--lang-name` - -If `--lib-path` is used, the name of the language used to extract the library's language function - -### `-u/--update` - -Update the expected output of tests. - -```admonish info -Tests containing `ERROR` nodes or `MISSING` nodes will not be updated. -``` - -### `-d/--debug` - -Outputs parsing and lexing logs. This logs to stderr. - -### `-0/--debug-build` - -Compile the parser with debug flags enabled. This is useful when debugging issues that require a debugger like `gdb` or `lldb`. - -### `-D/--debug-graph` - -Outputs logs of the graphs of the stack and parse trees during parsing, as well as the actual parsing and lexing message. -The graphs are constructed with [graphviz dot][dot], and the output is written to `log.html`. - -### `--wasm` - -Compile and run the parser as a Wasm module (only if the tree-sitter CLI was built with `--features=wasm`). - -### `--open-log` - -When using the `--debug-graph` option, open the log file in the default browser. - -### `--config-path ` - -The path to an alternative configuration (`config.json`) file. See [the init-config command](./init-config.md) for more -information. - -### `--show-fields` - -Force showing fields in test diffs. - -### `--stat ` - -Show parsing statistics when tests are being run. One of `all`, `outliers-and-total`, or `total-only`. - -- `all`: Show statistics for every test. - -- `outliers-and-total`: Show statistics only for outliers, and total statistics. - -- `total-only`: Show only total statistics. - -### `-r/--rebuild` - -Force a rebuild of the parser before running tests. - -### `--overview-only` - -Only show the overview of the test results, and not the diff. - -### `--json-summary` - -Output the test summary in a JSON format. diff --git a/docs/src/cli/version.md b/docs/src/cli/version.md deleted file mode 100644 index 39cda84a..00000000 --- a/docs/src/cli/version.md +++ /dev/null @@ -1,55 +0,0 @@ -# `tree-sitter version` - -The `version` command upgrades the version of your grammar. - -```bash -tree-sitter version # Aliases: publish -``` - -This will update the version in several files, if they exist: - -* tree-sitter.json -* Cargo.toml -* Cargo.lock -* package.json -* package-lock.json -* Makefile -* CMakeLists.txt -* pyproject.toml - -Alternative forms can use the version in `tree-sitter.json` to bump automatically: - -```bash -tree-sitter version --bump patch # patch bump -tree-sitter version --bump minor # minor bump -tree-sitter version --bump major # major bump -``` - -As a grammar author, you should keep the version of your grammar in sync across different bindings. However, doing so manually -is error-prone and tedious, so this command takes care of the burden. If you are using a version control system, it is recommended -to commit the changes made by this command, and to tag the commit with the new version. - -To print the current version without bumping it, use: - -```bash -tree-sitter version -``` - -Note that some of the binding updates require access to external tooling: - -* Updating Cargo.toml and Cargo.lock bindings requires that `cargo` is installed. -* Updating package-lock.json requires that `npm` is installed. - -## Options - -### `-p/--grammar-path ` - -The path to the directory containing the grammar. - -### `--bump` - -Automatically bump the version. Possible values are: - -- `patch`: Bump the patch version. -- `minor`: Bump the minor version. -- `major`: Bump the major version. diff --git a/docs/src/creating-parsers/1-getting-started.md b/docs/src/creating-parsers/1-getting-started.md deleted file mode 100644 index 5095eb75..00000000 --- a/docs/src/creating-parsers/1-getting-started.md +++ /dev/null @@ -1,136 +0,0 @@ -# Getting Started - -## Dependencies - -To develop a Tree-sitter parser, there are two dependencies that you need to install: - -- **A JavaScript runtime** — Tree-sitter grammars are written in JavaScript, and Tree-sitter uses a JavaScript runtime -(the default being [Node.js][node.js]) to interpret JavaScript files. It requires this runtime command (default: `node`) -to be in one of the directories in your [`PATH`][path-env]. - -- **A C Compiler** — Tree-sitter creates parsers that are written in C. To run and test these parsers with the -`tree-sitter parse` or `tree-sitter test` commands, you must have a C/C++ compiler installed. Tree-sitter will try to look -for these compilers in the standard places for each platform. - -## Installation - -To create a Tree-sitter parser, you need to use [the `tree-sitter` CLI][tree-sitter-cli]. You can install the CLI in a few -different ways: - -- Build the `tree-sitter-cli` [Rust crate][crate] from source using [`cargo`][cargo], the Rust package manager. This works -on any platform. See [the contributing docs](../6-contributing.md#developing-tree-sitter) for more information. - -- Install the `tree-sitter-cli` [Rust crate][crate] from [crates.io][crates.io] using [`cargo`][cargo]. You can do so by -running the following command: `cargo install tree-sitter-cli --locked` - -- Install the `tree-sitter-cli` [Node.js module][node-module] using [`npm`][npm], the Node package manager. This approach -is fast, but it only works on certain platforms, because it relies on pre-built binaries. - -- Download a binary for your platform from [the latest GitHub release][releases], and put it into a directory on your `PATH`. - -## Project Setup - -The preferred convention is to name the parser repository "tree-sitter-" followed by the name of the language, in lowercase. - -```sh -mkdir tree-sitter-${LOWER_PARSER_NAME} -cd tree-sitter-${LOWER_PARSER_NAME} -``` - -```admonish note -The `LOWER_` prefix here means the "lowercase" name of the language. -``` - -### Init - -Once you've installed the `tree-sitter` CLI tool, you can start setting up your project, which will allow your parser to -be used from multiple languages. - -```sh -# This will prompt you for input -tree-sitter init -``` - -The `init` command will create a bunch of files in the project. -There should be a file called `grammar.js` with the following contents: - -```js -/** - * @file PARSER_DESCRIPTION - * @author PARSER_AUTHOR_NAME PARSER_AUTHOR_EMAIL - * @license PARSER_LICENSE - */ - -/// -// @ts-check - -export default grammar({ - name: 'LOWER_PARSER_NAME', - - rules: { - // TODO: add the actual grammar rules - source_file: $ => 'hello' - } -}); -``` - -```admonish info -The placeholders shown above would be replaced with the corresponding data you provided in the `init` sub-command's -prompts. -``` - -To learn more about this command, check the [reference page](../cli/init.md). - -### Generate - -Next, run the following command: - -```sh -tree-sitter generate -``` - -This will generate the C code required to parse this trivial language. - -You can test this parser by creating a source file with the contents "hello" and parsing it: - -```sh -echo 'hello' > example-file -tree-sitter parse example-file -``` - -Alternatively, in Windows PowerShell: - -```pwsh -"hello" | Out-File example-file -Encoding utf8 -tree-sitter parse example-file -``` - -This should print the following: - -```text -(source_file [0, 0] - [1, 0]) -``` - -You now have a working parser. - -Finally, look back at the [triple-slash][] and [`@ts-check`][ts-check] comments in `grammar.js`; these tell your editor -to provide documentation and type information as you edit your grammar. For these to work, you must download Tree-sitter's -TypeScript API from npm into a `node_modules` directory in your project: - -```sh -npm install # or your package manager of choice -``` - -To learn more about this command, check the [reference page](../cli/generate.md). - -[cargo]: https://doc.rust-lang.org/cargo/getting-started/installation.html -[crate]: https://crates.io/crates/tree-sitter-cli -[crates.io]: https://crates.io/crates/tree-sitter-cli -[node-module]: https://www.npmjs.com/package/tree-sitter-cli -[node.js]: https://nodejs.org -[npm]: https://docs.npmjs.com -[path-env]: https://en.wikipedia.org/wiki/PATH_(variable) -[releases]: https://github.com/tree-sitter/tree-sitter/releases/latest -[tree-sitter-cli]: https://github.com/tree-sitter/tree-sitter/tree/master/crates/cli -[triple-slash]: https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html -[ts-check]: https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html diff --git a/docs/src/creating-parsers/2-the-grammar-dsl.md b/docs/src/creating-parsers/2-the-grammar-dsl.md deleted file mode 100644 index 0592c6bd..00000000 --- a/docs/src/creating-parsers/2-the-grammar-dsl.md +++ /dev/null @@ -1,159 +0,0 @@ -# The Grammar DSL - -The following is a complete list of built-in functions you can use in your `grammar.js` to define rules. Use-cases for some -of these functions will be explained in more detail in later sections. - -- **Symbols (the `$` object)** — Every grammar rule is written as a JavaScript function that takes a parameter conventionally -called `$`. The syntax `$.identifier` is how you refer to another grammar symbol within a rule. Names starting with `$.MISSING` -or `$.UNEXPECTED` should be avoided as they have special meaning for the `tree-sitter test` command. -- **String and Regex literals** — The terminal symbols in a grammar are described using JavaScript strings and regular -expressions. Of course during parsing, Tree-sitter does not actually use JavaScript's regex engine to evaluate these regexes; -it generates its own regex-matching logic based on the Rust regex syntax as part of each parser. Regex literals are just -used as a convenient way of writing regular expressions in your grammar. You can use Rust regular expressions in your grammar -DSL through the `RustRegex` class. Simply pass your regex pattern as a string: - - ```js - new RustRegex('(?i)[a-z_][a-z0-9_]*') // matches a simple identifier - ``` - - Unlike JavaScript's builtin `RegExp` class, which takes a pattern and flags as separate arguments, `RustRegex` only - accepts a single pattern string. While it doesn't support separate flags, you can use inline flags within the pattern - itself. For more details about Rust's regex syntax and capabilities, check out the [Rust regex documentation][rust regex]. - - ```admonish note - Only a subset of the Regex engine is actually supported. This is due to certain features like lookahead and lookaround - assertions not feasible to use in an LR(1) grammar, as well as certain flags being unnecessary for tree-sitter. However, - plenty of features are supported by default: - - - Character classes - - Character ranges - - Character sets - - Quantifiers - - Alternation - - Grouping - - Unicode character escapes - - Unicode property escapes - ``` - -- **Sequences : `seq(rule1, rule2, ...)`** — This function creates a rule that matches any number of other rules, one after -another. It is analogous to simply writing multiple symbols next to each other in [EBNF notation][ebnf]. - -- **Alternatives : `choice(rule1, rule2, ...)`** — This function creates a rule that matches *one* of a set of possible -rules. The order of the arguments does not matter. This is analogous to the `|` (pipe) operator in EBNF notation. - -- **Repetitions : `repeat(rule)`** — This function creates a rule that matches *zero-or-more* occurrences of a given rule. -It is analogous to the `{x}` (curly brace) syntax in EBNF notation. - -- **Repetitions : `repeat1(rule)`** — This function creates a rule that matches *one-or-more* occurrences of a given rule. -The previous `repeat` rule is implemented in `repeat1` but is included because it is very commonly used. - -- **Options : `optional(rule)`** — This function creates a rule that matches *zero or one* occurrence of a given rule. -It is analogous to the `[x]` (square bracket) syntax in EBNF notation. - -- **Precedence : `prec(number, rule)`** — This function marks the given rule with a numerical precedence, which will be -used to resolve [*LR(1) Conflicts*][lr-conflict] at parser-generation time. When two rules overlap in a way that represents -either a true ambiguity or a *local* ambiguity given one token of lookahead, Tree-sitter will try to resolve the conflict -by matching the rule with the higher precedence. The default precedence of all rules is zero. This works similarly to the -[precedence directives][yacc-prec] in Yacc grammars. - - This function can also be used to assign lexical precedence to a given - token, but it must be wrapped in a `token` call, such as `token(prec(1, 'foo'))`. This reads as "the token `foo` has a - lexical precedence of 1". The purpose of lexical precedence is to solve the issue where multiple tokens can match the same - set of characters, but one token should be preferred over the other. See [Lexical Precedence vs Parse Precedence][lexical vs parse] - for a more detailed explanation. - -- **Left Associativity : `prec.left([number], rule)`** — This function marks the given rule as left-associative (and optionally -applies a numerical precedence). When an LR(1) conflict arises in which all the rules have the same numerical precedence, -Tree-sitter will consult the rules' associativity. If there is a left-associative rule, Tree-sitter will prefer matching -a rule that ends *earlier*. This works similarly to [associativity directives][yacc-prec] in Yacc grammars. - -- **Right Associativity : `prec.right([number], rule)`** — This function is like `prec.left`, but it instructs Tree-sitter -to prefer matching a rule that ends *later*. - -- **Dynamic Precedence : `prec.dynamic(number, rule)`** — This function is similar to `prec`, but the given numerical precedence -is applied at *runtime* instead of at parser generation time. This is only necessary when handling a conflict dynamically -using the `conflicts` field in the grammar, and when there is a genuine *ambiguity*: multiple rules correctly match a given -piece of code. In that event, Tree-sitter compares the total dynamic precedence associated with each rule, and selects the -one with the highest total. This is similar to [dynamic precedence directives][bison-dprec] in Bison grammars. - -- **Tokens : `token(rule)`** — This function marks the given rule as producing only -a single token. Tree-sitter's default is to treat each String or RegExp literal -in the grammar as a separate token. Each token is matched separately by the lexer -and returned as its own leaf node in the tree. The `token` function allows you to -express a complex rule using the functions described above (rather than as a single -regular expression) but still have Tree-sitter treat it as a single token. -The token function will only accept terminal rules, so `token($.foo)` will not work. -You can think of it as a shortcut for squashing complex rules of strings or regexes -down to a single token. - -- **Immediate Tokens : `token.immediate(rule)`** — Usually, whitespace (and any other extras, such as comments) is optional -before each token. This function means that the token will only match if there is no whitespace. - -- **Aliases : `alias(rule, name)`** — This function causes the given rule to *appear* with an alternative name in the syntax -tree. If `name` is a *symbol*, as in `alias($.foo, $.bar)`, then the aliased rule will *appear* as a [named node][named-vs-anonymous-nodes] -called `bar`. And if `name` is a *string literal*, as in `alias($.foo, 'bar')`, then the aliased rule will appear as an -[anonymous node][named-vs-anonymous-nodes], as if the rule had been written as the simple string. - -- **Field Names : `field(name, rule)`** — This function assigns a *field name* to the child node(s) matched by the given -rule. In the resulting syntax tree, you can then use that field name to access specific children. - -- **Reserved Keywords : `reserved(wordset, rule)`** — This function will override the global reserved word set with the -one passed into the `wordset` parameter. This is useful for contextual keywords, such as `if` in JavaScript, which cannot -be used as a variable name in most contexts, but can be used as a property name. - -In addition to the `name` and `rules` fields, grammars have a few other optional public fields that influence the behavior -of the parser. Each of these fields is a function that accepts the grammar object (`$`) as its only parameter, like the -grammar rules themselves. These fields are: - -- **`extras`** — an array of tokens that may appear *anywhere* in the language. This is often used for whitespace and -comments. The default value of `extras` is to accept whitespace. To control whitespace explicitly, specify -`extras: $ => []` in your grammar. See the section on [using extras][extras] for more details. - -- **`inline`** — an array of rule names that should be automatically *removed* from the grammar by replacing all of their -usages with a copy of their definition. This is useful for rules that are used in multiple places but for which you *don't* -want to create syntax tree nodes at runtime. - -- **`conflicts`** — an array of arrays of rule names. Each inner array represents a set of rules that's involved in an -*LR(1) conflict* that is *intended to exist* in the grammar. When these conflicts occur at runtime, Tree-sitter will use -the GLR algorithm to explore all the possible interpretations. If *multiple* parses end up succeeding, Tree-sitter will -pick the subtree whose corresponding rule has the highest total *dynamic precedence*. - -- **`externals`** — an array of token names which can be returned by an -[*external scanner*][external-scanners]. External scanners allow you to write custom C code which runs during the lexing -process to handle lexical rules (e.g. Python's indentation tokens) that cannot be described by regular expressions. - -- **`precedences`** — an array of arrays of strings, where each array of strings defines named precedence levels in descending -order. These names can be used in the `prec` functions to define precedence relative only to other names in the array, rather -than globally. Can only be used with parse precedence, not lexical precedence. - -- **`word`** — the name of a token that will match keywords to the -[keyword extraction][keyword-extraction] optimization. - -- **`supertypes`** — an array of rule names which should be considered to be 'supertypes' in the generated -[*node types* file][static-node-types-supertypes]. Supertype rules are automatically hidden from the parse tree, regardless -of whether their names start with an underscore. The main use case for supertypes is to group together multiple different -kinds of nodes under a single abstract category, such as "expression" or "declaration". See the section on [`using supertypes`][supertypes] -for more details. - -- **`reserved`** — similar in structure to the main `rules` property, an object of reserved word sets associated with an -array of reserved rules. The reserved rule in the array must be a terminal token meaning it must be a string, regex, token, -or terminal rule. The reserved rule must also exist and be used in the grammar, specifying arbitrary tokens will not work. -The *first* reserved word set in the object is the global word set, meaning it applies to every rule in every parse state. -However, certain keywords are contextual, depending on the rule. For example, in JavaScript, keywords are typically not -allowed as ordinary variables, however, they *can* be used as a property name. In this situation, the `reserved` function -would be used, and the word set to pass in would be the name of the word set that is declared in the `reserved` object that -corresponds to an empty array, signifying *no* keywords are reserved. - -[bison-dprec]: https://www.gnu.org/software/bison/manual/html_node/Generalized-LR-Parsing.html -[ebnf]: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form -[external-scanners]: ./4-external-scanners.md -[extras]: ./3-writing-the-grammar.md#using-extras -[keyword-extraction]: ./3-writing-the-grammar.md#keyword-extraction -[lexical vs parse]: ./3-writing-the-grammar.md#lexical-precedence-vs-parse-precedence -[lr-conflict]: https://en.wikipedia.org/wiki/LR_parser#Conflicts_in_the_constructed_tables -[named-vs-anonymous-nodes]: ../using-parsers/2-basic-parsing.md#named-vs-anonymous-nodes -[rust regex]: https://docs.rs/regex/1.1.8/regex/#grouping-and-flags -[static-node-types]: ../using-parsers/6-static-node-types.md -[static-node-types-supertypes]: ../using-parsers/6-static-node-types.md#supertype-nodes -[supertypes]: ./3-writing-the-grammar.md#using-supertypes -[yacc-prec]: https://docs.oracle.com/cd/E19504-01/802-5880/6i9k05dh3/index.html diff --git a/docs/src/creating-parsers/3-writing-the-grammar.md b/docs/src/creating-parsers/3-writing-the-grammar.md deleted file mode 100644 index 5048ff5b..00000000 --- a/docs/src/creating-parsers/3-writing-the-grammar.md +++ /dev/null @@ -1,657 +0,0 @@ -# Writing the Grammar - -Writing a grammar requires creativity. There are an infinite number of CFGs (context-free grammars) that can be used to -describe any given language. To produce a good Tree-sitter parser, you need to create a grammar with two important properties: - -1. **An intuitive structure** — Tree-sitter's output is a [concrete syntax tree][cst]; each node in the tree corresponds -directly to a [terminal or non-terminal symbol][non-terminal] in the grammar. So to produce an easy-to-analyze tree, there -should be a direct correspondence between the symbols in your grammar and the recognizable constructs in the language. -This might seem obvious, but it is very different from the way that context-free grammars are often written in contexts -like [language specifications][language-spec] or [Yacc][yacc]/[Bison][bison] parsers. - -2. **A close adherence to LR(1)** — Tree-sitter is based on the [GLR parsing][glr-parsing] algorithm. This means that while -it can handle any context-free grammar, it works most efficiently with a class of context-free grammars called [LR(1) Grammars][lr-grammars]. -In this respect, Tree-sitter's grammars are similar to (but less restrictive than) [Yacc][yacc] and [Bison][bison] grammars, -but _different_ from [ANTLR grammars][antlr], [Parsing Expression Grammars][peg], or the [ambiguous grammars][ambiguous-grammar] -commonly used in language specifications. - -It's unlikely that you'll be able to satisfy these two properties just by translating an existing context-free grammar directly -into Tree-sitter's grammar format. There are a few kinds of adjustments that are often required. -The following sections will explain these adjustments in more depth. - -## The First Few Rules - -It's usually a good idea to find a formal specification for the language you're trying to parse. This specification will -most likely contain a context-free grammar. As you read through the rules of this CFG, you will probably discover a complex -and cyclic graph of relationships. It might be unclear how you should navigate this graph as you define your grammar. - -Although languages have very different constructs, their constructs can often be categorized in to similar groups like -_Declarations_, _Definitions_, _Statements_, _Expressions_, _Types_ and _Patterns_. In writing your grammar, a good first -step is to create just enough structure to include all of these basic _groups_ of symbols. For a language like Go, -you might start with something like this: - -```js -{ - // ... - - rules: { - source_file: $ => repeat($._definition), - - _definition: $ => choice( - $.function_definition - // TODO: other kinds of definitions - ), - - function_definition: $ => seq( - 'func', - $.identifier, - $.parameter_list, - $._type, - $.block - ), - - parameter_list: $ => seq( - '(', - // TODO: parameters - ')' - ), - - _type: $ => choice( - 'bool' - // TODO: other kinds of types - ), - - block: $ => seq( - '{', - repeat($._statement), - '}' - ), - - _statement: $ => choice( - $.return_statement - // TODO: other kinds of statements - ), - - return_statement: $ => seq( - 'return', - $.expression, - ';' - ), - - expression: $ => choice( - $.identifier, - $.number - // TODO: other kinds of expressions - ), - - identifier: $ => /[a-z]+/, - - number: $ => /\d+/ - } -} -``` - -One important fact to know up front is that the start rule for the grammar is the first property in the `rules` object. -In the example above, that would correspond to `source_file`, but it can be named anything. - -Some details of this grammar will be explained in more depth later on, but if you focus on the `TODO` comments, you can -see that the overall strategy is _breadth-first_. Notably, this initial skeleton does not need to directly match an exact -subset of the context-free grammar in the language specification. It just needs to touch on the major groupings of rules -in as simple and obvious a way as possible. - -With this structure in place, you can now freely decide what part of the grammar to flesh out next. For example, you might -decide to start with _types_. One-by-one, you could define the rules for writing basic types and composing them into more -complex types: - -```js -{ - // ... - - _type: $ => choice( - $.primitive_type, - $.array_type, - $.pointer_type - ), - - primitive_type: $ => choice( - 'bool', - 'int' - ), - - array_type: $ => seq( - '[', - ']', - $._type - ), - - pointer_type: $ => seq( - '*', - $._type - ) -} -``` - -After developing the _type_ sublanguage a bit further, you might decide to switch to working on _statements_ or _expressions_ -instead. It's often useful to check your progress by trying to parse some real code using `tree-sitter parse`. - -**And remember to add tests for each rule in your `test/corpus` folder!** - -## Structuring Rules Well - -Imagine that you were just starting work on the [Tree-sitter JavaScript parser][tree-sitter-javascript]. Naively, you might -try to directly mirror the structure of the [ECMAScript Language Spec][ecmascript-spec]. To illustrate the problem with -this approach, consider the following line of code: - -```js -return x + y; -``` - -According to the specification, this line is a `ReturnStatement`, the fragment `x + y` is an `AdditiveExpression`, -and `x` and `y` are both `IdentifierReferences`. The relationship between these constructs is captured by a complex series -of production rules: - -```text -ReturnStatement -> 'return' Expression -Expression -> AssignmentExpression -AssignmentExpression -> ConditionalExpression -ConditionalExpression -> LogicalORExpression -LogicalORExpression -> LogicalANDExpression -LogicalANDExpression -> BitwiseORExpression -BitwiseORExpression -> BitwiseXORExpression -BitwiseXORExpression -> BitwiseANDExpression -BitwiseANDExpression -> EqualityExpression -EqualityExpression -> RelationalExpression -RelationalExpression -> ShiftExpression -ShiftExpression -> AdditiveExpression -AdditiveExpression -> MultiplicativeExpression -MultiplicativeExpression -> ExponentiationExpression -ExponentiationExpression -> UnaryExpression -UnaryExpression -> UpdateExpression -UpdateExpression -> LeftHandSideExpression -LeftHandSideExpression -> NewExpression -NewExpression -> MemberExpression -MemberExpression -> PrimaryExpression -PrimaryExpression -> IdentifierReference -``` - -The language spec encodes the twenty different precedence levels of JavaScript expressions using twenty levels of indirection -between `IdentifierReference` and `Expression`. If we were to create a concrete syntax tree representing this statement -according to the language spec, it would have twenty levels of nesting, and it would contain nodes with names like `BitwiseXORExpression`, -which are unrelated to the actual code. - -## Standard Rule Names - -Tree-sitter places no restrictions on how to name the rules of your grammar. It can be helpful, however, to follow certain -conventions used by many other established grammars in the ecosystem. Some of these well-established patterns are listed -below: - -- `source_file`: Represents an entire source file, this rule is commonly used as the root node for a grammar, -- `expression`/`statement`: Used to represent statements and expressions for a given language. Commonly defined as a choice -between several more specific sub-expression/sub-statement rules. -- `block`: Used as the parent node for block scopes, with its children representing the block's contents. -- `type`: Represents the types of a language such as `int`, `char`, and `void`. -- `identifier`: Used for constructs like variable names, function arguments, and object fields; this rule is commonly used -as the `word` token in grammars. -- `string`: Used to represent `"string literals"`. -- `comment`: Used to represent comments, this rule is commonly used as an `extra`. - -## Using Precedence - -To produce a readable syntax tree, we'd like to model JavaScript expressions using a much flatter structure like this: - -```js -{ - // ... - - expression: $ => choice( - $.identifier, - $.unary_expression, - $.binary_expression, - // ... - ), - - unary_expression: $ => choice( - seq('-', $.expression), - seq('!', $.expression), - // ... - ), - - binary_expression: $ => choice( - seq($.expression, '*', $.expression), - seq($.expression, '+', $.expression), - // ... - ), -} -``` - -Of course, this flat structure is highly ambiguous. If we try to generate a parser, Tree-sitter gives us an error message: - -```text -Error: Unresolved conflict for symbol sequence: - - '-' _expression • '*' … - -Possible interpretations: - - 1: '-' (binary_expression _expression • '*' _expression) - 2: (unary_expression '-' _expression) • '*' … - -Possible resolutions: - - 1: Specify a higher precedence in `binary_expression` than in the other rules. - 2: Specify a higher precedence in `unary_expression` than in the other rules. - 3: Specify a left or right associativity in `unary_expression` - 4: Add a conflict for these rules: `binary_expression` `unary_expression` -``` - -```admonish hint -The • character in the error message indicates where exactly during -parsing the conflict occurs, or in other words, where the parser is encountering -ambiguity. -``` - -For an expression like `-a * b`, it's not clear whether the `-` operator applies to the `a * b` or just to the `a`. This -is where the `prec` function [described in the previous page][grammar dsl] comes into play. By wrapping a rule with `prec`, -we can indicate that certain sequence of symbols should _bind to each other more tightly_ than others. For example, the -`'-', $.expression` sequence in `unary_expression` should bind more tightly than the `$.expression, '+', $.expression` -sequence in `binary_expression`: - -```js -{ - // ... - - unary_expression: $ => - prec( - 2, - choice( - seq("-", $.expression), - seq("!", $.expression), - // ... - ), - ); -} -``` - -## Using Associativity - -Applying a higher precedence in `unary_expression` fixes that conflict, but there is still another conflict: - -```text -Error: Unresolved conflict for symbol sequence: - - _expression '*' _expression • '*' … - -Possible interpretations: - - 1: _expression '*' (binary_expression _expression • '*' _expression) - 2: (binary_expression _expression '*' _expression) • '*' … - -Possible resolutions: - - 1: Specify a left or right associativity in `binary_expression` - 2: Add a conflict for these rules: `binary_expression` -``` - -For an expression like `a * b * c`, it's not clear whether we mean `a * (b * c)` or `(a * b) * c`. -This is where `prec.left` and `prec.right` come into use. We want to select the second interpretation, so we use `prec.left`. - -```js -{ - // ... - - binary_expression: $ => choice( - prec.left(2, seq($.expression, '*', $.expression)), - prec.left(1, seq($.expression, '+', $.expression)), - // ... - ), -} -``` - -## Using Conflicts - -Sometimes, conflicts are actually desirable. In our JavaScript grammar, expressions and patterns can create intentional -ambiguity. A construct like `[x, y]` could be legitimately parsed as both an array literal (like in `let a = [x, y]`) or -as a destructuring pattern (like in `let [x, y] = arr`). - -```js -export default grammar({ - name: "javascript", - - rules: { - expression: $ => choice( - $.identifier, - $.array, - $.pattern, - ), - - array: $ => seq( - "[", - optional(seq( - $.expression, repeat(seq(",", $.expression)) - )), - "]" - ), - - array_pattern: $ => seq( - "[", - optional(seq( - $.pattern, repeat(seq(",", $.pattern)) - )), - "]" - ), - - pattern: $ => choice( - $.identifier, - $.array_pattern, - ), - }, -}) -``` - -In such cases, we want the parser to explore both possibilities by explicitly declaring this ambiguity: - -```js -{ - name: "javascript", - - conflicts: $ => [ - [$.array, $.array_pattern], - ], - - rules: { - // ... - }, -} -``` - -```admonish note -The example is a bit contrived for the purpose of illustrating the usage of conflicts. The actual JavaScript grammar isn't -structured like that, but this conflict is actually present in the -[Tree-sitter JavaScript grammar](https://github.com/tree-sitter/tree-sitter-javascript/blob/108b2d4d17a04356a340aea809e4dd5b801eb40d/grammar.js#L100). -``` - -## Hiding Rules - -You may have noticed in the above examples that some grammar rule name like `_expression` and `_type` began with an underscore. -Starting a rule's name with an underscore causes the rule to be _hidden_ in the syntax tree. This is useful for rules like -`_expression` in the grammars above, which always just wrap a single child node. If these nodes were not hidden, they would -add substantial depth and noise to the syntax tree without making it any easier to understand. - -## Using Fields - -Often, it's easier to analyze a syntax node if you can refer to its children by _name_ instead of by their position in an -ordered list. Tree-sitter grammars support this using the `field` function. This function allows you to assign unique names -to some or all of a node's children: - -```js -function_definition: $ => - seq( - "func", - field("name", $.identifier), - field("parameters", $.parameter_list), - field("return_type", $._type), - field("body", $.block), - ); -``` - -Adding fields like this allows you to retrieve nodes using the [field APIs][field-names-section]. - -## Using Extras - -Extras are tokens that can appear anywhere in the grammar, without being explicitly mentioned in a rule. This is useful -for things like whitespace and comments, which can appear between any two tokens in most programming languages. To define -an extra, you can use the `extras` function: - -```js -module.exports = grammar({ - name: "my_language", - - extras: ($) => [ - /\s/, // whitespace - $.comment, - ], - - rules: { - comment: ($) => - token( - choice(seq("//", /.*/), seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/")), - ), - }, -}); -``` - -```admonish warning -When adding more complicated tokens to `extras`, it's preferable to associate the pattern -with a rule. This way, you avoid the lexer inlining this pattern in a bunch of spots, -which can dramatically reduce the parser size. -``` - -For example, instead of defining the `comment` token inline in `extras`: - -```js -// ❌ Less preferable - -const comment = token( - choice(seq("//", /.*/), seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/")), -); - -module.exports = grammar({ - name: "my_language", - extras: ($) => [ - /\s/, // whitespace - comment, - ], - rules: { - // ... - }, -}); -``` - -We can define it as a rule and then reference it in `extras`: - -```js -// ✅ More preferable - -module.exports = grammar({ - name: "my_language", - - extras: ($) => [ - /\s/, // whitespace - $.comment, - ], - - rules: { - // ... - - comment: ($) => - token( - choice(seq("//", /.*/), seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/")), - ), - }, -}); -``` - -```admonish note -Tree-sitter intentionally simplifies the whitespace character class, `\s`, to `[ \t\n\r]` as a performance -optimization. This is because typically users do not require the full Unicode definition of whitespace. -``` - -## Using Supertypes - -Some rules in your grammar will represent abstract categories of syntax nodes, such as "expression", "type", or "declaration". -These rules are often defined as simple choices between several other rules. For example, in the JavaScript grammar, the -`_expression` rule is defined as a choice between many different kinds of expressions: - -```js -expression: $ => choice( - $.identifier, - $.unary_expression, - $.binary_expression, - $.call_expression, - $.member_expression, - // ... -), -``` - -By default, Tree-sitter will generate a visible node type for each of these abstract category rules, which can lead to -unnecessarily deep and complex syntax trees. To avoid this, you can add these abstract category rules to the grammar's `supertypes` -definition. Tree-sitter will then treat these rules as _supertypes_, and will not generate visible node types for them in -the syntax tree. - -```js -module.exports = grammar({ - name: "javascript", - - supertypes: $ => [ - $.expression, - ], - - rules: { - expression: $ => choice( - $.identifier, - // ... - ), - - // ... - }, -}); -_ -``` - -Although supertype rules are hidden from the syntax tree, they can still be used in queries. See the chapter on -[Query Syntax][query syntax] for more information. - -# Lexical Analysis - -Tree-sitter's parsing process is divided into two phases: parsing (which is described above) and [lexing][lexing] — the -process of grouping individual characters into the language's fundamental _tokens_. There are a few important things to -know about how Tree-sitter's lexing works. - -## Conflicting Tokens - -Grammars often contain multiple tokens that can match the same characters. For example, a grammar might contain the tokens -(`"if"` and `/[a-z]+/`). Tree-sitter differentiates between these conflicting tokens in a few ways. - -1. **Context-aware Lexing** — Tree-sitter performs lexing on-demand, during the parsing process. At any given position -in a source document, the lexer only tries to recognize tokens that are _valid_ at that position in the document. - -2. **Lexical Precedence** — When the precedence functions described [in the previous page][grammar dsl] are used _within_ -the `token` function, the given explicit precedence values serve as instructions to the lexer. If there are two valid tokens -that match the characters at a given position in the document, Tree-sitter will select the one with the higher precedence. - -3. **Match Length** — If multiple valid tokens with the same precedence match the characters at a given position in a document, -Tree-sitter will select the token that matches the [longest sequence of characters][longest-match]. - -4. **Match Specificity** — If there are two valid tokens with the same precedence, and they both match the same number -of characters, Tree-sitter will prefer a token that is specified in the grammar as a `String` over a token specified as -a `RegExp`. - -5. **Rule Order** — If none of the above criteria can be used to select one token over another, Tree-sitter will prefer -the token that appears earlier in the grammar. - -If there is an external scanner it may have [an additional impact][external scanner] over regular tokens -defined in the grammar. - -## Lexical Precedence vs. Parse Precedence - -One common mistake involves not distinguishing _lexical precedence_ from _parse precedence_. Parse precedence determines -which rule is chosen to interpret a given sequence of tokens. _Lexical precedence_ determines which token is chosen to interpret -at a given position of text, and it is a lower-level operation that is done first. The above list fully captures Tree-sitter's -lexical precedence rules, and you will probably refer back to this section of the documentation more often than any other. -Most of the time when you really get stuck, you're dealing with a lexical precedence problem. Pay particular attention to -the difference in meaning between using `prec` inside the `token` function versus outside it. The _lexical precedence_ syntax, -as mentioned in the previous page, is `token(prec(N, ...))`. - -## Keywords - -Many languages have a set of _keyword_ tokens (e.g. `if`, `for`, `return`), as well as a more general token (e.g. `identifier`) -that matches any word, including many of the keyword strings. For example, JavaScript has a keyword `instanceof`, which -is used as a binary operator, like this: - -```js -if (a instanceof Something) b(); -``` - -The following, however, is not valid JavaScript: - -```js -if (a instanceofSomething) b(); -``` - -A keyword like `instanceof` cannot be followed immediately by another letter, because then it would be tokenized as an `identifier`, -**even though an identifier is not valid at that position**. Because Tree-sitter uses context-aware lexing, as described -[above](#conflicting-tokens), it would not normally impose this restriction. By default, Tree-sitter would recognize `instanceofSomething` -as two separate tokens: the `instanceof` keyword followed by an `identifier`. - -## Keyword Extraction - -Fortunately, Tree-sitter has a feature that allows you to fix this, so that you can match the behavior of other standard -parsers: the `word` token. If you specify a `word` token in your grammar, Tree-sitter will find the set of _keyword_ tokens -that match strings also matched by the `word` token. Then, during lexing, instead of matching each of these keywords individually, -Tree-sitter will match the keywords via a two-step process where it _first_ matches the `word` token. - -For example, suppose we added `identifier` as the `word` token in our JavaScript grammar: - -```js -grammar({ - name: "javascript", - - word: $ => $.identifier, - - rules: { - expression: $ => - choice( - $.identifier, - $.unary_expression, - $.binary_expression, - // ... - ), - - binary_expression: $ => - choice( - prec.left(1, seq($.expression, "instanceof", $.expression)), - // ... - ), - - unary_expression: $ => - choice( - prec.left(2, seq("typeof", $.expression)), - // ... - ), - - identifier: $ => /[a-z_]+/, - }, -}); -``` - -Tree-sitter would identify `typeof` and `instanceof` as keywords. Then, when parsing the invalid code above, rather than -scanning for the `instanceof` token individually, it would scan for an `identifier` first, and find `instanceofSomething`. -It would then correctly recognize the code as invalid. - -Aside from improving error detection, keyword extraction also has performance benefits. It allows Tree-sitter to generate -a smaller, simpler lexing function, which means that **the parser will compile much more quickly**. - -```admonish note -The word token must be a unique token that is not reused by another rule. If you want to have a word token used in a -rule that's called something else, you should just alias the word token instead, like how the Rust grammar does it -here -``` - -[ambiguous-grammar]: https://en.wikipedia.org/wiki/Ambiguous_grammar -[antlr]: https://www.antlr.org -[bison]: https://en.wikipedia.org/wiki/GNU_bison -[cst]: https://en.wikipedia.org/wiki/Parse_tree -[ecmascript-spec]: https://262.ecma-international.org/6.0/ -[external scanner]: ./4-external-scanners.md#other-external-scanner-details -[glr-parsing]: https://en.wikipedia.org/wiki/GLR_parser -[grammar dsl]: ./2-the-grammar-dsl.md -[language-spec]: https://en.wikipedia.org/wiki/Programming_language_specification -[lexing]: https://en.wikipedia.org/wiki/Lexical_analysis -[longest-match]: https://en.wikipedia.org/wiki/Maximal_munch -[lr-grammars]: https://en.wikipedia.org/wiki/LR_parser -[field-names-section]: ../using-parsers/2-basic-parsing.md#node-field-names -[non-terminal]: https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols -[peg]: https://en.wikipedia.org/wiki/Parsing_expression_grammar -[query syntax]: ../using-parsers/queries/1-syntax.md#supertype-nodes -[tree-sitter-javascript]: https://github.com/tree-sitter/tree-sitter-javascript -[yacc]: https://en.wikipedia.org/wiki/Yacc diff --git a/docs/src/creating-parsers/4-external-scanners.md b/docs/src/creating-parsers/4-external-scanners.md deleted file mode 100644 index 6c89e221..00000000 --- a/docs/src/creating-parsers/4-external-scanners.md +++ /dev/null @@ -1,384 +0,0 @@ -# External Scanners - -Many languages have some tokens whose structure is impossible or inconvenient to describe with a regular expression. -Some examples: - -- [Indent and dedent][indent-tokens] tokens in Python -- [Heredocs][heredoc] in Bash and Ruby -- [Percent strings][percent-string] in Ruby - -Tree-sitter allows you to handle these kinds of tokens using _external scanners_. An external scanner is a set of C functions -that you, the grammar author, can write by hand to add custom logic for recognizing certain tokens. - -To use an external scanner, there are a few steps. First, add an `externals` section to your grammar. This section should -list the names of all of your external tokens. These names can then be used elsewhere in your grammar. - -```js -grammar({ - name: "my_language", - - externals: $ => [$.indent, $.dedent, $.newline], - - // ... -}); -``` - -Then, add another C source file to your project. Its path must be src/scanner.c for the CLI to recognize it. - -In this new source file, define an [`enum`][enum] type containing the names of all of your external tokens. The ordering -of this enum must match the order in your grammar's `externals` array; the actual names do not matter. - -```c -#include "tree_sitter/parser.h" -#include "tree_sitter/alloc.h" -#include "tree_sitter/array.h" - -enum TokenType { - INDENT, - DEDENT, - NEWLINE -} -``` - -Finally, you must define five functions with specific names, based on your language's name and five actions: -_create_, _destroy_, _serialize_, _deserialize_, and _scan_. - -## Create - -```c -void * tree_sitter_my_language_external_scanner_create() { - // ... -} -``` - -This function should create your scanner object. It will only be called once anytime your language is set on a parser. -Often, you will want to allocate memory on the heap and return a pointer to it. If your external scanner doesn't need to -maintain any state, it's ok to return `NULL`. - -## Destroy - -```c -void tree_sitter_my_language_external_scanner_destroy(void *payload) { - // ... -} -``` - -This function should free any memory used by your scanner. It is called once when a parser is deleted or assigned a different -language. It receives as an argument the same pointer that was returned from the _create_ function. If your _create_ function -didn't allocate any memory, this function can be a no-op. - -## Serialize - -```c -unsigned tree_sitter_my_language_external_scanner_serialize( - void *payload, - char *buffer -) { - // ... -} -``` - -This function should copy the complete state of your scanner into a given byte buffer, and return the number of bytes written. -The function is called every time the external scanner successfully recognizes a token. It receives a pointer to your scanner -and a pointer to a buffer. The maximum number of bytes that you can write is given by the `TREE_SITTER_SERIALIZATION_BUFFER_SIZE` -constant, defined in the `tree_sitter/parser.h` header file. - -The data that this function writes will ultimately be stored in the syntax tree so that the scanner can be restored to the -right state when handling edits or ambiguities. For your parser to work correctly, the `serialize` function must store its -entire state, and `deserialize` must restore the entire state. For good performance, you should design your scanner so that -its state can be serialized as quickly and compactly as possible. - -## Deserialize - -```c -void tree_sitter_my_language_external_scanner_deserialize( - void *payload, - const char *buffer, - unsigned length -) { - // ... -} -``` - -This function should _restore_ the state of your scanner based the bytes that were previously written by the `serialize` -function. It is called with a pointer to your scanner, a pointer to the buffer of bytes, and the number of bytes that should -be read. It is good practice to explicitly erase your scanner state variables at the start of this function, before restoring -their values from the byte buffer. - -## Scan - -Typically, one will - -- Call `lexer->advance` several times, if the characters are valid for the token being lexed. - -- Optionally, call `lexer->mark_end` to mark the end of the token, and "peek ahead" -to check if the next character (or set of characters) invalidates the token. - -- Set `lexer->result_symbol` to the token type. - -- Return `true` from the scanning function, indicating that a token was successfully lexed. - -Tree-sitter will then push resulting node to the parse stack, and the input position will remain where it reached at the -point `lexer->mark_end` was called. - -```c -bool tree_sitter_my_language_external_scanner_scan( - void *payload, - TSLexer *lexer, - const bool *valid_symbols -) { - // ... -} -``` - -The second parameter to this function is the lexer, of type `TSLexer`. The `TSLexer` struct has the following fields: - -- **`int32_t lookahead`** — The current next character in the input stream, represented as a 32-bit unicode code point. - -- **`TSSymbol result_symbol`** — The symbol that was recognized. Your scan function should _assign_ to this field one of -the values from the `TokenType` enum, described above. - -- **`void (*advance)(TSLexer *, bool skip)`** — A function for advancing to the next character. If you pass `true` for -the second argument, the current character will be treated as whitespace; whitespace won't be included in the text range -associated with tokens emitted by the external scanner. - -- **`void (*mark_end)(TSLexer *)`** — A function for marking the end of the recognized token. This allows matching tokens -that require multiple characters of lookahead. By default, (if you don't call `mark_end`), any character that you moved -past using the `advance` function will be included in the size of the token. But once you call `mark_end`, then any later -calls to `advance` will _not_ increase the size of the returned token. You can call `mark_end` multiple times to increase -the size of the token. - -- **`uint32_t (*get_column)(TSLexer *)`** — A function for querying the current column position of the lexer. It returns -the number of codepoints since the start of the current line. The codepoint position is recalculated on every call to this -function by reading from the start of the line. - -- **`bool (*is_at_included_range_start)(const TSLexer *)`** — A function for checking whether the parser has just skipped -some characters in the document. When parsing an embedded document using the `ts_parser_set_included_ranges` function -(described in the [multi-language document section][multi-language-section]), the scanner may want to apply some special -behavior when moving to a disjoint part of the document. For example, in [EJS documents][ejs], the JavaScript parser uses -this function to enable inserting automatic semicolon tokens in between the code directives, delimited by `<%` and `%>`. - -- **`bool (*eof)(const TSLexer *)`** — A function for determining whether the lexer is at the end of the file. The value -of `lookahead` will be `0` at the end of a file, but this function should be used instead of checking for that value because -the `0` or "NUL" value is also a valid character that could be present in the file being parsed. - -The third argument to the `scan` function is an array of booleans that indicates which of external tokens are expected by -the parser. You should only look for a given token if it is valid according to this array. At the same time, you cannot -backtrack, so you may need to combine certain pieces of logic. - -```c -if (valid_symbols[INDENT] || valid_symbols[DEDENT]) { - - // ... logic that is common to both `INDENT` and `DEDENT` - - if (valid_symbols[INDENT]) { - - // ... logic that is specific to `INDENT` - - lexer->result_symbol = INDENT; - return true; - } -} -``` - -## External Scanner Helpers - -### Allocator - -Instead of using libc's `malloc`, `calloc`, `realloc`, and `free`, you should use the versions prefixed with `ts_` from -`tree_sitter/alloc.h`. These macros can allow a potential consumer to override the default allocator with their own implementation, -but by default will use the libc functions. - -As a consumer of the tree-sitter core library as well as any parser libraries that might use allocations, you can enable -overriding the default allocator and have it use the same one as the library allocator, of which you can set with `ts_set_allocator`. -To enable this overriding in scanners, you must compile them with the `TREE_SITTER_REUSE_ALLOCATOR` macro defined, and tree-sitter -the library must be linked into your final app dynamically, since it needs to resolve the internal functions at runtime. -If you are compiling an executable binary that uses the core library, but want to load parsers dynamically at runtime, then -you will have to use a special linker flag on Unix. For non-Darwin systems, that would be `--dynamic-list` and for Darwin -systems, that would be `-exported_symbols_list`. The CLI does exactly this, so you can use it as a reference (check out -`cli/build.rs`). - -For example, assuming you wanted to allocate 100 bytes for your scanner, you'd do so like the following example: - -```c -#include "tree_sitter/parser.h" -#include "tree_sitter/alloc.h" - -// ... - -void* tree_sitter_my_language_external_scanner_create() { - return ts_calloc(100, 1); // or ts_malloc(100) -} - -// ... - -``` - -### Arrays - -If you need to use array-like types in your scanner, such as tracking a stack of indentations or tags, you should use the -array macros from `tree_sitter/array.h`. - -There are quite a few of them provided for you, but here's how you could get started tracking some . Check out the header -itself for more detailed documentation. - -```admonish attention -Do not use any of the array functions or macros that are prefixed with an underscore and have comments saying -that it is not what you are looking for. These are internal functions used as helpers by other macros that are public. -They are not meant to be used directly, nor are they what you want. -``` - -```c -#include "tree_sitter/parser.h" -#include "tree_sitter/array.h" - -enum TokenType { - INDENT, - DEDENT, - NEWLINE, - STRING, -} - -// Create the array in your create function - -void* tree_sitter_my_language_external_scanner_create() { - return ts_calloc(1, sizeof(Array(int))); - - // or if you want to zero out the memory yourself - - Array(int) *stack = ts_malloc(sizeof(Array(int))); - array_init(&stack); - return stack; -} - -bool tree_sitter_my_language_external_scanner_scan( - void *payload, - TSLexer *lexer, - const bool *valid_symbols -) { - Array(int) *stack = payload; - if (valid_symbols[INDENT]) { - array_push(stack, lexer->get_column(lexer)); - lexer->result_symbol = INDENT; - return true; - } - if (valid_symbols[DEDENT]) { - array_pop(stack); // this returns the popped element by value, but we don't need it - lexer->result_symbol = DEDENT; - return true; - } - - // we can also use an array on the stack to keep track of a string - - Array(char) next_string = array_new(); - - if (valid_symbols[STRING] && lexer->lookahead == '"') { - lexer->advance(lexer, false); - while (lexer->lookahead != '"' && lexer->lookahead != '\n' && !lexer->eof(lexer)) { - array_push(&next_string, lexer->lookahead); - lexer->advance(lexer, false); - } - - // assume we have some arbitrary constraint of not having more than 100 characters in a string - if (lexer->lookahead == '"' && next_string.size <= 100) { - lexer->advance(lexer, false); - lexer->result_symbol = STRING; - return true; - } - } - - return false; -} - -``` - -## Other External Scanner Details - -External scanners have priority over Tree-sitter's normal lexing process. When a token listed in the externals array is -valid at a given position, the external scanner is called first. This makes external scanners a powerful way to override -Tree-sitter's default lexing behavior, especially for cases that can't be handled with regular lexical rules, parsing, or -dynamic precedence. - -During error recovery, Tree-sitter's first step is to call the external scanner's scan function with all tokens marked as -valid. Your scanner should detect and handle this case appropriately. One simple approach is to add an unused "sentinel" -token at the end of your externals array: - -```js -{ - name: "my_language", - - externals: $ => [$.token1, $.token2, $.error_sentinel] - - // ... -} -``` - -You can then check if this sentinel token is marked valid to determine if Tree-sitter is in error recovery mode. - -If you would rather not handle the error recovery case explicitly, the easiest way to "opt-out" and let tree-sitter's internal -lexer handle it is to return `false` from your scan function when `valid_symbols` contains the error sentinel. - -```c -bool tree_sitter_my_language_external_scanner_scan( - void *payload, - TSLexer *lexer, - const bool *valid_symbols -) { - if (valid_symbols[ERROR_SENTINEL]) { - return false; - } - // ... -} -``` - -When you include literal keywords in the externals array, for example: - -```js -externals: $ => ['if', 'then', 'else'] -``` - -_those_ keywords will -be tokenized by the external scanner whenever they appear in the grammar. - -This is equivalent to declaring named tokens and aliasing them: - -```js -{ - name: "my_language", - - externals: $ => [$.if_keyword, $.then_keyword, $.else_keyword], - - rules: { - - // then using it in a rule like so: - if_statement: $ => seq(alias($.if_keyword, 'if'), ...), - - // ... - } -} -``` - -The tokenization process for external keywords works in two stages: - -1. The external scanner attempts to recognize the token first -2. If the scanner returns true and sets a token, that token is used -3. If the scanner returns false, Tree-sitter falls back to its internal lexer - -However, when you use rule references (like `$.if_keyword`) in the externals array without defining the corresponding rules -in the grammar, Tree-sitter cannot fall back to its internal lexer. In this case, the external scanner is solely responsible -for recognizing these tokens. - -```admonish danger -- External scanners can easily create infinite loops - -- Be extremely careful when emitting zero-width tokens - -- Always use the `eof` function when looping through characters -``` - -[ejs]: https://ejs.co -[enum]: https://en.wikipedia.org/wiki/Enumerated_type#C -[heredoc]: https://en.wikipedia.org/wiki/Here_document -[indent-tokens]: https://en.wikipedia.org/wiki/Off-side_rule -[multi-language-section]: ../using-parsers/3-advanced-parsing.md#multi-language-documents -[percent-string]: https://docs.ruby-lang.org/en/2.5.0/doc/syntax/literals_rdoc.html#label-Percent+Strings diff --git a/docs/src/creating-parsers/5-writing-tests.md b/docs/src/creating-parsers/5-writing-tests.md deleted file mode 100644 index 33155cca..00000000 --- a/docs/src/creating-parsers/5-writing-tests.md +++ /dev/null @@ -1,175 +0,0 @@ -# Writing Tests - -For each rule that you add to the grammar, you should first create a *test* that describes how the syntax trees should look -when parsing that rule. These tests are written using specially-formatted text files in the `test/corpus/` directory within -your parser's root folder. - -For example, you might have a file called `test/corpus/statements.txt` that contains a series of entries like this: - -```text -================== -Return statements -================== - -func x() int { - return 1; -} - ---- - -(source_file - (function_definition - (identifier) - (parameter_list) - (primitive_type) - (block - (return_statement (number))))) -``` - -* The **name** of each test is written between two lines containing only `=` (equal sign) characters. - -* Then the **input source code** is written, followed by a line containing three or more `-` (dash) characters. - -* Then, the **expected output syntax tree** is written as an [S-expression][s-exp]. The exact placement of whitespace in -the S-expression doesn't matter, but ideally the syntax tree should be legible. - -```admonish tip -The S-expression does not show syntax nodes like `func`, `(` and `;`, which are expressed as strings and regexes in the grammar. -It only shows the *named* nodes, as described in [this section][named-vs-anonymous-nodes] of the page on parser usage. -``` - - The expected output section can also *optionally* show the [*field names*][node-field-names] associated with each child - node. To include field names in your tests, you write a node's field name followed by a colon, before the node itself - in the S-expression: - -```query -(source_file - (function_definition - name: (identifier) - parameters: (parameter_list) - result: (primitive_type) - body: (block - (return_statement (number))))) -``` - -* If your language's syntax conflicts with the `===` and `---` test separators, you can optionally add an arbitrary identical -suffix (in the below example, `|||`) to disambiguate them: - -```text -==================||| -Basic module -==================||| - ----- MODULE Test ---- -increment(n) == n + 1 -==== - ----||| - -(source_file - (module (identifier) - (operator (identifier) - (parameter_list (identifier)) - (plus (identifier_ref) (number))))) -``` - -These tests are important. They serve as the parser's API documentation, and they can be run every time you change the grammar -to verify that everything still parses correctly. - -By default, the `tree-sitter test` command runs all the tests in your `test/corpus/` folder. To run a particular test, you -can use the `-i` flag: - -```sh -tree-sitter test -i 'Return statements' -``` - -The recommendation is to be comprehensive in adding tests. If it's a visible node, add it to a test file in your `test/corpus` -directory. It's typically a good idea to test all the permutations of each language construct. This increases test coverage, -but doubly acquaints readers with a way to examine expected outputs and understand the "edges" of a language. - -```admonish tip -After modifying the grammar, you can run `tree-sitter test -u` -to update all syntax trees in corpus files with current parser output. -``` - -## Attributes - -Tests can be annotated with a few `attributes`. Attributes must be put in the header, below the test name, and start with -a `:`. A couple of attributes also take in a parameter, which require the use of parenthesis. - -```admonish tip -If you'd like to supply in multiple parameters, e.g. to run tests on multiple platforms or to test multiple languages, -you can repeat the attribute on a new line. -``` - -The following attributes are available: - -* `:cst` - This attribute specifies that the expected output should be in the form of a CST instead of the normal S-expression. -This CST matches the format given by `parse --cst`. -* `:error` — This attribute will assert that the parse tree contains an error. It's useful to just validate that a certain -input is invalid without displaying the whole parse tree, as such you should omit the parse tree below the `---` line. -* `:fail-fast` — This attribute will stop the testing of additional cases if the test marked with this attribute fails. -* `:language(LANG)` — This attribute will run the tests using the parser for the specified language. This is useful for -multi-parser repos, such as XML and DTD, or Typescript and TSX. The default parser used will always be the first entry in -the `grammars` field in the `tree-sitter.json` config file, so having a way to pick a second or even third parser is useful. -* `:platform(PLATFORM)` — This attribute specifies the platform on which the test should run. It is useful to test platform-specific -behavior (e.g. Windows newlines are different from Unix). This attribute must match up with Rust's [`std::env::consts::OS`][constants]. -* `:skip` — This attribute will skip the test when running `tree-sitter test`. -This is useful when you want to temporarily disable running a test without deleting it. - -Examples using attributes: - -```text -========================= -Test that will be skipped -:skip -========================= - -int main() {} - -------------------------- - -==================================== -Test that will run on Linux or macOS - -:platform(linux) -:platform(macos) -==================================== - -int main() {} - ------------------------------------- - -======================================================================== -Test that expects an error, and will fail fast if there's no parse error -:fail-fast -:error -======================================================================== - -int main ( {} - ------------------------------------------------------------------------- - -================================================= -Test that will parse with both Typescript and TSX -:language(typescript) -:language(tsx) -================================================= - -console.log('Hello, world!'); - -------------------------------------------------- -``` - -### Automatic Compilation - -You might notice that the first time you run `tree-sitter test` after regenerating your parser, it takes some extra time. -This is because Tree-sitter automatically compiles your C code into a dynamically-loadable library. It recompiles your parser -as-needed whenever you update it by re-running `tree-sitter generate`, or whenever the [external scanner][external-scanners] -file is changed. - -[constants]: https://doc.rust-lang.org/std/env/consts/constant.OS.html -[external-scanners]: ./4-external-scanners.md -[node-field-names]: ../using-parsers/2-basic-parsing.md#node-field-names -[s-exp]: https://en.wikipedia.org/wiki/S-expression -[named-vs-anonymous-nodes]: ../using-parsers/2-basic-parsing.md#named-vs-anonymous-nodes diff --git a/docs/src/creating-parsers/6-publishing.md b/docs/src/creating-parsers/6-publishing.md deleted file mode 100644 index af961422..00000000 --- a/docs/src/creating-parsers/6-publishing.md +++ /dev/null @@ -1,49 +0,0 @@ -# Publishing your grammar - -Once you feel that your parser is in a stable working state for consumers to use, you can publish it to various registries. -It's strongly recommended to publish grammars to GitHub, [crates.io][crates.io] (Rust), [npm][npm] (JavaScript), and [PyPI][pypi] -(Python) to make it easier for others to find and use your grammar. - -If your grammar is hosted on GitHub, you can make use of our [reusable workflows][workflows] to handle the publishing process -for you. This action will automatically handle regenerating and publishing your grammar in CI, so long as you have the required -tokens setup for the various registries. For an example of this workflow in action, see the [Python grammar's GitHub][python-gh] - -## From start to finish - -To release a new grammar (or publish your first version), these are the steps you should follow: - -1. Bump your version to the desired version with `tree-sitter version`. For example, if you're releasing version `1.0.0` -of your grammar, you'd run `tree-sitter version 1.0.0`. -2. Commit the changes with `git commit -am "Release 1.0.0" (or however you like)` (ensure that your working directory is -clean). -3. Tag the commit with `git tag -- v1.0.0`. -4. Push the commit and tag with `git push --tags origin main` (assuming you're on the `main` branch, and `origin` is your -remote). -5. (optional) If you've set up the GitHub workflows for your grammar, the release will be automatically published to GitHub, -crates.io, npm, and PyPI. - -### Adhering to Semantic Versioning - -When releasing new versions of your grammar, it's important to adhere to [Semantic Versioning][semver]. This ensures that -consumers can predictably update their dependencies and that their existing tree-sitter integrations (queries, tree traversal -code, node type checks) will continue to work as expected when upgrading. - -1. Increment the major version when you make incompatible changes to the grammar's node types or structure -2. Increment the minor version when you add new node types or patterns while maintaining backward compatibility -3. Increment the patch version when you fix bugs without changing the grammar's structure - -For grammars in version 0.y.z (zero version), the usual semantic versioning rules are technically relaxed. However, if your -grammar already has users, it's recommended to treat version changes more conservatively: - -- Treat patch version (`z`) changes as if they were minor version changes -- Treat minor version (`y`) changes as if they were major version changes - -This helps maintain stability for existing users during the pre-1.0 phase. By following these versioning guidelines, you -ensure that downstream users can safely upgrade without their existing queries breaking. - -[crates.io]: https://crates.io -[npm]: https://www.npmjs.com -[pypi]: https://pypi.org -[python-gh]: https://github.com/tree-sitter/tree-sitter-python/blob/master/.github/workflows/publish.yml -[semver]: https://semver.org/ -[workflows]: https://github.com/tree-sitter/workflows diff --git a/docs/src/creating-parsers/index.md b/docs/src/creating-parsers/index.md deleted file mode 100644 index 4fb2c112..00000000 --- a/docs/src/creating-parsers/index.md +++ /dev/null @@ -1,4 +0,0 @@ -# Creating parsers - -Developing Tree-sitter grammars can have a difficult learning curve, but once you get the hang of it, it can be fun and -even zen-like. This document will help you to get started and to develop a useful mental model. diff --git a/docs/src/index.md b/docs/src/index.md deleted file mode 100644 index ee92966a..00000000 --- a/docs/src/index.md +++ /dev/null @@ -1,106 +0,0 @@ -
- Tree-sitter logo -
- -# Introduction - -Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source -file and efficiently update the syntax tree as the source file is edited. Tree-sitter aims to be: - -- **General** enough to parse any programming language -- **Fast** enough to parse on every keystroke in a text editor -- **Robust** enough to provide useful results even in the presence of syntax errors -- **Dependency-free** so that the runtime library (which is written in pure [C11](https://github.com/tree-sitter/tree-sitter/tree/master/lib)) -can be embedded in any application - -## Language Bindings - -There are bindings that allow Tree-sitter to be used from the following languages: - -### Official - -- [C#](https://github.com/tree-sitter/csharp-tree-sitter) -- [Go](https://github.com/tree-sitter/go-tree-sitter) -- [Haskell](https://github.com/tree-sitter/haskell-tree-sitter) -- [Java (JDK 22+)](https://github.com/tree-sitter/java-tree-sitter) -- [JavaScript (Node.js)](https://github.com/tree-sitter/node-tree-sitter) -- [JavaScript (Wasm)](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web) -- [Kotlin](https://github.com/tree-sitter/kotlin-tree-sitter) -- [Python](https://github.com/tree-sitter/py-tree-sitter) -- [Rust](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_rust) -- [Swift](https://github.com/tree-sitter/swift-tree-sitter) -- [Zig](https://github.com/tree-sitter/zig-tree-sitter) - -### Third-party - -- [C# (.NET)](https://github.com/zabbius/dotnet-tree-sitter) -- [C++](https://github.com/nsumner/cpp-tree-sitter) -- [Crystal](https://github.com/crystal-lang-tools/crystal-tree-sitter) -- [D](https://github.com/aminya/d-tree-sitter) -- [Delphi](https://github.com/modersohn/delphi-tree-sitter) -- [ELisp](https://www.gnu.org/software/emacs/manual/html_node/elisp/Parsing-Program-Source.html) -- [Go](https://github.com/alexaandru/go-tree-sitter-bare) -- [Guile](https://github.com/Z572/guile-ts) -- [Janet](https://github.com/sogaiu/janet-tree-sitter) -- [Java (JDK 8+)](https://github.com/bonede/tree-sitter-ng) -- [Java (JDK 11+)](https://github.com/seart-group/java-tree-sitter) -- [Julia](https://github.com/MichaelHatherly/TreeSitter.jl) -- [Lua](https://github.com/euclidianAce/ltreesitter) -- [Lua](https://github.com/xcb-xwii/lua-tree-sitter) -- [OCaml](https://github.com/semgrep/ocaml-tree-sitter-core) -- [Odin](https://github.com/laytan/odin-tree-sitter) -- [Perl](https://metacpan.org/pod/Text::Treesitter) -- [Pharo](https://github.com/Evref-BL/Pharo-Tree-Sitter) -- [PHP](https://github.com/soulseekah/ext-treesitter) -- [R](https://github.com/DavisVaughan/r-tree-sitter) -- [Ruby](https://github.com/Faveod/ruby-tree-sitter) - -_Keep in mind that some of the bindings may be incomplete or out of date._ - -## Parsers - -The following parsers can be found in the upstream organization: - -- [Agda](https://github.com/tree-sitter/tree-sitter-agda) -- [Bash](https://github.com/tree-sitter/tree-sitter-bash) -- [C](https://github.com/tree-sitter/tree-sitter-c) -- [C++](https://github.com/tree-sitter/tree-sitter-cpp) -- [C#](https://github.com/tree-sitter/tree-sitter-c-sharp) -- [CSS](https://github.com/tree-sitter/tree-sitter-css) -- [ERB / EJS](https://github.com/tree-sitter/tree-sitter-embedded-template) -- [Go](https://github.com/tree-sitter/tree-sitter-go) -- [Haskell](https://github.com/tree-sitter/tree-sitter-haskell) -- [HTML](https://github.com/tree-sitter/tree-sitter-html) -- [Java](https://github.com/tree-sitter/tree-sitter-java) -- [JavaScript](https://github.com/tree-sitter/tree-sitter-javascript) -- [JSDoc](https://github.com/tree-sitter/tree-sitter-jsdoc) -- [JSON](https://github.com/tree-sitter/tree-sitter-json) -- [Julia](https://github.com/tree-sitter/tree-sitter-julia) -- [OCaml](https://github.com/tree-sitter/tree-sitter-ocaml) -- [PHP](https://github.com/tree-sitter/tree-sitter-php) -- [Python](https://github.com/tree-sitter/tree-sitter-python) -- [Regex](https://github.com/tree-sitter/tree-sitter-regex) -- [Ruby](https://github.com/tree-sitter/tree-sitter-ruby) -- [Rust](https://github.com/tree-sitter/tree-sitter-rust) -- [Scala](https://github.com/tree-sitter/tree-sitter-scala) -- [TypeScript](https://github.com/tree-sitter/tree-sitter-typescript) -- [Verilog](https://github.com/tree-sitter/tree-sitter-verilog) - -A list of known parsers can be found in the [wiki](https://github.com/tree-sitter/tree-sitter/wiki/List-of-parsers). - -## Talks on Tree-sitter - -- [Strange Loop 2018](https://www.thestrangeloop.com/2018/tree-sitter---a-new-parsing-system-for-programming-tools.html) -- [FOSDEM 2018](https://www.youtube.com/watch?v=0CGzC_iss-8) -- [GitHub Universe 2017](https://www.youtube.com/watch?v=a1rC79DHpmY) - -## Underlying Research - -The design of Tree-sitter was greatly influenced by the following research papers: - -- [Practical Algorithms for Incremental Software Development Environments](https://www2.eecs.berkeley.edu/Pubs/TechRpts/1997/CSD-97-946.pdf) -- [Context Aware Scanning for Parsing Extensible Languages](https://www-users.cse.umn.edu/~evw/pubs/vanwyk07gpce/vanwyk07gpce.pdf) -- [Efficient and Flexible Incremental Parsing](https://harmonia.cs.berkeley.edu/papers/twagner-parsing.pdf) -- [Incremental Analysis of Real Programming Languages](https://harmonia.cs.berkeley.edu/papers/twagner-glr.pdf) -- [Error Detection and Recovery in LR Parsers](https://web.archive.org/web/20240302031213/https://what-when-how.com/compiler-writing/bottom-up-parsing-compiler-writing-part-13) -- [Error Recovery for LR Parsers](https://apps.dtic.mil/sti/pdfs/ADA043470.pdf) diff --git a/docs/src/using-parsers/1-getting-started.md b/docs/src/using-parsers/1-getting-started.md deleted file mode 100644 index 803cc3e8..00000000 --- a/docs/src/using-parsers/1-getting-started.md +++ /dev/null @@ -1,134 +0,0 @@ -# Getting Started - -## Building the Library - -To build the library on a POSIX system, just run `make` in the Tree-sitter directory. This will create a static library -called `libtree-sitter.a` as well as dynamic libraries. - -Alternatively, you can incorporate the library in a larger project's build system by adding one source file to the build. -This source file needs two directories to be in the include path when compiled: - -**source file:** - -- `tree-sitter/lib/src/lib.c` - -**include directories:** - -- `tree-sitter/lib/src` -- `tree-sitter/lib/include` - -## The Basic Objects - -There are four main types of objects involved when using Tree-sitter: languages, parsers, syntax trees, and syntax nodes. -In C, these are called `TSLanguage`, `TSParser`, `TSTree`, and `TSNode`. - -- A `TSLanguage` is an opaque object that defines how to parse a particular programming language. The code for each `TSLanguage` -is generated by Tree-sitter. Many languages are already available in separate git repositories within the -[Tree-sitter GitHub organization][ts org] and the [Tree-sitter grammars GitHub organization][tsg org]. -See [the next section][creating parsers] for how to create new languages. - -- A `TSParser` is a stateful object that can be assigned a `TSLanguage` and used to produce a `TSTree` based on some -source code. - -- A `TSTree` represents the syntax tree of an entire source code file. It contains `TSNode` instances that indicate the -structure of the source code. It can also be edited and used to produce a new `TSTree` in the event that the -source code changes. - -- A `TSNode` represents a single node in the syntax tree. It tracks its start and end positions in the source code, as -well as its relation to other nodes like its parent, siblings and children. - -## An Example Program - -Here's an example of a simple C program that uses the Tree-sitter [JSON parser][json]. - -```c -// Filename - test-json-parser.c - -#include -#include -#include -#include - -// Declare the `tree_sitter_json` function, which is -// implemented by the `tree-sitter-json` library. -const TSLanguage *tree_sitter_json(void); - -int main() { - // Create a parser. - TSParser *parser = ts_parser_new(); - - // Set the parser's language (JSON in this case). - ts_parser_set_language(parser, tree_sitter_json()); - - // Build a syntax tree based on source code stored in a string. - const char *source_code = "[1, null]"; - TSTree *tree = ts_parser_parse_string( - parser, - NULL, - source_code, - strlen(source_code) - ); - - // Get the root node of the syntax tree. - TSNode root_node = ts_tree_root_node(tree); - - // Get some child nodes. - TSNode array_node = ts_node_named_child(root_node, 0); - TSNode number_node = ts_node_named_child(array_node, 0); - - // Check that the nodes have the expected types. - assert(strcmp(ts_node_type(root_node), "document") == 0); - assert(strcmp(ts_node_type(array_node), "array") == 0); - assert(strcmp(ts_node_type(number_node), "number") == 0); - - // Check that the nodes have the expected child counts. - assert(ts_node_child_count(root_node) == 1); - assert(ts_node_child_count(array_node) == 5); - assert(ts_node_named_child_count(array_node) == 2); - assert(ts_node_child_count(number_node) == 0); - - // Print the syntax tree as an S-expression. - char *string = ts_node_string(root_node); - printf("Syntax tree: %s\n", string); - - // Free all of the heap-allocated memory. - free(string); - ts_tree_delete(tree); - ts_parser_delete(parser); - return 0; -} -``` - -This program requires three components to build: - -1. The Tree-sitter C API from `tree-sitter/api.h` (requiring `tree-sitter/lib/include` in our include path) -2. The Tree-sitter library (`libtree-sitter.a`) -3. The JSON grammar's source code, which we compile directly into the binary - -```sh -clang \ - -I tree-sitter/lib/include \ - test-json-parser.c \ - tree-sitter-json/src/parser.c \ - tree-sitter/libtree-sitter.a \ - -o test-json-parser -./test-json-parser -``` - -When using dynamic linking, you'll need to ensure the shared library is discoverable through `LD_LIBRARY_PATH` or your system's -equivalent environment variable. Here's how to compile with dynamic linking: - -```sh -clang \ - -I tree-sitter/lib/include \ - test-json-parser.c \ - tree-sitter-json/src/parser.c \ - -ltree-sitter \ - -o test-json-parser -./test-json-parser -``` - -[creating parsers]: ../creating-parsers/index.md -[json]: https://github.com/tree-sitter/tree-sitter-json -[ts org]: https://github.com/tree-sitter -[tsg org]: https://github.com/tree-sitter-grammars diff --git a/docs/src/using-parsers/2-basic-parsing.md b/docs/src/using-parsers/2-basic-parsing.md deleted file mode 100644 index 8c425d6b..00000000 --- a/docs/src/using-parsers/2-basic-parsing.md +++ /dev/null @@ -1,197 +0,0 @@ -# Basic Parsing - -## Providing the Code - -In the example on the previous page, we parsed source code stored in a simple string using the `ts_parser_parse_string` -function: - -```c -TSTree *ts_parser_parse_string( - TSParser *self, - const TSTree *old_tree, - const char *string, - uint32_t length -); -``` - -You may want to parse source code that's stored in a custom data structure, like a [piece table][piece table] or a [rope][rope]. -In this case, you can use the more general `ts_parser_parse` function: - -```c -TSTree *ts_parser_parse( - TSParser *self, - const TSTree *old_tree, - TSInput input -); -``` - -The `TSInput` structure lets you provide your own function for reading a chunk of text at a given byte offset and row/column -position. The function can return text encoded in either UTF-8 or UTF-16. This interface allows you to efficiently parse -text that is stored in your own data structure. - -```c -typedef struct { - void *payload; - const char *(*read)( - void *payload, - uint32_t byte_offset, - TSPoint position, - uint32_t *bytes_read - ); - TSInputEncoding encoding; - TSDecodeFunction decode; -} TSInput; -``` - -If you want to decode text that is not encoded in UTF-8 or UTF-16, you can set the `decode` field of the input to your function -that will decode text. The signature of the `TSDecodeFunction` is as follows: - -```c -typedef uint32_t (*TSDecodeFunction)( - const uint8_t *string, - uint32_t length, - int32_t *code_point -); -``` - -```admonish attention -The `TSInputEncoding` must be set to `TSInputEncodingCustom` for the `decode` function to be called. -``` - -The `string` argument is a pointer to the text to decode, which comes from the `read` function, and the `length` argument -is the length of the `string`. The `code_point` argument is a pointer to an integer that represents the decoded code point, -and should be written to in your `decode` callback. The function should return the number of bytes decoded. - -## Syntax Nodes - -Tree-sitter provides a [DOM][dom]-style interface for inspecting syntax trees. -A syntax node's _type_ is a string that indicates which grammar rule the node represents. - -```c -const char *ts_node_type(TSNode); -``` - -Syntax nodes store their position in the source code both in raw bytes and row/column -coordinates. In a point, rows and columns are zero-based. The `row` field represents -the number of newlines before a given position, while `column` represents the number -of bytes between the position and beginning of the line. - -```c -uint32_t ts_node_start_byte(TSNode); -uint32_t ts_node_end_byte(TSNode); -typedef struct { - uint32_t row; - uint32_t column; -} TSPoint; -TSPoint ts_node_start_point(TSNode); -TSPoint ts_node_end_point(TSNode); -``` - -```admonish note -A *newline* is considered to be a single line feed (`\n`) character. -``` - -## Retrieving Nodes - -Every tree has a _root node_: - -```c -TSNode ts_tree_root_node(const TSTree *); -``` - -Once you have a node, you can access the node's children: - -```c -uint32_t ts_node_child_count(TSNode); -TSNode ts_node_child(TSNode, uint32_t); -``` - -You can also access its siblings and parent: - -```c -TSNode ts_node_next_sibling(TSNode); -TSNode ts_node_prev_sibling(TSNode); -TSNode ts_node_parent(TSNode); -``` - -These methods may all return a _null node_ to indicate, for example, that a node does not _have_ a next sibling. -You can check if a node is null: - -```c -bool ts_node_is_null(TSNode); -``` - -## Named vs Anonymous Nodes - -Tree-sitter produces [_concrete_ syntax trees][cst] — trees that contain nodes for -every individual token in the source code, including things like commas and parentheses. This is important for use-cases -that deal with individual tokens, like [syntax highlighting][syntax highlighting]. But some -types of code analysis are easier to perform using an [_abstract_ syntax tree][ast] — a tree in which the less important -details have been removed. Tree-sitter's trees support these use cases by making a distinction between -_named_ and _anonymous_ nodes. - -Consider a grammar rule like this: - -```js -if_statement: $ => seq("if", "(", $._expression, ")", $._statement); -``` - -A syntax node representing an `if_statement` in this language would have 5 children: the condition expression, the body -statement, as well as the `if`, `(`, and `)` tokens. The expression and the statement would be marked as _named_ nodes, -because they have been given explicit names in the grammar. But the `if`, `(`, and `)` nodes would _not_ be named nodes, -because they are represented in the grammar as simple strings. - -You can check whether any given node is named: - -```c -bool ts_node_is_named(TSNode); -``` - -When traversing the tree, you can also choose to skip over anonymous nodes by using the `_named_` variants of all of the -methods described above: - -```c -TSNode ts_node_named_child(TSNode, uint32_t); -uint32_t ts_node_named_child_count(TSNode); -TSNode ts_node_next_named_sibling(TSNode); -TSNode ts_node_prev_named_sibling(TSNode); -``` - -If you use this group of methods, the syntax tree functions much like an abstract syntax tree. - -## Node Field Names - -To make syntax nodes easier to analyze, many grammars assign unique _field names_ to particular child nodes. -In the [creating parsers][using fields] section, it's explained how to do this in your own grammars. If a syntax node has -fields, you can access its children using their field name: - -```c -TSNode ts_node_child_by_field_name( - TSNode self, - const char *field_name, - uint32_t field_name_length -); -``` - -Fields also have numeric ids that you can use, if you want to avoid repeated string comparisons. You can convert between -strings and ids using the `TSLanguage`: - -```c -uint32_t ts_language_field_count(const TSLanguage *); -const char *ts_language_field_name_for_id(const TSLanguage *, TSFieldId); -TSFieldId ts_language_field_id_for_name(const TSLanguage *, const char *, uint32_t); -``` - -The field ids can be used in place of the name: - -```c -TSNode ts_node_child_by_field_id(TSNode, TSFieldId); -``` - -[ast]: https://en.wikipedia.org/wiki/Abstract_syntax_tree -[cst]: https://en.wikipedia.org/wiki/Parse_tree -[dom]: https://en.wikipedia.org/wiki/Document_Object_Model -[piece table]: -[rope]: -[syntax highlighting]: https://en.wikipedia.org/wiki/Syntax_highlighting -[using fields]: ../creating-parsers/3-writing-the-grammar.md#using-fields diff --git a/docs/src/using-parsers/3-advanced-parsing.md b/docs/src/using-parsers/3-advanced-parsing.md deleted file mode 100644 index c1c92e24..00000000 --- a/docs/src/using-parsers/3-advanced-parsing.md +++ /dev/null @@ -1,164 +0,0 @@ -# Advanced Parsing - -## Editing - -In applications like text editors, you often need to re-parse a file after its source code has changed. Tree-sitter is designed -to support this use case efficiently. There are two steps required. First, you must _edit_ the syntax tree, which adjusts -the ranges of its nodes so that they stay in sync with the code. - -```c -typedef struct { - uint32_t start_byte; - uint32_t old_end_byte; - uint32_t new_end_byte; - TSPoint start_point; - TSPoint old_end_point; - TSPoint new_end_point; -} TSInputEdit; - -void ts_tree_edit(TSTree *, const TSInputEdit *); -``` - -Then, you can call `ts_parser_parse` again, passing in the old tree. This will create a new tree that internally shares -structure with the old tree. - -When you edit a syntax tree, the positions of its nodes will change. If you have stored any `TSNode` instances outside of -the `TSTree`, you must update their positions separately, using the same `TSInputEdit` value, in order to update their -cached positions. - -```c -void ts_node_edit(TSNode *, const TSInputEdit *); -``` - -This `ts_node_edit` function is _only_ needed in the case where you have retrieved `TSNode` instances _before_ editing the -tree, and then _after_ editing the tree, you want to continue to use those specific node instances. Often, you'll just want -to re-fetch nodes from the edited tree, in which case `ts_node_edit` is not needed. - -## Multi-language Documents - -Sometimes, different parts of a file may be written in different languages. For example, templating languages like [EJS][ejs] -and [ERB][erb] allow you to generate HTML by writing a mixture of HTML and another language like JavaScript or Ruby. - -Tree-sitter handles these types of documents by allowing you to create a syntax tree based on the text in certain -_ranges_ of a file. - -```c -typedef struct { - TSPoint start_point; - TSPoint end_point; - uint32_t start_byte; - uint32_t end_byte; -} TSRange; - -void ts_parser_set_included_ranges( - TSParser *self, - const TSRange *ranges, - uint32_t range_count -); -``` - -For example, consider this ERB document: - -```erb -
    - <% people.each do |person| %> -
  • <%= person.name %>
  • - <% end %> -
-``` - -Conceptually, it can be represented by three syntax trees with overlapping ranges: an ERB syntax tree, a Ruby syntax tree, -and an HTML syntax tree. You could generate these syntax trees with the following code: - -```c -#include -#include - -// These functions are each implemented in their own repo. -const TSLanguage *tree_sitter_embedded_template(void); -const TSLanguage *tree_sitter_html(void); -const TSLanguage *tree_sitter_ruby(void); - -int main(int argc, const char **argv) { - const char *text = argv[1]; - unsigned len = strlen(text); - - // Parse the entire text as ERB. - TSParser *parser = ts_parser_new(); - ts_parser_set_language(parser, tree_sitter_embedded_template()); - TSTree *erb_tree = ts_parser_parse_string(parser, NULL, text, len); - TSNode erb_root_node = ts_tree_root_node(erb_tree); - - // In the ERB syntax tree, find the ranges of the `content` nodes, - // which represent the underlying HTML, and the `code` nodes, which - // represent the interpolated Ruby. - TSRange html_ranges[10]; - TSRange ruby_ranges[10]; - unsigned html_range_count = 0; - unsigned ruby_range_count = 0; - unsigned child_count = ts_node_child_count(erb_root_node); - - for (unsigned i = 0; i < child_count; i++) { - TSNode node = ts_node_child(erb_root_node, i); - if (strcmp(ts_node_type(node), "content") == 0) { - html_ranges[html_range_count++] = (TSRange) { - ts_node_start_point(node), - ts_node_end_point(node), - ts_node_start_byte(node), - ts_node_end_byte(node), - }; - } else { - TSNode code_node = ts_node_named_child(node, 0); - ruby_ranges[ruby_range_count++] = (TSRange) { - ts_node_start_point(code_node), - ts_node_end_point(code_node), - ts_node_start_byte(code_node), - ts_node_end_byte(code_node), - }; - } - } - - // Use the HTML ranges to parse the HTML. - ts_parser_set_language(parser, tree_sitter_html()); - ts_parser_set_included_ranges(parser, html_ranges, html_range_count); - TSTree *html_tree = ts_parser_parse_string(parser, NULL, text, len); - TSNode html_root_node = ts_tree_root_node(html_tree); - - // Use the Ruby ranges to parse the Ruby. - ts_parser_set_language(parser, tree_sitter_ruby()); - ts_parser_set_included_ranges(parser, ruby_ranges, ruby_range_count); - TSTree *ruby_tree = ts_parser_parse_string(parser, NULL, text, len); - TSNode ruby_root_node = ts_tree_root_node(ruby_tree); - - // Print all three trees. - char *erb_sexp = ts_node_string(erb_root_node); - char *html_sexp = ts_node_string(html_root_node); - char *ruby_sexp = ts_node_string(ruby_root_node); - printf("ERB: %s\n", erb_sexp); - printf("HTML: %s\n", html_sexp); - printf("Ruby: %s\n", ruby_sexp); - return 0; -} -``` - -This API allows for great flexibility in how languages can be composed. Tree-sitter is not responsible for mediating the -interactions between languages. Instead, you are free to do that using arbitrary application-specific logic. - -## Concurrency - -Tree-sitter supports multi-threaded use cases by making syntax trees very cheap to copy. - -```c -TSTree *ts_tree_copy(const TSTree *); -``` - -Internally, copying a syntax tree just entails incrementing an atomic reference count. Conceptually, it provides you a new -tree which you can freely query, edit, reparse, or delete on a new thread while continuing to use the original tree on a -different thread. - -```admonish danger -Individual `TSTree` instances are _not_ thread safe; you must copy a tree if you want to use it on multiple threads simultaneously. -``` - -[ejs]: https://ejs.co -[erb]: https://ruby-doc.org/stdlib-2.5.1/libdoc/erb/rdoc/ERB.html diff --git a/docs/src/using-parsers/4-walking-trees.md b/docs/src/using-parsers/4-walking-trees.md deleted file mode 100644 index 94ac4eb4..00000000 --- a/docs/src/using-parsers/4-walking-trees.md +++ /dev/null @@ -1,41 +0,0 @@ -# Walking Trees with Tree Cursors - -You can access every node in a syntax tree using the `TSNode` APIs [described earlier][retrieving nodes], but if you need -to access a large number of nodes, the fastest way to do so is with a _tree cursor_. A cursor is a stateful object that -allows you to walk a syntax tree with maximum efficiency. - -```admonish note -The given input node is considered the root of the cursor, and the cursor cannot walk outside this node. -Going to the parent or any sibling of the root node will always return `false`. - -This has no unexpected effects if the given input node is the actual `root` node of the tree, but is something to keep in -mind when using cursors constructed with a node that is not the `root` node. -``` - -You can initialize a cursor from any node: - -```c -TSTreeCursor ts_tree_cursor_new(TSNode); -``` - -You can move the cursor around the tree: - -```c -bool ts_tree_cursor_goto_first_child(TSTreeCursor *); -bool ts_tree_cursor_goto_next_sibling(TSTreeCursor *); -bool ts_tree_cursor_goto_parent(TSTreeCursor *); -``` - -These methods return `true` if the cursor successfully moved and `false` if there was no node to move to. - -You can always retrieve the cursor's current node, as well as the [field name][node-field-names] that is associated with -the current node. - -```c -TSNode ts_tree_cursor_current_node(const TSTreeCursor *); -const char *ts_tree_cursor_current_field_name(const TSTreeCursor *); -TSFieldId ts_tree_cursor_current_field_id(const TSTreeCursor *); -``` - -[retrieving nodes]: ./2-basic-parsing.md#retrieving-nodes -[node-field-names]: ./2-basic-parsing.md#node-field-names diff --git a/docs/src/using-parsers/6-static-node-types.md b/docs/src/using-parsers/6-static-node-types.md deleted file mode 100644 index 171f4314..00000000 --- a/docs/src/using-parsers/6-static-node-types.md +++ /dev/null @@ -1,162 +0,0 @@ -# Static Node Types - -In languages with static typing, it can be helpful for syntax trees to provide specific type information about individual -syntax nodes. Tree-sitter makes this information available via a generated file called `node-types.json`. This _node types_ -file provides structured data about every possible syntax node in a grammar. - -You can use this data to generate type declarations in statically-typed programming languages. - -The node types file contains an array of objects, each of which describes a particular type of syntax node using the -following entries: - -## Basic Info - -Every object in this array has these two entries: - -- `"type"` — A string that indicates, which grammar rule the node represents. This corresponds to the `ts_node_type` function -described [here][syntax nodes]. -- `"named"` — A boolean that indicates whether this kind of node corresponds to a rule name in the grammar or just a string -literal. See [here][named-vs-anonymous-nodes] for more info. - -Examples: - -```json -{ - "type": "string_literal", - "named": true -} -{ - "type": "+", - "named": false -} -``` - -Together, these two fields constitute a unique identifier for a node type; no two top-level objects in the `node-types.json` -should have the same values for both `"type"` and `"named"`. - -## Internal Nodes - -Many syntax nodes can have _children_. The node type object describes the possible children that a node can have using the -following entries: - -- `"fields"` — An object that describes the possible [fields][node-field-names] that the node can have. The keys of this -object are field names, and the values are _child type_ objects, described below. -- `"children"` — Another _child type_ object that describes all the node's possible _named_ children _without_ fields. - -A _child type_ object describes a set of child nodes using the following entries: - -- `"required"` — A boolean indicating whether there is always _at least one_ node in this set. -- `"multiple"` — A boolean indicating whether there can be _multiple_ nodes in this set. -- `"types"`- An array of objects that represent the possible types of nodes in this set. Each object has two keys: `"type"` -and `"named"`, whose meanings are described above. - -Example with fields: - -```json -{ - "type": "method_definition", - "named": true, - "fields": { - "body": { - "multiple": false, - "required": true, - "types": [{ "type": "statement_block", "named": true }] - }, - "decorator": { - "multiple": true, - "required": false, - "types": [{ "type": "decorator", "named": true }] - }, - "name": { - "multiple": false, - "required": true, - "types": [ - { "type": "computed_property_name", "named": true }, - { "type": "property_identifier", "named": true } - ] - }, - "parameters": { - "multiple": false, - "required": true, - "types": [{ "type": "formal_parameters", "named": true }] - } - } -} -``` - -Example with children: - -```json -{ - "type": "array", - "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": false, - "types": [ - { "type": "_expression", "named": true }, - { "type": "spread_element", "named": true } - ] - } -} -``` - -## Supertype Nodes - -In Tree-sitter grammars, there are usually certain rules that represent abstract _categories_ of syntax nodes (e.g. "expression", -"type", "declaration"). In the `grammar.js` file, these are often written as [hidden rules][hidden rules] -whose definition is a simple [`choice`][grammar dsl] where each member is just a single symbol. - -Normally, hidden rules are not mentioned in the node types file, since they don't appear in the syntax tree. But if you -add a hidden rule to the grammar's [`supertypes` list][grammar dsl], then it _will_ show up in the node types file, with -the following special entry: - -- `"subtypes"` — An array of objects that specify the _types_ of nodes that this 'supertype' node can wrap. - -Example: - -```json -{ - "type": "_declaration", - "named": true, - "subtypes": [ - { "type": "class_declaration", "named": true }, - { "type": "function_declaration", "named": true }, - { "type": "generator_function_declaration", "named": true }, - { "type": "lexical_declaration", "named": true }, - { "type": "variable_declaration", "named": true } - ] -} -``` - -Supertype nodes will also appear elsewhere in the node types file, as children of other node types, in a way that corresponds -with how the supertype rule was used in the grammar. This can make the node types much shorter and easier to read, because -a single supertype will take the place of multiple subtypes. - -Example: - -```json -{ - "type": "export_statement", - "named": true, - "fields": { - "declaration": { - "multiple": false, - "required": false, - "types": [{ "type": "_declaration", "named": true }] - }, - "source": { - "multiple": false, - "required": false, - "types": [{ "type": "string", "named": true }] - } - } -} -``` - -[grammar dsl]: ../creating-parsers/2-the-grammar-dsl.md -[hidden rules]: ../creating-parsers/3-writing-the-grammar.md#hiding-rules -[named-vs-anonymous-nodes]: ./2-basic-parsing.md#named-vs-anonymous-nodes -[node-field-names]: ./2-basic-parsing.md#node-field-names -[syntax nodes]: ./2-basic-parsing.md#syntax-nodes diff --git a/docs/src/using-parsers/7-abi-versions.md b/docs/src/using-parsers/7-abi-versions.md deleted file mode 100644 index 1db42a5d..00000000 --- a/docs/src/using-parsers/7-abi-versions.md +++ /dev/null @@ -1,25 +0,0 @@ -# ABI versions - -Parsers generated with tree-sitter have an associated ABI version, which establishes hard compatibility boundaries -between the generated parser and the tree-sitter library. - -A given version of the tree-sitter library is only able to load parsers generated with supported ABI versions: - -| tree-sitter version | Min parser ABI version | Max parser ABI version | -|---------------------|------------------------|------------------------| -| 0.14 | 9 | 9 | -| >=0.15.0, <=0.15.7 | 9 | 10 | -| >=0.15.8, <=0.16 | 9 | 11 | -| 0.17, 0.18 | 9 | 12 | -| >=0.19, <=0.20.2 | 13 | 13 | -| >=0.20.3, <=0.24 | 13 | 14 | -| >=0.25 | 13 | 15 | - -By default, the tree-sitter CLI will generate parsers using the latest available ABI for that version, but an older ABI -(supported by the CLI) can be selected by passing the [`--abi` option][abi_option] to the `generate` command. - -Note that the ABI version range supported by the CLI can be smaller than for the library: When a new ABI version is released, -older versions will be phased out over a deprecation period, which starts with no longer being able to generate parsers -with the oldest ABI version. - -[abi_option]: ../cli/generate.md#--abi-version diff --git a/docs/src/using-parsers/index.md b/docs/src/using-parsers/index.md deleted file mode 100644 index 5b2c146d..00000000 --- a/docs/src/using-parsers/index.md +++ /dev/null @@ -1,27 +0,0 @@ -# Using Parsers - -This guide covers the fundamental concepts of using Tree-sitter, which is applicable across all programming languages. -Although we'll explore some C-specific details that are valuable for direct C API usage or creating new language bindings, -the core concepts remain the same. - -Tree-sitter's parsing functionality is implemented through its C API, with all functions documented in the [tree_sitter/api.h][api.h] -header file, but if you're working in another language, you can use one of the following bindings found [here](../index.md#language-bindings), -each providing idiomatic access to Tree-sitter's functionality. Of these bindings, the official ones have their own API -doc hosted online at the following pages: - -- [Go][go] -- [Java] -- [JavaScript (Node.js)][javascript] -- [Kotlin][kotlin] -- [Python][python] -- [Rust][rust] -- [Zig][zig] - -[api.h]: https://github.com/tree-sitter/tree-sitter/blob/master/lib/include/tree_sitter/api.h -[go]: https://pkg.go.dev/github.com/tree-sitter/go-tree-sitter -[java]: https://tree-sitter.github.io/java-tree-sitter -[javascript]: https://tree-sitter.github.io/node-tree-sitter -[kotlin]: https://tree-sitter.github.io/kotlin-tree-sitter -[python]: https://tree-sitter.github.io/py-tree-sitter -[rust]: https://docs.rs/tree-sitter -[zig]: https://tree-sitter.github.io/zig-tree-sitter diff --git a/docs/src/using-parsers/queries/1-syntax.md b/docs/src/using-parsers/queries/1-syntax.md deleted file mode 100644 index 2e0a8853..00000000 --- a/docs/src/using-parsers/queries/1-syntax.md +++ /dev/null @@ -1,127 +0,0 @@ -# Query Syntax - -A _query_ consists of one or more _patterns_, where each pattern is an [S-expression][s-exp] that matches a certain set -of nodes in a syntax tree. The expression to match a given node consists of a pair of parentheses containing two things: -the node's type, and optionally, a series of other S-expressions that match the node's children. For example, this pattern -would match any `binary_expression` node whose children are both `number_literal` nodes: - -```query -(binary_expression (number_literal) (number_literal)) -``` - -Children can also be omitted. For example, this would match any `binary_expression` where at least _one_ of child is a -`string_literal` node: - -```query -(binary_expression (string_literal)) -``` - -## Fields - -In general, it's a good idea to make patterns more specific by specifying [field names][node-field-names] associated with -child nodes. You do this by prefixing a child pattern with a field name followed by a colon. For example, this pattern would -match an `assignment_expression` node where the `left` child is a `member_expression` whose `object` is a `call_expression`. - -```query -(assignment_expression - left: (member_expression - object: (call_expression))) -``` - -## Negated Fields - -You can also constrain a pattern so that it only matches nodes that _lack_ a certain field. To do this, add a field name -prefixed by a `!` within the parent pattern. For example, this pattern would match a class declaration with no type parameters: - -```query -(class_declaration - name: (identifier) @class_name - !type_parameters) -``` - -## Anonymous Nodes - -The parenthesized syntax for writing nodes only applies to [named nodes][named-vs-anonymous-nodes]. To match specific anonymous -nodes, you write their name between double quotes. For example, this pattern would match any `binary_expression` where the -operator is `!=` and the right side is `null`: - -```query -(binary_expression - operator: "!=" - right: (null)) -``` - -## Special Nodes - -### The Wildcard Node - -A wildcard node is represented with an underscore (`_`), it matches any node. -This is similar to `.` in regular expressions. -There are two types, `(_)` will match any named node, -and `_` will match any named or anonymous node. - -For example, this pattern would match any node inside a call: - -```query -(call (_) @call.inner) -``` - -### The `ERROR` Node - -When the parser encounters text it does not recognize, it represents this node -as `(ERROR)` in the syntax tree. These error nodes can be queried just like -normal nodes: - -```scheme -(ERROR) @error-node -``` - -### The `MISSING` Node - -If the parser is able to recover from erroneous text by inserting a missing token and then reducing, it will insert that -missing node in the final tree so long as that tree has the lowest error cost. These missing nodes appear as seemingly normal -nodes in the tree, but they are zero tokens wide, and are internally represented as a property of the actual terminal node -that was inserted, instead of being its own kind of node, like the `ERROR` node. These special missing nodes can be queried -using `(MISSING)`: - -```scheme -(MISSING) @missing-node -``` - -This is useful when attempting to detect all syntax errors in a given parse tree, since these missing node are not captured -by `(ERROR)` queries. Specific missing node types can also be queried: - -```scheme -(MISSING identifier) @missing-identifier -(MISSING ";") @missing-semicolon -``` - -### Supertype Nodes - -Some node types are marked as _supertypes_ in a grammar. A supertype is a node type that contains multiple -subtypes. For example, in the [JavaScript grammar example][grammar], `expression` is a supertype that can represent any -kind of expression, such as a `binary_expression`, `call_expression`, or `identifier`. You can use supertypes in queries -to match any of their subtypes, rather than having to list out each subtype individually. For example, this pattern would -match any kind of expression, even though it's not a visible node in the syntax tree: - -```query -(expression) @any-expression -``` - -To query specific subtypes of a supertype, you can use the syntax `supertype/subtype`. For example, this pattern would -match a `binary_expression` only if it is a child of `expression`: - -```query -(expression/binary_expression) @binary-expression -``` - -This also applies to anonymous nodes. For example, this pattern would match `"()"` only if it is a child of `expression`: - -```query -(expression/"()") @empty-expression -``` - -[grammar]: ../../creating-parsers/3-writing-the-grammar.md#structuring-rules-well -[node-field-names]: ../2-basic-parsing.md#node-field-names -[named-vs-anonymous-nodes]: ../2-basic-parsing.md#named-vs-anonymous-nodes -[s-exp]: https://en.wikipedia.org/wiki/S-expression diff --git a/docs/src/using-parsers/queries/2-operators.md b/docs/src/using-parsers/queries/2-operators.md deleted file mode 100644 index 6f9a8ca4..00000000 --- a/docs/src/using-parsers/queries/2-operators.md +++ /dev/null @@ -1,151 +0,0 @@ -# Operators - -## Capturing Nodes - -When matching patterns, you may want to process specific nodes within the pattern. Captures allow you to associate names -with specific nodes in a pattern, so that you can later refer to those nodes by those names. Capture names are written _after_ -the nodes that they refer to, and start with an `@` character. - -For example, this pattern would match any assignment of a `function` to an `identifier`, and it would associate the name -`the-function-name` with the identifier: - -```query -(assignment_expression - left: (identifier) @the-function-name - right: (function)) -``` - -And this pattern would match all method definitions, associating the name `the-method-name` with the method name, `the-class-name` -with the containing class name: - -```query -(class_declaration - name: (identifier) @the-class-name - body: (class_body - (method_definition - name: (property_identifier) @the-method-name))) -``` - -## Quantification Operators - -You can match a repeating sequence of sibling nodes using the postfix `+` and `*` _repetition_ operators, which work analogously -to the `+` and `*` operators [in regular expressions][regex]. The `+` operator matches _one or more_ repetitions of a pattern, -and the `*` operator matches _zero or more_. - -For example, this pattern would match a sequence of one or more comments: - -```query -(comment)+ -``` - -This pattern would match a class declaration, capturing all of the decorators if any were present: - -```query -(class_declaration - (decorator)* @the-decorator - name: (identifier) @the-name) -``` - -You can also mark a node as optional using the `?` operator. For example, this pattern would match all function calls, capturing -a string argument if one was present: - -```query -(call_expression - function: (identifier) @the-function - arguments: (arguments (string)? @the-string-arg)) -``` - -## Grouping Sibling Nodes - -You can also use parentheses for grouping a sequence of _sibling_ nodes. For example, this pattern would match a comment -followed by a function declaration: - -```query -( - (comment) - (function_declaration) -) -``` - -Any of the quantification operators mentioned above (`+`, `*`, and `?`) can also be applied to groups. For example, this -pattern would match a comma-separated series of numbers: - -```query -( - (number) - ("," (number))* -) -``` - -## Alternations - -An alternation is written as a pair of square brackets (`[]`) containing a list of alternative patterns. -This is similar to _character classes_ from regular expressions (`[abc]` matches either a, b, or c). - -For example, this pattern would match a call to either a variable or an object property. -In the case of a variable, capture it as `@function`, and in the case of a property, capture it as `@method`: - -```query -(call_expression - function: [ - (identifier) @function - (member_expression - property: (property_identifier) @method) - ]) -``` - -This pattern would match a set of possible keyword tokens, capturing them as `@keyword`: - -```query -[ - "break" - "delete" - "else" - "for" - "function" - "if" - "return" - "try" - "while" -] @keyword -``` - -## Anchors - -The anchor operator, `.`, is used to constrain the ways in which child patterns are matched. It has different behaviors -depending on where it's placed inside a query. - -When `.` is placed before the _first_ child within a parent pattern, the child will only match when it is the first named -node in the parent. For example, the below pattern matches a given `array` node at most once, assigning the `@the-element` -capture to the first `identifier` node in the parent `array`: - -```query -(array . (identifier) @the-element) -``` - -Without this anchor, the pattern would match once for every identifier in the array, with `@the-element` bound -to each matched identifier. - -Similarly, an anchor placed after a pattern's _last_ child will cause that child pattern to only match nodes that are the -last named child of their parent. The below pattern matches only nodes that are the last named child within a `block`. - -```query -(block (_) @last-expression .) -``` - -Finally, an anchor _between_ two child patterns will cause the patterns to only match nodes that are immediate siblings. -The pattern below, given a long dotted name like `a.b.c.d`, will only match pairs of consecutive identifiers: -`a, b`, `b, c`, and `c, d`. - -```query -(dotted_name - (identifier) @prev-id - . - (identifier) @next-id) -``` - -Without the anchor, non-consecutive pairs like `a, c` and `b, d` would also be matched. - -The restrictions placed on a pattern by an anchor operator ignore anonymous nodes. - -[regex]: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts diff --git a/docs/src/using-parsers/queries/3-predicates-and-directives.md b/docs/src/using-parsers/queries/3-predicates-and-directives.md deleted file mode 100644 index 1f9aeada..00000000 --- a/docs/src/using-parsers/queries/3-predicates-and-directives.md +++ /dev/null @@ -1,201 +0,0 @@ -# Predicates - -You can also specify arbitrary metadata and conditions associated with a pattern -by adding _predicate_ S-expressions anywhere within your pattern. Predicate S-expressions -start with a _predicate name_ beginning with a `#` character, and ending with a `?` character. After that, they can -contain an arbitrary number of `@`-prefixed capture names or strings. - -Tree-sitter's CLI supports the following predicates by default: - -## The `eq?` predicate - -This family of predicates allows you to match against a single capture or string -value. - -The first argument to this predicate must be a capture, but the second can be either a capture to -compare the two captures' text, or a string to compare first capture's text -against. - -The base predicate is `#eq?`, but its complement, `#not-eq?`, can be used to _not_ -match a value. Additionally, you can prefix either of these with `any-` to match -if _any_ of the nodes match the predicate. This is only useful when dealing with -quantified captures, as by default a quantified capture will only match if _all_ the captured nodes match the predicate. - -Thus, there are four predicates in total: - -- `#eq?` -- `#not-eq?` -- `#any-eq?` -- `#any-not-eq?` - -Consider the following example targeting C: - -```query -((identifier) @variable.builtin - (#eq? @variable.builtin "self")) -``` - -This pattern would match any identifier that is `self`. - -Now consider the following example: - -```query -( - (pair - key: (property_identifier) @key-name - value: (identifier) @value-name) - (#eq? @key-name @value-name) -) -``` - -This pattern would match key-value pairs where the `value` is an identifier -with the same text as the key (meaning they are the same): - -As mentioned earlier, the `any-` prefix is meant for use with quantified captures. Here's -an example finding an empty comment within a group of comments: - -```query -((comment)+ @comment.empty - (#any-eq? @comment.empty "//")) -``` - -## The `match?` predicate - -These predicates are similar to the `eq?` predicates, but they use regular expressions -to match against the capture's text instead of string comparisons. - -The first argument must be a capture, and the second must be a string containing -a regular expression. - -Like the `eq?` predicate family, we can tack on `not-` to the beginning of the predicate -to negate the match, and `any-` to match if _any_ of the nodes in a quantified capture match the predicate. - -This pattern matches identifiers written in `SCREAMING_SNAKE_CASE`. - -```query -((identifier) @constant - (#match? @constant "^[A-Z][A-Z_]+")) -``` - -This query identifies documentation comments in C that begin with three forward slashes (`///`). - -```query -((comment)+ @comment.documentation - (#match? @comment.documentation "^///\\s+.*")) -``` - -This query finds C code embedded in Go comments that appear just before a "C" import statement. -These are known as [`Cgo`][cgo] comments and are used to inject C code into Go programs. - -```query -((comment)+ @injection.content - . - (import_declaration - (import_spec path: (interpreted_string_literal) @_import_c)) - (#eq? @_import_c "\"C\"") - (#match? @injection.content "^//")) -``` - -## The `any-of?` predicate - -The `any-of?` predicate allows you to match a capture against multiple strings, -and will match if the capture's text is equal to any of the strings. - -The query below will match any of the builtin variables in JavaScript. - -```query -((identifier) @variable.builtin - (#any-of? @variable.builtin - "arguments" - "module" - "console" - "window" - "document")) -``` - -## The `is?` predicate - -The `is?` predicate allows you to assert that a capture has a given property. This isn't widely used, but the CLI uses it -to determine whether a given node is a local variable or not, for example: - -```query -((identifier) @variable.builtin - (#match? @variable.builtin "^(arguments|module|console|window|document)$") - (#is-not? local)) -``` - -This pattern would match any builtin variable that is not a local variable, because the `#is-not? local` predicate is used. - -# Directives - -Similar to predicates, directives are a way to associate arbitrary metadata with a pattern. The only difference between -predicates and directives is that directives end in a `!` character instead of `?` character. - -Tree-sitter's CLI supports the following directives by default: - -## The `set!` directive - -This directive allows you to associate key-value pairs with a pattern. The key and value can be any arbitrary text that -you see fit. - -```query -((comment) @injection.content - (#match? @injection.content "/[*\/][!*\/] for the CLI," - echo " and .#lib- for the library (e.g. nix build .#cli-aarch64-linux)." - echo "" - echo " Available targets:" - echo " aarch64-linux - ARM64 Linux" - echo " armv7l-linux - ARMv7 Linux" - echo " x86_64-linux - x86_64 Linux" - echo " i686-linux - i686 Linux" - echo " loongarch64 - LoongArch64 Linux" - echo " mips - MIPS Linux" - echo " mips64 - MIPS64 Linux" - echo " musl64 - x86_64 MUSL Linux" - echo " powerpc64-linux - PowerPC64 Linux" - echo " riscv32 - RISC-V 32-bit Linux" - echo " riscv64 - RISC-V 64-bit Linux" - echo " s390x - s390x Linux" - echo " x86_64-windows - x86_64 Windows" - echo " x86_64-darwin - x86_64 macOS (Darwin only)" - echo " aarch64-darwin - ARM64 macOS (Darwin only)" - echo "" - echo "Apps:" - echo " nix run .#cli - Run tree-sitter CLI" - echo " nix run .#docs - Serve docs locally" - echo " nix run .#format - Format all code" - echo " nix run .#lint - Run all linting checks" - echo "" - echo "Tests & Checks:" - echo " nix flake check - Run all tests and checks" - echo "" - echo "Version: ${version}" - ''; - - env = { - RUST_BACKTRACE = 1; - LIBCLANG_PATH = "${pkgs.libclang.lib}/lib"; - LLVM_COV = "${pkgs.llvm}/bin/llvm-cov"; - LLVM_PROFDATA = "${pkgs.llvm}/bin/llvm-profdata"; - TREE_SITTER_WASI_SDK_PATH = "${pkgs.pkgsCross.wasi32.stdenv.cc}"; - }; - }; - } - ); - }; -} diff --git a/crates/highlight/Cargo.toml b/highlight/Cargo.toml similarity index 81% rename from crates/highlight/Cargo.toml rename to highlight/Cargo.toml index 502bb31f..694f5064 100644 --- a/crates/highlight/Cargo.toml +++ b/highlight/Cargo.toml @@ -11,21 +11,16 @@ rust-version.workspace = true readme = "README.md" homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter-highlight" license.workspace = true keywords = ["incremental", "parsing", "syntax", "highlighting"] categories = ["parsing", "text-editors"] -[lints] -workspace = true - [lib] -path = "src/highlight.rs" crate-type = ["lib", "staticlib"] [dependencies] +lazy_static.workspace = true regex.workspace = true thiserror.workspace = true -streaming-iterator.workspace = true tree-sitter.workspace = true diff --git a/crates/highlight/README.md b/highlight/README.md similarity index 85% rename from crates/highlight/README.md rename to highlight/README.md index edb89708..4ca76d6c 100644 --- a/crates/highlight/README.md +++ b/highlight/README.md @@ -12,8 +12,8 @@ to parse, to your `Cargo.toml`: ```toml [dependencies] -tree-sitter-highlight = "0.25.4" -tree-sitter-javascript = "0.23.1" +tree-sitter-highlight = "0.22.0" +tree-sitter-javascript = "0.21.3" ``` Define the list of highlight names that you will recognize: @@ -21,23 +21,15 @@ Define the list of highlight names that you will recognize: ```rust let highlight_names = [ "attribute", - "comment", "constant", - "constant.builtin", - "constructor", - "embedded", - "function", "function.builtin", + "function", "keyword", - "module", - "number", "operator", "property", - "property.builtin", "punctuation", "punctuation.bracket", "punctuation.delimiter", - "punctuation.special", "string", "string.special", "tag", @@ -63,7 +55,7 @@ Load some highlighting queries from the `queries` directory of the language repo ```rust use tree_sitter_highlight::HighlightConfiguration; -let javascript_language = tree_sitter_javascript::LANGUAGE.into(); +let javascript_language = tree_sitter_javascript::language(); let mut javascript_config = HighlightConfiguration::new( javascript_language, @@ -95,10 +87,10 @@ let highlights = highlighter.highlight( for event in highlights { match event.unwrap() { HighlightEvent::Source {start, end} => { - eprintln!("source: {start}-{end}"); + eprintln!("source: {}-{}", start, end); }, HighlightEvent::HighlightStart(s) => { - eprintln!("highlight style started: {s:?}"); + eprintln!("highlight style started: {:?}", s); }, HighlightEvent::HighlightEnd => { eprintln!("highlight style ended"); diff --git a/crates/highlight/include/tree_sitter/highlight.h b/highlight/include/tree_sitter/highlight.h similarity index 100% rename from crates/highlight/include/tree_sitter/highlight.h rename to highlight/include/tree_sitter/highlight.h diff --git a/crates/highlight/src/c_lib.rs b/highlight/src/c_lib.rs similarity index 96% rename from crates/highlight/src/c_lib.rs rename to highlight/src/c_lib.rs index 9cc5c073..bf291c98 100644 --- a/crates/highlight/src/c_lib.rs +++ b/highlight/src/c_lib.rs @@ -9,10 +9,10 @@ use tree_sitter::Language; use super::{Error, Highlight, HighlightConfiguration, Highlighter, HtmlRenderer}; pub struct TSHighlighter { - pub languages: HashMap, HighlightConfiguration)>, - pub attribute_strings: Vec<&'static [u8]>, - pub highlight_names: Vec, - pub carriage_return_index: Option, + languages: HashMap, HighlightConfiguration)>, + attribute_strings: Vec<&'static [u8]>, + highlight_names: Vec, + carriage_return_index: Option, } pub struct TSHighlightBuffer { @@ -304,9 +304,9 @@ impl TSHighlighter { output .renderer .set_carriage_return_highlight(self.carriage_return_index.map(Highlight)); - let result = output.renderer.render(highlights, source_code, &|s, out| { - out.extend(self.attribute_strings[s.0]); - }); + let result = output + .renderer + .render(highlights, source_code, &|s| self.attribute_strings[s.0]); match result { Err(Error::Cancelled | Error::Unknown) => ErrorCode::Timeout, Err(Error::InvalidLanguage) => ErrorCode::InvalidLanguage, diff --git a/crates/highlight/src/highlight.rs b/highlight/src/lib.rs similarity index 86% rename from crates/highlight/src/highlight.rs rename to highlight/src/lib.rs index d38351f6..74684669 100644 --- a/crates/highlight/src/highlight.rs +++ b/highlight/src/lib.rs @@ -1,34 +1,26 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] +#![doc = include_str!("../README.md")] pub mod c_lib; -use core::slice; use std::{ collections::HashSet, - iter, - marker::PhantomData, - mem::{self, MaybeUninit}, - ops::{self, ControlFlow}, - str, - sync::{ - atomic::{AtomicUsize, Ordering}, - LazyLock, - }, + iter, mem, ops, str, + sync::atomic::{AtomicUsize, Ordering}, }; pub use c_lib as c; -use streaming_iterator::StreamingIterator; +use lazy_static::lazy_static; use thiserror::Error; use tree_sitter::{ - ffi, Language, LossyUtf8, Node, ParseOptions, Parser, Point, Query, QueryCapture, - QueryCaptures, QueryCursor, QueryError, QueryMatch, Range, TextProvider, Tree, + Language, LossyUtf8, Node, Parser, Point, Query, QueryCaptures, QueryCursor, QueryError, + QueryMatch, Range, Tree, }; const CANCELLATION_CHECK_INTERVAL: usize = 100; const BUFFER_HTML_RESERVE_CAPACITY: usize = 10 * 1024; const BUFFER_LINES_RESERVE_CAPACITY: usize = 1000; -static STANDARD_CAPTURE_NAMES: LazyLock> = LazyLock::new(|| { - vec![ +lazy_static! { + static ref STANDARD_CAPTURE_NAMES: HashSet<&'static str> = vec![ "attribute", "boolean", "carriage-return", @@ -83,8 +75,8 @@ static STANDARD_CAPTURE_NAMES: LazyLock> = LazyLock::new(| "variable.parameter", ] .into_iter() - .collect() -}); + .collect(); +} /// Indicates which highlight should be applied to a region of source code. #[derive(Copy, Clone, Debug, PartialEq, Eq)] @@ -144,8 +136,6 @@ pub struct HtmlRenderer { pub html: Vec, pub line_offsets: Vec, carriage_return_highlight: Option, - // The offset in `self.html` of the last carriage return. - last_carriage_return: Option, } #[derive(Debug)] @@ -181,7 +171,7 @@ where struct HighlightIterLayer<'a> { _tree: Tree, cursor: QueryCursor, - captures: iter::Peekable<_QueryCaptures<'a, 'a, &'a [u8], &'a [u8]>>, + captures: iter::Peekable>, config: &'a HighlightConfiguration, highlight_end_stack: Vec, scope_stack: Vec>, @@ -189,78 +179,6 @@ struct HighlightIterLayer<'a> { depth: usize, } -pub struct _QueryCaptures<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> { - ptr: *mut ffi::TSQueryCursor, - query: &'query Query, - text_provider: T, - buffer1: Vec, - buffer2: Vec, - _current_match: Option<(QueryMatch<'query, 'tree>, usize)>, - _options: Option<*mut ffi::TSQueryCursorOptions>, - _phantom: PhantomData<(&'tree (), I)>, -} - -struct _QueryMatch<'cursor, 'tree> { - pub _pattern_index: usize, - pub _captures: &'cursor [QueryCapture<'tree>], - _id: u32, - _cursor: *mut ffi::TSQueryCursor, -} - -impl<'tree> _QueryMatch<'_, 'tree> { - fn new(m: &ffi::TSQueryMatch, cursor: *mut ffi::TSQueryCursor) -> Self { - _QueryMatch { - _cursor: cursor, - _id: m.id, - _pattern_index: m.pattern_index as usize, - _captures: (m.capture_count > 0) - .then(|| unsafe { - slice::from_raw_parts( - m.captures.cast::>(), - m.capture_count as usize, - ) - }) - .unwrap_or_default(), - } - } -} - -impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> Iterator - for _QueryCaptures<'query, 'tree, T, I> -{ - type Item = (QueryMatch<'query, 'tree>, usize); - - fn next(&mut self) -> Option { - unsafe { - loop { - let mut capture_index = 0u32; - let mut m = MaybeUninit::::uninit(); - if ffi::ts_query_cursor_next_capture( - self.ptr, - m.as_mut_ptr(), - core::ptr::addr_of_mut!(capture_index), - ) { - let result = std::mem::transmute::<_QueryMatch, QueryMatch>(_QueryMatch::new( - &m.assume_init(), - self.ptr, - )); - if result.satisfies_text_predicates( - self.query, - &mut self.buffer1, - &mut self.buffer2, - &mut self.text_provider, - ) { - return Some((result, capture_index as usize)); - } - result.remove(); - } else { - return None; - } - } - } - } -} - impl Default for Highlighter { fn default() -> Self { Self::new() @@ -276,7 +194,7 @@ impl Highlighter { } } - pub const fn parser(&mut self) -> &mut Parser { + pub fn parser(&mut self) -> &mut Parser { &mut self.parser } @@ -344,13 +262,11 @@ impl HighlightConfiguration { locals_query: &str, ) -> Result { // Concatenate the query strings, keeping track of the start offset of each section. - let mut query_source = String::with_capacity( - injection_query.len() + locals_query.len() + highlights_query.len(), - ); + let mut query_source = String::new(); query_source.push_str(injection_query); - let locals_query_offset = injection_query.len(); + let locals_query_offset = query_source.len(); query_source.push_str(locals_query); - let highlights_query_offset = injection_query.len() + locals_query.len(); + let highlights_query_offset = query_source.len(); query_source.push_str(highlights_query); // Construct a single query by concatenating the three query strings, but record the @@ -528,45 +444,27 @@ impl<'a> HighlightIterLayer<'a> { .set_language(&config.language) .map_err(|_| Error::InvalidLanguage)?; + unsafe { highlighter.parser.set_cancellation_flag(cancellation_flag) }; let tree = highlighter .parser - .parse_with_options( - &mut |i, _| { - if i < source.len() { - &source[i..] - } else { - &[] - } - }, - None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if let Some(cancellation_flag) = cancellation_flag { - if cancellation_flag.load(Ordering::SeqCst) != 0 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - } else { - ControlFlow::Continue(()) - } - })), - ) + .parse(source, None) .ok_or(Error::Cancelled)?; + unsafe { highlighter.parser.set_cancellation_flag(None) }; let mut cursor = highlighter.cursors.pop().unwrap_or_default(); // Process combined injections. if let Some(combined_injections_query) = &config.combined_injections_query { let mut injections_by_pattern_index = vec![(None, Vec::new(), false); combined_injections_query.pattern_count()]; - let mut matches = + let matches = cursor.matches(combined_injections_query, tree.root_node(), source); - while let Some(mat) = matches.next() { + for mat in matches { let entry = &mut injections_by_pattern_index[mat.pattern_index]; let (language_name, content_node, include_children) = injection_for_match( config, parent_name, combined_injections_query, - mat, + &mat, source, ); if language_name.is_some() { @@ -594,7 +492,6 @@ impl<'a> HighlightIterLayer<'a> { } } - // SAFETY: // The `captures` iterator borrows the `Tree` and the `QueryCursor`, which // prevents them from being moved. But both of these values are really just // pointers, so it's actually ok to move them. @@ -602,12 +499,9 @@ impl<'a> HighlightIterLayer<'a> { let cursor_ref = unsafe { mem::transmute::<&mut QueryCursor, &'static mut QueryCursor>(&mut cursor) }; - let captures = unsafe { - std::mem::transmute::, _QueryCaptures<_, _>>( - cursor_ref.captures(&config.query, tree_ref.root_node(), source), - ) - } - .peekable(); + let captures = cursor_ref + .captures(&config.query, tree_ref.root_node(), source) + .peekable(); result.push(HighlightIterLayer { highlight_end_stack: Vec::new(), @@ -963,7 +857,7 @@ where for prop in layer.config.query.property_settings(match_.pattern_index) { if prop.key.as_ref() == "local.scope-inherits" { scope.inherits = - prop.value.as_ref().is_none_or(|r| r.as_ref() == "true"); + prop.value.as_ref().map_or(true, |r| r.as_ref() == "true"); } } layer.scope_stack.push(scope); @@ -1100,13 +994,12 @@ impl HtmlRenderer { html: Vec::with_capacity(BUFFER_HTML_RESERVE_CAPACITY), line_offsets: Vec::with_capacity(BUFFER_LINES_RESERVE_CAPACITY), carriage_return_highlight: None, - last_carriage_return: None, }; result.line_offsets.push(0); result } - pub const fn set_carriage_return_highlight(&mut self, highlight: Option) { + pub fn set_carriage_return_highlight(&mut self, highlight: Option) { self.carriage_return_highlight = highlight; } @@ -1116,35 +1009,32 @@ impl HtmlRenderer { self.line_offsets.push(0); } - pub fn render( + pub fn render<'a, F>( &mut self, highlighter: impl Iterator>, - source: &[u8], + source: &'a [u8], attribute_callback: &F, ) -> Result<(), Error> where - F: Fn(Highlight, &mut Vec), + F: Fn(Highlight) -> &'a [u8], { let mut highlights = Vec::new(); for event in highlighter { match event { Ok(HighlightEvent::HighlightStart(s)) => { highlights.push(s); - self.start_highlight(s, &attribute_callback); + self.start_highlight(s, attribute_callback); } Ok(HighlightEvent::HighlightEnd) => { highlights.pop(); self.end_highlight(); } Ok(HighlightEvent::Source { start, end }) => { - self.add_text(&source[start..end], &highlights, &attribute_callback); + self.add_text(&source[start..end], &highlights, attribute_callback); } Err(a) => return Err(a), } } - if let Some(offset) = self.last_carriage_return.take() { - self.add_carriage_return(offset, attribute_callback); - } if self.html.last() != Some(&b'\n') { self.html.push(b'\n'); } @@ -1169,30 +1059,30 @@ impl HtmlRenderer { }) } - fn add_carriage_return(&mut self, offset: usize, attribute_callback: &F) + fn add_carriage_return<'a, F>(&mut self, attribute_callback: &F) where - F: Fn(Highlight, &mut Vec), + F: Fn(Highlight) -> &'a [u8], { if let Some(highlight) = self.carriage_return_highlight { - // If a CR is the last character in a `HighlightEvent::Source` - // region, then we don't know until the next `Source` event or EOF - // whether it is part of CRLF or on its own. To avoid unbounded - // lookahead, save the offset of the CR and insert there now that we - // know. - let rest = self.html.split_off(offset); - self.html.extend(b""); - self.html.extend(rest); + let attribute_string = (attribute_callback)(highlight); + if !attribute_string.is_empty() { + self.html.extend(b""); + } } } - fn start_highlight(&mut self, h: Highlight, attribute_callback: &F) + fn start_highlight<'a, F>(&mut self, h: Highlight, attribute_callback: &F) where - F: Fn(Highlight, &mut Vec), + F: Fn(Highlight) -> &'a [u8], { - self.html.extend(b""); } @@ -1200,9 +1090,9 @@ impl HtmlRenderer { self.html.extend(b""); } - fn add_text(&mut self, src: &[u8], highlights: &[Highlight], attribute_callback: &F) + fn add_text<'a, F>(&mut self, src: &[u8], highlights: &[Highlight], attribute_callback: &F) where - F: Fn(Highlight, &mut Vec), + F: Fn(Highlight) -> &'a [u8], { pub const fn html_escape(c: u8) -> Option<&'static [u8]> { match c as char { @@ -1215,29 +1105,29 @@ impl HtmlRenderer { } } + let mut last_char_was_cr = false; for c in LossyUtf8::new(src).flat_map(|p| p.bytes()) { // Don't render carriage return characters, but allow lone carriage returns (not // followed by line feeds) to be styled via the attribute callback. if c == b'\r' { - self.last_carriage_return = Some(self.html.len()); + last_char_was_cr = true; continue; } - if let Some(offset) = self.last_carriage_return.take() { + if last_char_was_cr { if c != b'\n' { - self.add_carriage_return(offset, attribute_callback); + self.add_carriage_return(attribute_callback); } + last_char_was_cr = false; } // At line boundaries, close and re-open all of the open tags. if c == b'\n' { - for _ in highlights { - self.end_highlight(); - } + highlights.iter().for_each(|_| self.end_highlight()); self.html.push(c); self.line_offsets.push(self.html.len() as u32); - for scope in highlights { - self.start_highlight(*scope, attribute_callback); - } + highlights + .iter() + .for_each(|scope| self.start_highlight(*scope, attribute_callback)); } else if let Some(escape) = html_escape(c) { self.html.extend_from_slice(escape); } else { diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt new file mode 100644 index 00000000..6e17d9a7 --- /dev/null +++ b/lib/CMakeLists.txt @@ -0,0 +1,61 @@ +cmake_minimum_required(VERSION 3.13) + +project(tree-sitter + VERSION "0.23.0" + DESCRIPTION "An incremental parsing system for programming tools" + HOMEPAGE_URL "https://tree-sitter.github.io/tree-sitter/" + LANGUAGES C) + +if(NOT MSVC) + set(CMAKE_C_FLAGS "-O3 -Wall -Wextra -Wshadow -Wno-unused-parameter -pedantic") +endif(NOT MSVC) + +option(BUILD_SHARED_LIBS "Build using shared libraries" ON) +option(TREE_SITTER_FEATURE_WASM "Enable the Wasm feature" OFF) + +file(GLOB TS_SOURCE_FILES src/*.c) +list(REMOVE_ITEM TS_SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/lib.c") + +add_library(tree-sitter ${TS_SOURCE_FILES}) + +target_include_directories(tree-sitter PRIVATE src src/wasm include) + +if(TREE_SITTER_FEATURE_WASM) + if(NOT DEFINED CACHE{WASMTIME_INCLUDE_DIR}) + message(CHECK_START "Looking for wasmtime headers") + find_path(WASMTIME_INCLUDE_DIR wasmtime.h + PATHS ENV DEP_WASMTIME_C_API_INCLUDE + REQUIRED) + message(CHECK_PASS "found") + endif(NOT DEFINED CACHE{WASMTIME_INCLUDE_DIR}) + + if(NOT DEFINED CACHE{WASMTIME_LIBRARY}) + message(CHECK_START "Looking for wasmtime library") + find_library(WASMTIME_LIBRARY wasmtime + REQUIRED) + message(CHECK_PASS "found") + endif(NOT DEFINED CACHE{WASMTIME_LIBRARY}) + + target_compile_definitions(tree-sitter PUBLIC TREE_SITTER_FEATURE_WASM) + target_include_directories(tree-sitter SYSTEM PRIVATE "${WASMTIME_INCLUDE_DIR}") + target_link_libraries(tree-sitter PRIVATE "${WASMTIME_LIBRARY}") + set_property(TARGET tree-sitter PROPERTY C_STANDARD_REQUIRED ON) +endif(TREE_SITTER_FEATURE_WASM) + +set_target_properties(tree-sitter + PROPERTIES + C_STANDARD 11 + C_VISIBILITY_PRESET hidden + POSITION_INDEPENDENT_CODE ON + SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") + +configure_file(tree-sitter.pc.in "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" @ONLY) + +include(GNUInstallDirs) + +install(FILES include/tree_sitter/api.h + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/tree_sitter") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tree-sitter.pc" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig") +install(TARGETS tree-sitter + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 64a9e8eb..2884d411 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -4,19 +4,13 @@ version.workspace = true description = "Rust bindings to the Tree-sitter parsing library" authors.workspace = true edition.workspace = true -rust-version = "1.77" +rust-version = "1.65" readme = "binding_rust/README.md" homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter" license.workspace = true keywords.workspace = true -categories = [ - "api-bindings", - "external-ffi-bindings", - "parsing", - "text-editors", -] +categories = ["api-bindings", "parsing", "text-editors"] build = "binding_rust/build.rs" links = "tree-sitter" @@ -26,43 +20,31 @@ include = [ "/Cargo.toml", "/src/*.h", "/src/*.c", - "/src/portable/*", "/src/unicode/*", "/src/wasm/*", "/include/tree_sitter/api.h", - "/LICENSE", ] -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] -targets = ["x86_64-unknown-linux-gnu", "x86_64-pc-windows-gnu"] - -[lints] -workspace = true - [features] default = ["std"] std = ["regex/std", "regex/perf", "regex-syntax/unicode"] -wasm = ["std", "wasmtime-c-api"] +wasm = ["wasmtime-c-api"] [dependencies] -regex = { version = "1.11.3", default-features = false, features = ["unicode"] } -regex-syntax = { version = "0.8.6", default-features = false } -tree-sitter-language.workspace = true -streaming-iterator = "0.1.9" +regex = { version = "1.10.6", default-features = false, features = ["unicode"] } +regex-syntax = { version = "0.8.4", default-features = false } +tree-sitter-language = { version = "0.1", path = "language" } [dependencies.wasmtime-c-api] -version = "33.0.2" +version = "24.0.0" optional = true package = "wasmtime-c-api-impl" default-features = false -features = ["cranelift", "gc-drc"] +features = ["cranelift"] [build-dependencies] -bindgen = { version = "0.72.0", optional = true } +bindgen = { version = "0.70.1", optional = true } cc.workspace = true -serde_json.workspace = true [lib] path = "binding_rust/lib.rs" diff --git a/lib/LICENSE b/lib/LICENSE deleted file mode 100644 index 971b81f9..00000000 --- a/lib/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Max Brunsfeld - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/lib/binding_rust/README.md b/lib/binding_rust/README.md index 39c13b7c..9eff5d6c 100644 --- a/lib/binding_rust/README.md +++ b/lib/binding_rust/README.md @@ -17,18 +17,25 @@ use tree_sitter::{InputEdit, Language, Parser, Point}; let mut parser = Parser::new(); ``` +Add the `cc` crate to your `Cargo.toml` under `[build-dependencies]`: + +```toml +[build-dependencies] +cc="*" +``` + Then, add a language as a dependency: ```toml [dependencies] -tree-sitter = "0.24" -tree-sitter-rust = "0.23" +tree-sitter = "0.22" +tree-sitter-rust = "0.21" ``` -To use a language, you assign them to the parser. +To then use a language, you assign them to the parser. ```rust -parser.set_language(&tree_sitter_rust::LANGUAGE.into()).expect("Error loading Rust grammar"); +parser.set_language(&tree_sitter_rust::language()).expect("Error loading Rust grammar"); ``` Now you can parse source code: @@ -98,49 +105,6 @@ assert_eq!( ); ``` -## Using Wasm Grammar Files - -> Requires the feature **wasm** to be enabled. - -First, create a parser with a Wasm store: - -```rust -use tree_sitter::{wasmtime::Engine, Parser, WasmStore}; - -let engine = Engine::default(); -let store = WasmStore::new(&engine).unwrap(); - -let mut parser = Parser::new(); -parser.set_wasm_store(store).unwrap(); -``` - -Then, load the language from a Wasm file: - -```rust -const JAVASCRIPT_GRAMMAR: &[u8] = include_bytes!("path/to/tree-sitter-javascript.wasm"); - -let mut store = WasmStore::new(&engine).unwrap(); -let javascript = store - .load_language("javascript", JAVASCRIPT_GRAMMAR) - .unwrap(); - -// The language may be loaded from a different WasmStore than the one set on -// the parser but it must use the same underlying WasmEngine. -parser.set_language(&javascript).unwrap(); -``` - -Now you can parse source code: - -```rust -let source_code = "let x = 1;"; -let tree = parser.parse(source_code, None).unwrap(); - -assert_eq!( - tree.root_node().to_sexp(), - "(program (lexical_declaration (variable_declarator name: (identifier) value: (number))))" -); -``` - [tree-sitter]: https://github.com/tree-sitter/tree-sitter ## Features @@ -149,4 +113,4 @@ assert_eq!( - Error types implement the `std::error:Error` trait. - `regex` performance optimizations are enabled. - The DOT graph methods are enabled. -- **wasm** - This feature allows `tree-sitter` to be built for Wasm targets using the `wasmtime-c-api` crate. +- **wasm** - This feature is enabled for Wasm targets. `tree-sitter` to be built for Wasm targets using the `wasmtime-c-api` crate. diff --git a/lib/binding_rust/bindings.rs b/lib/binding_rust/bindings.rs index ec00a7c6..445de081 100644 --- a/lib/binding_rust/bindings.rs +++ b/lib/binding_rust/bindings.rs @@ -1,6 +1,6 @@ -/* automatically generated by rust-bindgen 0.72.1 */ +/* automatically generated by rust-bindgen 0.70.0 */ -pub const TREE_SITTER_LANGUAGE_VERSION: u32 = 15; +pub const TREE_SITTER_LANGUAGE_VERSION: u32 = 14; pub const TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION: u32 = 13; pub type TSStateId = u16; pub type TSSymbol = u16; @@ -35,18 +35,12 @@ pub struct TSQueryCursor { pub struct TSLookaheadIterator { _unused: [u8; 0], } -pub type TSDecodeFunction = ::core::option::Option< - unsafe extern "C" fn(string: *const u8, length: u32, code_point: *mut i32) -> u32, ->; pub const TSInputEncodingUTF8: TSInputEncoding = 0; -pub const TSInputEncodingUTF16LE: TSInputEncoding = 1; -pub const TSInputEncodingUTF16BE: TSInputEncoding = 2; -pub const TSInputEncodingCustom: TSInputEncoding = 3; +pub const TSInputEncodingUTF16: TSInputEncoding = 1; pub type TSInputEncoding = ::core::ffi::c_uint; pub const TSSymbolTypeRegular: TSSymbolType = 0; pub const TSSymbolTypeAnonymous: TSSymbolType = 1; -pub const TSSymbolTypeSupertype: TSSymbolType = 2; -pub const TSSymbolTypeAuxiliary: TSSymbolType = 3; +pub const TSSymbolTypeAuxiliary: TSSymbolType = 2; pub type TSSymbolType = ::core::ffi::c_uint; #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -75,21 +69,6 @@ pub struct TSInput { ) -> *const ::core::ffi::c_char, >, pub encoding: TSInputEncoding, - pub decode: TSDecodeFunction, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct TSParseState { - pub payload: *mut ::core::ffi::c_void, - pub current_byte_offset: u32, - pub has_error: bool, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct TSParseOptions { - pub payload: *mut ::core::ffi::c_void, - pub progress_callback: - ::core::option::Option bool>, } pub const TSLogTypeParse: TSLogType = 0; pub const TSLogTypeLex: TSLogType = 1; @@ -168,27 +147,6 @@ pub const TSQueryErrorCapture: TSQueryError = 4; pub const TSQueryErrorStructure: TSQueryError = 5; pub const TSQueryErrorLanguage: TSQueryError = 6; pub type TSQueryError = ::core::ffi::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct TSQueryCursorState { - pub payload: *mut ::core::ffi::c_void, - pub current_byte_offset: u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct TSQueryCursorOptions { - pub payload: *mut ::core::ffi::c_void, - pub progress_callback: - ::core::option::Option bool>, -} -#[doc = " The metadata associated with a language.\n\n Currently, this metadata can be used to check the [Semantic Version](https://semver.org/)\n of the language. This version information should be used to signal if a given parser might\n be incompatible with existing queries when upgrading between major versions, or minor versions\n if it's in zerover."] -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct TSLanguageMetadata { - pub major_version: u8, - pub minor_version: u8, - pub patch_version: u8, -} extern "C" { #[doc = " Create a new parser."] pub fn ts_parser_new() -> *mut TSParser; @@ -202,7 +160,7 @@ extern "C" { pub fn ts_parser_language(self_: *const TSParser) -> *const TSLanguage; } extern "C" { - #[doc = " Set the language that the parser should use for parsing.\n\n Returns a boolean indicating whether or not the language was successfully\n assigned. True means assignment succeeded. False means there was a version\n mismatch: the language was generated with an incompatible version of the\n Tree-sitter CLI. Check the language's ABI version using [`ts_language_abi_version`]\n and compare it to this library's [`TREE_SITTER_LANGUAGE_VERSION`] and\n [`TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION`] constants."] + #[doc = " Set the language that the parser should use for parsing.\n\n Returns a boolean indicating whether or not the language was successfully\n assigned. True means assignment succeeded. False means there was a version\n mismatch: the language was generated with an incompatible version of the\n Tree-sitter CLI. Check the language's version using [`ts_language_version`]\n and compare it to this library's [`TREE_SITTER_LANGUAGE_VERSION`] and\n [`TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION`] constants."] pub fn ts_parser_set_language(self_: *mut TSParser, language: *const TSLanguage) -> bool; } extern "C" { @@ -218,22 +176,13 @@ extern "C" { pub fn ts_parser_included_ranges(self_: *const TSParser, count: *mut u32) -> *const TSRange; } extern "C" { - #[doc = " Use the parser to parse some source code and create a syntax tree.\n\n If you are parsing this document for the first time, pass `NULL` for the\n `old_tree` parameter. Otherwise, if you have already parsed an earlier\n version of this document and the document has since been edited, pass the\n previous syntax tree so that the unchanged parts of it can be reused.\n This will save time and memory. For this to work correctly, you must have\n already edited the old syntax tree using the [`ts_tree_edit`] function in a\n way that exactly matches the source code changes.\n\n The [`TSInput`] parameter lets you specify how to read the text. It has the\n following three fields:\n 1. [`read`]: A function to retrieve a chunk of text at a given byte offset\n and (row, column) position. The function should return a pointer to the\n text and write its length to the [`bytes_read`] pointer. The parser does\n not take ownership of this buffer; it just borrows it until it has\n finished reading it. The function should write a zero value to the\n [`bytes_read`] pointer to indicate the end of the document.\n 2. [`payload`]: An arbitrary pointer that will be passed to each invocation\n of the [`read`] function.\n 3. [`encoding`]: An indication of how the text is encoded. Either\n `TSInputEncodingUTF8` or `TSInputEncodingUTF16`.\n\n This function returns a syntax tree on success, and `NULL` on failure. There\n are four possible reasons for failure:\n 1. The parser does not have a language assigned. Check for this using the\n[`ts_parser_language`] function.\n 2. Parsing was cancelled due to the progress callback returning true. This callback\n is passed in [`ts_parser_parse_with_options`] inside the [`TSParseOptions`] struct.\n\n [`read`]: TSInput::read\n [`payload`]: TSInput::payload\n [`encoding`]: TSInput::encoding\n [`bytes_read`]: TSInput::read"] + #[doc = " Use the parser to parse some source code and create a syntax tree.\n\n If you are parsing this document for the first time, pass `NULL` for the\n `old_tree` parameter. Otherwise, if you have already parsed an earlier\n version of this document and the document has since been edited, pass the\n previous syntax tree so that the unchanged parts of it can be reused.\n This will save time and memory. For this to work correctly, you must have\n already edited the old syntax tree using the [`ts_tree_edit`] function in a\n way that exactly matches the source code changes.\n\n The [`TSInput`] parameter lets you specify how to read the text. It has the\n following three fields:\n 1. [`read`]: A function to retrieve a chunk of text at a given byte offset\n and (row, column) position. The function should return a pointer to the\n text and write its length to the [`bytes_read`] pointer. The parser does\n not take ownership of this buffer; it just borrows it until it has\n finished reading it. The function should write a zero value to the\n [`bytes_read`] pointer to indicate the end of the document.\n 2. [`payload`]: An arbitrary pointer that will be passed to each invocation\n of the [`read`] function.\n 3. [`encoding`]: An indication of how the text is encoded. Either\n `TSInputEncodingUTF8` or `TSInputEncodingUTF16`.\n\n This function returns a syntax tree on success, and `NULL` on failure. There\n are three possible reasons for failure:\n 1. The parser does not have a language assigned. Check for this using the\n[`ts_parser_language`] function.\n 2. Parsing was cancelled due to a timeout that was set by an earlier call to\n the [`ts_parser_set_timeout_micros`] function. You can resume parsing from\n where the parser left out by calling [`ts_parser_parse`] again with the\n same arguments. Or you can start parsing from scratch by first calling\n [`ts_parser_reset`].\n 3. Parsing was cancelled using a cancellation flag that was set by an\n earlier call to [`ts_parser_set_cancellation_flag`]. You can resume parsing\n from where the parser left out by calling [`ts_parser_parse`] again with\n the same arguments.\n\n [`read`]: TSInput::read\n [`payload`]: TSInput::payload\n [`encoding`]: TSInput::encoding\n [`bytes_read`]: TSInput::read"] pub fn ts_parser_parse( self_: *mut TSParser, old_tree: *const TSTree, input: TSInput, ) -> *mut TSTree; } -extern "C" { - #[doc = " Use the parser to parse some source code and create a syntax tree, with some options.\n\n See [`ts_parser_parse`] for more details.\n\n See [`TSParseOptions`] for more details on the options."] - pub fn ts_parser_parse_with_options( - self_: *mut TSParser, - old_tree: *const TSTree, - input: TSInput, - parse_options: TSParseOptions, - ) -> *mut TSTree; -} extern "C" { #[doc = " Use the parser to parse some source code stored in one contiguous buffer.\n The first two parameters are the same as in the [`ts_parser_parse`] function\n above. The second two parameters indicate the location of the buffer and its\n length in bytes."] pub fn ts_parser_parse_string( @@ -254,9 +203,25 @@ extern "C" { ) -> *mut TSTree; } extern "C" { - #[doc = " Instruct the parser to start the next parse from the beginning.\n\n If the parser previously failed because of the progress callback, then\n by default, it will resume where it left off on the next call to\n [`ts_parser_parse`] or other parsing functions. If you don't want to resume,\n and instead intend to use this parser to parse some other document, you must\n call [`ts_parser_reset`] first."] + #[doc = " Instruct the parser to start the next parse from the beginning.\n\n If the parser previously failed because of a timeout or a cancellation, then\n by default, it will resume where it left off on the next call to\n [`ts_parser_parse`] or other parsing functions. If you don't want to resume,\n and instead intend to use this parser to parse some other document, you must\n call [`ts_parser_reset`] first."] pub fn ts_parser_reset(self_: *mut TSParser); } +extern "C" { + #[doc = " Set the maximum duration in microseconds that parsing should be allowed to\n take before halting.\n\n If parsing takes longer than this, it will halt early, returning NULL.\n See [`ts_parser_parse`] for more information."] + pub fn ts_parser_set_timeout_micros(self_: *mut TSParser, timeout_micros: u64); +} +extern "C" { + #[doc = " Get the duration in microseconds that parsing is allowed to take."] + pub fn ts_parser_timeout_micros(self_: *const TSParser) -> u64; +} +extern "C" { + #[doc = " Set the parser's current cancellation flag pointer.\n\n If a non-null pointer is assigned, then the parser will periodically read\n from this pointer during parsing. If it reads a non-zero value, it will\n halt early, returning NULL. See [`ts_parser_parse`] for more information."] + pub fn ts_parser_set_cancellation_flag(self_: *mut TSParser, flag: *const usize); +} +extern "C" { + #[doc = " Get the parser's current cancellation flag pointer."] + pub fn ts_parser_cancellation_flag(self_: *const TSParser) -> *const usize; +} extern "C" { #[doc = " Set the logger that a parser should use during parsing.\n\n The parser does not take ownership over the logger payload. If a logger was\n previously assigned, the caller is responsible for releasing any memory\n owned by the previous logger."] pub fn ts_parser_set_logger(self_: *mut TSParser, logger: TSLogger); @@ -302,7 +267,7 @@ extern "C" { pub fn ts_tree_edit(self_: *mut TSTree, edit: *const TSInputEdit); } extern "C" { - #[doc = " Compare an old edited syntax tree to a new syntax tree representing the same\n document, returning an array of ranges whose syntactic structure has changed.\n\n For this to work correctly, the old syntax tree must have been edited such\n that its ranges match up to the new tree. Generally, you'll want to call\n this function right after calling one of the [`ts_parser_parse`] functions.\n You need to pass the old tree that was passed to parse, as well as the new\n tree that was returned from that function.\n\n The returned ranges indicate areas where the hierarchical structure of syntax\n nodes (from root to leaf) has changed between the old and new trees. Characters\n outside these ranges have identical ancestor nodes in both trees.\n\n Note that the returned ranges may be slightly larger than the exact changed areas,\n but Tree-sitter attempts to make them as small as possible.\n\n The returned array is allocated using `malloc` and the caller is responsible\n for freeing it using `free`. The length of the array will be written to the\n given `length` pointer."] + #[doc = " Compare an old edited syntax tree to a new syntax tree representing the same\n document, returning an array of ranges whose syntactic structure has changed.\n\n For this to work correctly, the old syntax tree must have been edited such\n that its ranges match up to the new tree. Generally, you'll want to call\n this function right after calling one of the [`ts_parser_parse`] functions.\n You need to pass the old tree that was passed to parse, as well as the new\n tree that was returned from that function.\n\n The returned array is allocated using `malloc` and the caller is responsible\n for freeing it using `free`. The length of the array will be written to the\n given `length` pointer."] pub fn ts_tree_get_changed_ranges( old_tree: *const TSTree, new_tree: *const TSTree, @@ -390,12 +355,12 @@ extern "C" { pub fn ts_node_next_parse_state(self_: TSNode) -> TSStateId; } extern "C" { - #[doc = " Get the node's immediate parent.\n Prefer [`ts_node_child_with_descendant`] for\n iterating over the node's ancestors."] + #[doc = " Get the node's immediate parent.\n Prefer [`ts_node_child_containing_descendant`] for\n iterating over the node's ancestors."] pub fn ts_node_parent(self_: TSNode) -> TSNode; } extern "C" { - #[doc = " Get the node that contains `descendant`.\n\n Note that this can return `descendant` itself."] - pub fn ts_node_child_with_descendant(self_: TSNode, descendant: TSNode) -> TSNode; + #[doc = " Get the node's child that contains `descendant`."] + pub fn ts_node_child_containing_descendant(self_: TSNode, descendant: TSNode) -> TSNode; } extern "C" { #[doc = " Get the node's child at the given index, where zero represents the first\n child."] @@ -454,11 +419,11 @@ extern "C" { pub fn ts_node_prev_named_sibling(self_: TSNode) -> TSNode; } extern "C" { - #[doc = " Get the node's first child that contains or starts after the given byte offset."] + #[doc = " Get the node's first child that extends beyond the given byte offset."] pub fn ts_node_first_child_for_byte(self_: TSNode, byte: u32) -> TSNode; } extern "C" { - #[doc = " Get the node's first named child that contains or starts after the given byte offset."] + #[doc = " Get the node's first named child that extends beyond the given byte offset."] pub fn ts_node_first_named_child_for_byte(self_: TSNode, byte: u32) -> TSNode; } extern "C" { @@ -496,15 +461,7 @@ extern "C" { pub fn ts_node_eq(self_: TSNode, other: TSNode) -> bool; } extern "C" { - #[doc = " Edit a point to keep it in-sync with source code that has been edited.\n\n This function updates a single point's byte offset and row/column position\n based on an edit operation. This is useful for editing points without\n requiring a tree or node instance."] - pub fn ts_point_edit(point: *mut TSPoint, point_byte: *mut u32, edit: *const TSInputEdit); -} -extern "C" { - #[doc = " Edit a range to keep it in-sync with source code that has been edited.\n\n This function updates a range's start and end positions based on an edit\n operation. This is useful for editing ranges without requiring a tree\n or node instance."] - pub fn ts_range_edit(range: *mut TSRange, edit: *const TSInputEdit); -} -extern "C" { - #[doc = " Create a new tree cursor starting from the given node.\n\n A tree cursor allows you to walk a syntax tree more efficiently than is\n possible using the [`TSNode`] functions. It is a mutable object that is always\n on a certain syntax node, and can be moved imperatively to different nodes.\n\n Note that the given node is considered the root of the cursor,\n and the cursor cannot walk outside this node."] + #[doc = " Create a new tree cursor starting from the given node.\n\n A tree cursor allows you to walk a syntax tree more efficiently than is\n possible using the [`TSNode`] functions. It is a mutable object that is always\n on a certain syntax node, and can be moved imperatively to different nodes."] pub fn ts_tree_cursor_new(node: TSNode) -> TSTreeCursor; } extern "C" { @@ -534,15 +491,15 @@ extern "C" { pub fn ts_tree_cursor_current_field_id(self_: *const TSTreeCursor) -> TSFieldId; } extern "C" { - #[doc = " Move the cursor to the parent of its current node.\n\n This returns `true` if the cursor successfully moved, and returns `false`\n if there was no parent node (the cursor was already on the root node).\n\n Note that the node the cursor was constructed with is considered the root\n of the cursor, and the cursor cannot walk outside this node."] + #[doc = " Move the cursor to the parent of its current node.\n\n This returns `true` if the cursor successfully moved, and returns `false`\n if there was no parent node (the cursor was already on the root node)."] pub fn ts_tree_cursor_goto_parent(self_: *mut TSTreeCursor) -> bool; } extern "C" { - #[doc = " Move the cursor to the next sibling of its current node.\n\n This returns `true` if the cursor successfully moved, and returns `false`\n if there was no next sibling node.\n\n Note that the node the cursor was constructed with is considered the root\n of the cursor, and the cursor cannot walk outside this node."] + #[doc = " Move the cursor to the next sibling of its current node.\n\n This returns `true` if the cursor successfully moved, and returns `false`\n if there was no next sibling node."] pub fn ts_tree_cursor_goto_next_sibling(self_: *mut TSTreeCursor) -> bool; } extern "C" { - #[doc = " Move the cursor to the previous sibling of its current node.\n\n This returns `true` if the cursor successfully moved, and returns `false` if\n there was no previous sibling node.\n\n Note, that this function may be slower than\n [`ts_tree_cursor_goto_next_sibling`] due to how node positions are stored. In\n the worst case, this will need to iterate through all the children up to the\n previous sibling node to recalculate its position. Also note that the node the cursor\n was constructed with is considered the root of the cursor, and the cursor cannot\n walk outside this node."] + #[doc = " Move the cursor to the previous sibling of its current node.\n\n This returns `true` if the cursor successfully moved, and returns `false` if\n there was no previous sibling node.\n\n Note, that this function may be slower than\n [`ts_tree_cursor_goto_next_sibling`] due to how node positions are stored. In\n the worst case, this will need to iterate through all the children upto the\n previous sibling node to recalculate its position."] pub fn ts_tree_cursor_goto_previous_sibling(self_: *mut TSTreeCursor) -> bool; } extern "C" { @@ -566,7 +523,7 @@ extern "C" { pub fn ts_tree_cursor_current_depth(self_: *const TSTreeCursor) -> u32; } extern "C" { - #[doc = " Move the cursor to the first child of its current node that contains or starts after\n the given byte offset or point.\n\n This returns the index of the child node if one was found, and returns -1\n if no such child was found."] + #[doc = " Move the cursor to the first child of its current node that extends beyond\n the given byte offset or point.\n\n This returns the index of the child node if one was found, and returns -1\n if no such child was found."] pub fn ts_tree_cursor_goto_first_child_for_byte( self_: *mut TSTreeCursor, goal_byte: u32, @@ -677,15 +634,6 @@ extern "C" { #[doc = " Start running a given query on a given node."] pub fn ts_query_cursor_exec(self_: *mut TSQueryCursor, query: *const TSQuery, node: TSNode); } -extern "C" { - #[doc = " Start running a given query on a given node, with some options."] - pub fn ts_query_cursor_exec_with_options( - self_: *mut TSQueryCursor, - query: *const TSQuery, - node: TSNode, - query_options: *const TSQueryCursorOptions, - ); -} extern "C" { #[doc = " Manage the maximum number of in-progress matches allowed by this query\n cursor.\n\n Query cursors have an optional maximum capacity for storing lists of\n in-progress captures. If this capacity is exceeded, then the\n earliest-starting match will silently be dropped to make room for further\n matches. This maximum capacity is optional — by default, query cursors allow\n any number of pending matches, dynamically allocating new space for them as\n needed as the query is executed."] pub fn ts_query_cursor_did_exceed_match_limit(self_: *const TSQueryCursor) -> bool; @@ -697,36 +645,27 @@ extern "C" { pub fn ts_query_cursor_set_match_limit(self_: *mut TSQueryCursor, limit: u32); } extern "C" { - #[doc = " Set the range of bytes in which the query will be executed.\n\n The query cursor will return matches that intersect with the given point range.\n This means that a match may be returned even if some of its captures fall\n outside the specified range, as long as at least part of the match\n overlaps with the range.\n\n For example, if a query pattern matches a node that spans a larger area\n than the specified range, but part of that node intersects with the range,\n the entire match will be returned.\n\n This will return `false` if the start byte is greater than the end byte, otherwise\n it will return `true`."] + #[doc = " Set the maximum duration in microseconds that query execution should be allowed to\n take before halting.\n\n If query execution takes longer than this, it will halt early, returning NULL.\n See [`ts_query_cursor_next_match`] or [`ts_query_cursor_next_capture`] for more information."] + pub fn ts_query_cursor_set_timeout_micros(self_: *mut TSQueryCursor, timeout_micros: u64); +} +extern "C" { + #[doc = " Get the duration in microseconds that query execution is allowed to take.\n\n This is set via [`ts_query_cursor_set_timeout_micros`]."] + pub fn ts_query_cursor_timeout_micros(self_: *const TSQueryCursor) -> u64; +} +extern "C" { + #[doc = " Set the range of bytes or (row, column) positions in which the query\n will be executed."] pub fn ts_query_cursor_set_byte_range( self_: *mut TSQueryCursor, start_byte: u32, end_byte: u32, - ) -> bool; + ); } extern "C" { - #[doc = " Set the range of (row, column) positions in which the query will be executed.\n\n The query cursor will return matches that intersect with the given point range.\n This means that a match may be returned even if some of its captures fall\n outside the specified range, as long as at least part of the match\n overlaps with the range.\n\n For example, if a query pattern matches a node that spans a larger area\n than the specified range, but part of that node intersects with the range,\n the entire match will be returned.\n\n This will return `false` if the start point is greater than the end point, otherwise\n it will return `true`."] pub fn ts_query_cursor_set_point_range( self_: *mut TSQueryCursor, start_point: TSPoint, end_point: TSPoint, - ) -> bool; -} -extern "C" { - #[doc = " Set the byte range within which all matches must be fully contained.\n\n Set the range of bytes in which matches will be searched for. In contrast to\n `ts_query_cursor_set_byte_range`, this will restrict the query cursor to only return\n matches where _all_ nodes are _fully_ contained within the given range. Both functions\n can be used together, e.g. to search for any matches that intersect line 5000, as\n long as they are fully contained within lines 4500-5500"] - pub fn ts_query_cursor_set_containing_byte_range( - self_: *mut TSQueryCursor, - start_byte: u32, - end_byte: u32, - ) -> bool; -} -extern "C" { - #[doc = " Set the point range within which all matches must be fully contained.\n\n Set the range of bytes in which matches will be searched for. In contrast to\n `ts_query_cursor_set_point_range`, this will restrict the query cursor to only return\n matches where _all_ nodes are _fully_ contained within the given range. Both functions\n can be used together, e.g. to search for any matches that intersect line 5000, as\n long as they are fully contained within lines 4500-5500"] - pub fn ts_query_cursor_set_containing_point_range( - self_: *mut TSQueryCursor, - start_point: TSPoint, - end_point: TSPoint, - ) -> bool; + ); } extern "C" { #[doc = " Advance to the next match of the currently running query.\n\n If there is a match, write it to `*match` and return `true`.\n Otherwise, return `false`."] @@ -737,7 +676,7 @@ extern "C" { pub fn ts_query_cursor_remove_match(self_: *mut TSQueryCursor, match_id: u32); } extern "C" { - #[doc = " Advance to the next capture of the currently running query.\n\n If there is a capture, write its match to `*match` and its index within\n the match's capture list to `*capture_index`. Otherwise, return `false`."] + #[doc = " Advance to the next capture of the currently running query.\n\n If there is a capture, write its match to `*match` and its index within\n the matche's capture list to `*capture_index`. Otherwise, return `false`."] pub fn ts_query_cursor_next_capture( self_: *mut TSQueryCursor, match_: *mut TSQueryMatch, @@ -764,6 +703,13 @@ extern "C" { #[doc = " Get the number of valid states in this language."] pub fn ts_language_state_count(self_: *const TSLanguage) -> u32; } +extern "C" { + #[doc = " Get a node type string for the given numerical id."] + pub fn ts_language_symbol_name( + self_: *const TSLanguage, + symbol: TSSymbol, + ) -> *const ::core::ffi::c_char; +} extern "C" { #[doc = " Get the numerical id for the given node type string."] pub fn ts_language_symbol_for_name( @@ -792,36 +738,13 @@ extern "C" { name_length: u32, ) -> TSFieldId; } -extern "C" { - #[doc = " Get a list of all supertype symbols for the language."] - pub fn ts_language_supertypes(self_: *const TSLanguage, length: *mut u32) -> *const TSSymbol; -} -extern "C" { - #[doc = " Get a list of all subtype symbol ids for a given supertype symbol.\n\n See [`ts_language_supertypes`] for fetching all supertype symbols."] - pub fn ts_language_subtypes( - self_: *const TSLanguage, - supertype: TSSymbol, - length: *mut u32, - ) -> *const TSSymbol; -} -extern "C" { - #[doc = " Get a node type string for the given numerical id."] - pub fn ts_language_symbol_name( - self_: *const TSLanguage, - symbol: TSSymbol, - ) -> *const ::core::ffi::c_char; -} extern "C" { #[doc = " Check whether the given node type id belongs to named nodes, anonymous nodes,\n or a hidden nodes.\n\n See also [`ts_node_is_named`]. Hidden nodes are never returned from the API."] pub fn ts_language_symbol_type(self_: *const TSLanguage, symbol: TSSymbol) -> TSSymbolType; } extern "C" { #[doc = " Get the ABI version number for this language. This version number is used\n to ensure that languages were generated by a compatible version of\n Tree-sitter.\n\n See also [`ts_parser_set_language`]."] - pub fn ts_language_abi_version(self_: *const TSLanguage) -> u32; -} -extern "C" { - #[doc = " Get the metadata for this language. This information is generated by the\n CLI, and relies on the language author providing the correct metadata in\n the language's `tree-sitter.json` file.\n\n See also [`TSMetadata`]."] - pub fn ts_language_metadata(self_: *const TSLanguage) -> *const TSLanguageMetadata; + pub fn ts_language_version(self_: *const TSLanguage) -> u32; } extern "C" { #[doc = " Get the next parse state. Combine this with lookahead iterators to generate\n completion suggestions or valid symbols in error nodes. Use\n [`ts_node_grammar_symbol`] for valid symbols."] @@ -831,10 +754,6 @@ extern "C" { symbol: TSSymbol, ) -> TSStateId; } -extern "C" { - #[doc = " Get the name of this language. This returns `NULL` in older parsers."] - pub fn ts_language_name(self_: *const TSLanguage) -> *const ::core::ffi::c_char; -} extern "C" { #[doc = " Create a new lookahead iterator for the given language and parse state.\n\n This returns `NULL` if state is invalid for the language.\n\n Repeatedly using [`ts_lookahead_iterator_next`] and\n [`ts_lookahead_iterator_current_symbol`] will generate valid symbols in the\n given parse state. Newly created lookahead iterators will contain the `ERROR`\n symbol.\n\n Lookahead iterators can be useful to generate suggestions and improve syntax\n error diagnostics. To get symbols valid in an ERROR node, use the lookahead\n iterator on its first leaf node state. For `MISSING` nodes, a lookahead\n iterator created on the previous non-extra leaf node may be appropriate."] pub fn ts_lookahead_iterator_new( @@ -924,7 +843,7 @@ extern "C" { ) -> *const TSLanguage; } extern "C" { - #[doc = " Get the number of languages instantiated in the given Wasm store."] + #[doc = " Get the number of languages instantiated in the given wasm store."] pub fn ts_wasm_store_language_count(arg1: *const TSWasmStore) -> usize; } extern "C" { diff --git a/lib/binding_rust/build.rs b/lib/binding_rust/build.rs index 57c5bc94..6f44e83c 100644 --- a/lib/binding_rust/build.rs +++ b/lib/binding_rust/build.rs @@ -2,7 +2,6 @@ use std::{env, fs, path::PathBuf}; fn main() { let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); - let target = env::var("TARGET").unwrap(); #[cfg(feature = "bindgen")] generate_bindings(&out_dir); @@ -27,11 +26,6 @@ fn main() { let include_path = manifest_path.join("include"); let src_path = manifest_path.join("src"); let wasm_path = src_path.join("wasm"); - - if target.starts_with("wasm32-unknown") { - configure_wasm_build(&mut config); - } - for entry in fs::read_dir(&src_path).unwrap() { let entry = entry.unwrap(); let path = src_path.join(entry.file_name()); @@ -47,10 +41,6 @@ fn main() { .include(&src_path) .include(&wasm_path) .include(&include_path) - .define("_POSIX_C_SOURCE", "200112L") - .define("_DEFAULT_SOURCE", None) - .define("_BSD_SOURCE", None) - .define("_DARWIN_C_SOURCE", None) .warnings(false) .file(src_path.join("lib.c")) .compile("tree-sitter"); @@ -58,28 +48,8 @@ fn main() { println!("cargo:include={}", include_path.display()); } -fn configure_wasm_build(config: &mut cc::Build) { - let Ok(wasm_headers) = env::var("DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS") else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_HEADERS must be set by the language crate"); - }; - let Ok(wasm_src) = env::var("DEP_TREE_SITTER_LANGUAGE_WASM_SRC").map(PathBuf::from) else { - panic!("Environment variable DEP_TREE_SITTER_LANGUAGE_WASM_SRC must be set by the language crate"); - }; - - config.include(&wasm_headers); - config.files([ - wasm_src.join("stdio.c"), - wasm_src.join("stdlib.c"), - wasm_src.join("string.c"), - ]); -} - #[cfg(feature = "bindgen")] fn generate_bindings(out_dir: &std::path::Path) { - use std::str::FromStr; - - use bindgen::RustTarget; - const HEADER_PATH: &str = "include/tree_sitter/api.h"; println!("cargo:rerun-if-changed={HEADER_PATH}"); @@ -98,8 +68,6 @@ fn generate_bindings(out_dir: &std::path::Path) { "TSQueryPredicateStep", ]; - let rust_version = env!("CARGO_PKG_RUST_VERSION"); - let bindings = bindgen::Builder::default() .header(HEADER_PATH) .layout_tests(false) @@ -109,16 +77,11 @@ fn generate_bindings(out_dir: &std::path::Path) { .no_copy(no_copy.join("|")) .prepend_enum_name(false) .use_core() - .clang_arg("-D TREE_SITTER_FEATURE_WASM") - .rust_target(RustTarget::from_str(rust_version).unwrap()) .generate() .expect("Failed to generate bindings"); let bindings_rs = out_dir.join("bindings.rs"); - bindings.write_to_file(&bindings_rs).unwrap_or_else(|_| { - panic!( - "Failed to write bindings into path: {}", - bindings_rs.display() - ) - }); + bindings + .write_to_file(&bindings_rs) + .unwrap_or_else(|_| panic!("Failed to write bindings into path: {bindings_rs:?}")); } diff --git a/lib/binding_rust/ffi.rs b/lib/binding_rust/ffi.rs index 4c68a633..ba3bcab6 100644 --- a/lib/binding_rust/ffi.rs +++ b/lib/binding_rust/ffi.rs @@ -1,7 +1,6 @@ #![allow(dead_code)] #![allow(non_upper_case_globals)] #![allow(non_camel_case_types)] -#![allow(clippy::missing_const_for_fn)] #[cfg(feature = "bindgen")] include!(concat!(env!("OUT_DIR"), "/bindings.rs")); @@ -9,14 +8,13 @@ include!(concat!(env!("OUT_DIR"), "/bindings.rs")); #[cfg(not(feature = "bindgen"))] include!("./bindings.rs"); -#[cfg(unix)] +#[cfg(any(unix, target_os = "wasi"))] #[cfg(feature = "std")] extern "C" { pub(crate) fn _ts_dup(fd: std::os::raw::c_int) -> std::os::raw::c_int; } #[cfg(windows)] -#[cfg(feature = "std")] extern "C" { pub(crate) fn _ts_dup(handle: *mut std::os::raw::c_void) -> std::os::raw::c_int; } @@ -24,8 +22,7 @@ extern "C" { use core::{marker::PhantomData, mem::ManuallyDrop, ptr::NonNull, str}; use crate::{ - Language, LookaheadIterator, Node, ParseState, Parser, Query, QueryCursor, QueryCursorState, - QueryError, Tree, TreeCursor, + Language, LookaheadIterator, Node, Parser, Query, QueryCursor, QueryError, Tree, TreeCursor, }; impl Language { @@ -70,24 +67,6 @@ impl Parser { } } -impl ParseState { - /// Reconstructs a [`ParseState`] from a raw pointer - /// - /// # Safety - /// - /// `ptr` must be non-null. - #[must_use] - pub const unsafe fn from_raw(ptr: *mut TSParseState) -> Self { - Self(NonNull::new_unchecked(ptr)) - } - - /// Consumes the [`ParseState`], returning a raw pointer to the underlying C structure. - #[must_use] - pub fn into_raw(self) -> *mut TSParseState { - ManuallyDrop::new(self).0.as_ptr() - } -} - impl Tree { /// Reconstructs a [`Tree`] from a raw pointer. /// @@ -106,7 +85,7 @@ impl Tree { } } -impl Node<'_> { +impl<'tree> Node<'tree> { /// Reconstructs a [`Node`] from a raw pointer. /// /// # Safety @@ -124,7 +103,7 @@ impl Node<'_> { } } -impl TreeCursor<'_> { +impl<'a> TreeCursor<'a> { /// Reconstructs a [`TreeCursor`] from a raw pointer. /// /// # Safety @@ -179,24 +158,6 @@ impl QueryCursor { } } -impl QueryCursorState { - /// Reconstructs a [`QueryCursorState`] from a raw pointer. - /// - /// # Safety - /// - /// `ptr` must be non-null. - #[must_use] - pub const unsafe fn from_raw(ptr: *mut TSQueryCursorState) -> Self { - Self(NonNull::new_unchecked(ptr)) - } - - /// Consumes the [`QueryCursorState`], returning a raw pointer to the underlying C structure. - #[must_use] - pub fn into_raw(self) -> *mut TSQueryCursorState { - ManuallyDrop::new(self).0.as_ptr() - } -} - impl LookaheadIterator { /// Reconstructs a [`LookaheadIterator`] from a raw pointer. /// diff --git a/lib/binding_rust/lib.rs b/lib/binding_rust/lib.rs index 51fd7f25..b5856c0d 100644 --- a/lib/binding_rust/lib.rs +++ b/lib/binding_rust/lib.rs @@ -1,7 +1,5 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("./README.md"))] +#![doc = include_str!("./README.md")] #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(docsrs, feature(doc_cfg))] - pub mod ffi; mod util; @@ -10,30 +8,30 @@ extern crate alloc; #[cfg(not(feature = "std"))] use alloc::{boxed::Box, format, string::String, string::ToString, vec::Vec}; use core::{ + char, ffi::{c_char, c_void, CStr}, fmt::{self, Write}, hash, iter, marker::PhantomData, mem::MaybeUninit, num::NonZeroU16, - ops::{self, ControlFlow, Deref}, + ops::{self, Deref}, ptr::{self, NonNull}, slice, str, + sync::atomic::AtomicUsize, }; #[cfg(feature = "std")] use std::error; -#[cfg(all(unix, feature = "std"))] +#[cfg(all(feature = "std", any(unix, target_os = "wasi")))] use std::os::fd::AsRawFd; #[cfg(all(windows, feature = "std"))] use std::os::windows::io::AsRawHandle; -pub use streaming_iterator::{StreamingIterator, StreamingIteratorMut}; use tree_sitter_language::LanguageFn; #[cfg(feature = "wasm")] mod wasm_language; #[cfg(feature = "wasm")] -#[cfg_attr(docsrs, doc(cfg(feature = "wasm")))] pub use wasm_language::*; /// The latest ABI version that is supported by the current version of the @@ -52,6 +50,7 @@ pub const LANGUAGE_VERSION: usize = ffi::TREE_SITTER_LANGUAGE_VERSION as usize; pub const MIN_COMPATIBLE_LANGUAGE_VERSION: usize = ffi::TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION as usize; +pub const ARRAY_HEADER: &str = include_str!("../src/array.h"); pub const PARSER_HEADER: &str = include_str!("../src/parser.h"); /// An opaque object that defines how to parse a particular language. The code @@ -63,29 +62,6 @@ pub struct Language(*const ffi::TSLanguage); pub struct LanguageRef<'a>(*const ffi::TSLanguage, PhantomData<&'a ()>); -/// The metadata associated with a language. -/// -/// Currently, this metadata can be used to check the [Semantic Version](https://semver.org/) -/// of the language. This version information should be used to signal if a given parser might -/// be incompatible with existing queries when upgrading between major versions, or minor versions -/// if it's in zerover. -#[doc(alias = "TSLanguageMetadata")] -pub struct LanguageMetadata { - pub major_version: u8, - pub minor_version: u8, - pub patch_version: u8, -} - -impl From for LanguageMetadata { - fn from(val: ffi::TSLanguageMetadata) -> Self { - Self { - major_version: val.major_version, - minor_version: val.minor_version, - patch_version: val.patch_version, - } - } -} - /// A tree that represents the syntactic structure of a source code file. #[doc(alias = "TSTree")] pub struct Tree(NonNull); @@ -120,48 +96,6 @@ pub struct InputEdit { pub new_end_position: Point, } -impl InputEdit { - /// Edit a point to keep it in-sync with source code that has been edited. - /// - /// This function updates a single point's byte offset and row/column position - /// based on this edit operation. This is useful for editing points without - /// requiring a tree or node instance. - #[doc(alias = "ts_point_edit")] - pub fn edit_point(&self, point: &mut Point, byte: &mut usize) { - let edit = self.into(); - let mut ts_point = (*point).into(); - let mut ts_byte = *byte as u32; - - unsafe { - ffi::ts_point_edit( - core::ptr::addr_of_mut!(ts_point), - core::ptr::addr_of_mut!(ts_byte), - &edit, - ); - } - - *point = ts_point.into(); - *byte = ts_byte as usize; - } - - /// Edit a range to keep it in-sync with source code that has been edited. - /// - /// This function updates a range's start and end positions based on this edit - /// operation. This is useful for editing ranges without requiring a tree - /// or node instance. - #[doc(alias = "ts_range_edit")] - pub fn edit_range(&self, range: &mut Range) { - let edit = self.into(); - let mut ts_range = (*range).into(); - - unsafe { - ffi::ts_range_edit(core::ptr::addr_of_mut!(ts_range), &edit); - } - - *range = ts_range.into(); - } -} - /// A single node within a syntax [`Tree`]. #[doc(alias = "TSNode")] #[derive(Clone, Copy)] @@ -179,118 +113,6 @@ pub struct Parser(NonNull); pub struct LookaheadIterator(NonNull); struct LookaheadNamesIterator<'a>(&'a mut LookaheadIterator); -/// A stateful object that is passed into a [`ParseProgressCallback`] -/// to pass in the current state of the parser. -pub struct ParseState(NonNull); - -impl ParseState { - #[must_use] - pub const fn current_byte_offset(&self) -> usize { - unsafe { self.0.as_ref() }.current_byte_offset as usize - } - - #[must_use] - pub const fn has_error(&self) -> bool { - unsafe { self.0.as_ref() }.has_error - } -} - -/// A stateful object that is passed into a [`QueryProgressCallback`] -/// to pass in the current state of the query execution. -pub struct QueryCursorState(NonNull); - -impl QueryCursorState { - #[must_use] - pub const fn current_byte_offset(&self) -> usize { - unsafe { self.0.as_ref() }.current_byte_offset as usize - } -} - -#[derive(Default)] -pub struct ParseOptions<'a> { - pub progress_callback: Option>, -} - -impl<'a> ParseOptions<'a> { - #[must_use] - pub fn new() -> Self { - Self::default() - } - - #[must_use] - pub fn progress_callback ControlFlow<()>>( - mut self, - callback: &'a mut F, - ) -> Self { - self.progress_callback = Some(callback); - self - } - - /// Create a new `ParseOptions` with a shorter lifetime, borrowing from this one. - /// - /// This is useful when you need to reuse parse options multiple times, e.g., calling - /// [`Parser::parse_with_options`] multiple times with the same options. - #[must_use] - pub fn reborrow(&mut self) -> ParseOptions { - ParseOptions { - progress_callback: match &mut self.progress_callback { - Some(cb) => Some(*cb), - None => None, - }, - } - } -} - -#[derive(Default)] -pub struct QueryCursorOptions<'a> { - pub progress_callback: Option>, -} - -impl<'a> QueryCursorOptions<'a> { - #[must_use] - pub fn new() -> Self { - Self::default() - } - - #[must_use] - pub fn progress_callback ControlFlow<()>>( - mut self, - callback: &'a mut F, - ) -> Self { - self.progress_callback = Some(callback); - self - } - - /// Create a new `QueryCursorOptions` with a shorter lifetime, borrowing from this one. - /// - /// This is useful when you need to reuse query cursor options multiple times, e.g., calling - /// [`QueryCursor::matches`] multiple times with the same options. - #[must_use] - pub fn reborrow(&mut self) -> QueryCursorOptions { - QueryCursorOptions { - progress_callback: match &mut self.progress_callback { - Some(cb) => Some(*cb), - None => None, - }, - } - } -} - -struct QueryCursorOptionsDrop(*mut ffi::TSQueryCursorOptions); - -impl Drop for QueryCursorOptionsDrop { - fn drop(&mut self) { - unsafe { - if !(*self.0).payload.is_null() { - drop(Box::from_raw( - (*self.0).payload.cast::(), - )); - } - drop(Box::from_raw(self.0)); - } - } -} - /// A type of log message. #[derive(Debug, PartialEq, Eq)] pub enum LogType { @@ -300,24 +122,12 @@ pub enum LogType { type FieldId = NonZeroU16; -/// A callback that receives log messages during parsing. +/// A callback that receives log messages during parser. type Logger<'a> = Box; -/// A callback that receives the parse state during parsing. -type ParseProgressCallback<'a> = &'a mut dyn FnMut(&ParseState) -> ControlFlow<()>; - -/// A callback that receives the query state during query execution. -type QueryProgressCallback<'a> = &'a mut dyn FnMut(&QueryCursorState) -> ControlFlow<()>; - -pub trait Decode { - /// A callback that decodes the next code point from the input slice. It should return the code - /// point, and how many bytes were decoded. - fn decode(bytes: &[u8]) -> (i32, u32); -} - /// A stateful object for walking a syntax [`Tree`] efficiently. #[doc(alias = "TSTreeCursor")] -pub struct TreeCursor<'tree>(ffi::TSTreeCursor, PhantomData<&'tree ()>); +pub struct TreeCursor<'cursor>(ffi::TSTreeCursor, PhantomData<&'cursor ()>); /// A set of patterns that match nodes in a syntax tree. #[doc(alias = "TSQuery")] @@ -351,7 +161,7 @@ impl From for CaptureQuantifier { ffi::TSQuantifierZeroOrMore => Self::ZeroOrMore, ffi::TSQuantifierOne => Self::One, ffi::TSQuantifierOneOrMore => Self::OneOrMore, - _ => unreachable!(), + _ => panic!("Unrecognized quantifier: {value}"), } } } @@ -392,30 +202,23 @@ pub struct QueryMatch<'cursor, 'tree> { } /// A sequence of [`QueryMatch`]es associated with a given [`QueryCursor`]. -pub struct QueryMatches<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> { +pub struct QueryMatches<'query, 'cursor, T: TextProvider, I: AsRef<[u8]>> { ptr: *mut ffi::TSQueryCursor, query: &'query Query, text_provider: T, buffer1: Vec, buffer2: Vec, - current_match: Option>, - _options: Option, - _phantom: PhantomData<(&'tree (), I)>, + _phantom: PhantomData<(&'cursor (), I)>, } /// A sequence of [`QueryCapture`]s associated with a given [`QueryCursor`]. -/// -/// During iteration, each element contains a [`QueryMatch`] and index. The index can -/// be used to access the new capture inside of the [`QueryMatch::captures`]'s [`captures`]. -pub struct QueryCaptures<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> { +pub struct QueryCaptures<'query, 'cursor, T: TextProvider, I: AsRef<[u8]>> { ptr: *mut ffi::TSQueryCursor, query: &'query Query, text_provider: T, buffer1: Vec, buffer2: Vec, - current_match: Option<(QueryMatch<'query, 'tree>, usize)>, - _options: Option, - _phantom: PhantomData<(&'tree (), I)>, + _phantom: PhantomData<(&'cursor (), I)>, } pub trait TextProvider @@ -436,13 +239,10 @@ pub struct QueryCapture<'tree> { } /// An error that occurred when trying to assign an incompatible [`Language`] to -/// a [`Parser`]. If the `wasm` feature is enabled, this can also indicate a failure -/// to load the Wasm store. +/// a [`Parser`]. #[derive(Debug, PartialEq, Eq)] -pub enum LanguageError { - Version(usize), - #[cfg(feature = "wasm")] - Wasm, +pub struct LanguageError { + version: usize, } /// An error that occurred in [`Parser::set_included_ranges`]. @@ -483,7 +283,7 @@ enum TextPredicateCapture { AnyString(u32, Box<[Box]>, bool), } -// TODO: Remove this struct at some point. If `core::str::lossy::Utf8Lossy` +// TODO: Remove this struct at at some point. If `core::str::lossy::Utf8Lossy` // is ever stabilized. pub struct LossyUtf8<'a> { bytes: &'a [u8], @@ -496,34 +296,12 @@ impl Language { Self(unsafe { builder.into_raw()().cast() }) } - /// Get the name of this language. This returns `None` in older parsers. - #[doc(alias = "ts_language_name")] - #[must_use] - pub fn name(&self) -> Option<&'static str> { - let ptr = unsafe { ffi::ts_language_name(self.0) }; - (!ptr.is_null()).then(|| unsafe { CStr::from_ptr(ptr) }.to_str().unwrap()) - } - /// Get the ABI version number that indicates which version of the /// Tree-sitter CLI that was used to generate this [`Language`]. - #[doc(alias = "ts_language_abi_version")] + #[doc(alias = "ts_language_version")] #[must_use] - pub fn abi_version(&self) -> usize { - unsafe { ffi::ts_language_abi_version(self.0) as usize } - } - - /// Get the metadata for this language. This information is generated by the - /// CLI, and relies on the language author providing the correct metadata in - /// the language's `tree-sitter.json` file. - /// - /// See also [`LanguageMetadata`]. - #[doc(alias = "ts_language_metadata")] - #[must_use] - pub fn metadata(&self) -> Option { - unsafe { - let ptr = ffi::ts_language_metadata(self.0); - (!ptr.is_null()).then(|| (*ptr).into()) - } + pub fn version(&self) -> usize { + unsafe { ffi::ts_language_version(self.0) as usize } } /// Get the number of distinct node types in this language. @@ -540,36 +318,6 @@ impl Language { unsafe { ffi::ts_language_state_count(self.0) as usize } } - /// Get a list of all supertype symbols for the language. - #[doc(alias = "ts_language_supertypes")] - #[must_use] - pub fn supertypes(&self) -> &[u16] { - let mut length = 0u32; - unsafe { - let ptr = ffi::ts_language_supertypes(self.0, core::ptr::addr_of_mut!(length)); - if length == 0 { - &[] - } else { - slice::from_raw_parts(ptr.cast_mut(), length as usize) - } - } - } - - /// Get a list of all subtype symbols for a given supertype symbol. - #[doc(alias = "ts_language_supertype_map")] - #[must_use] - pub fn subtypes_for_supertype(&self, supertype: u16) -> &[u16] { - unsafe { - let mut length = 0u32; - let ptr = ffi::ts_language_subtypes(self.0, supertype, core::ptr::addr_of_mut!(length)); - if length == 0 { - &[] - } else { - slice::from_raw_parts(ptr.cast_mut(), length as usize) - } - } - } - /// Get the name of the node kind for the given numerical id. #[doc(alias = "ts_language_symbol_name")] #[must_use] @@ -599,19 +347,12 @@ impl Language { unsafe { ffi::ts_language_symbol_type(self.0, id) == ffi::TSSymbolTypeRegular } } - /// Check if the node type for the given numerical id is visible (as opposed - /// to a hidden node type). + #[doc(alias = "ts_language_symbol_type")] #[must_use] pub fn node_kind_is_visible(&self, id: u16) -> bool { unsafe { ffi::ts_language_symbol_type(self.0, id) <= ffi::TSSymbolTypeAnonymous } } - /// Check if the node type for the given numerical id is a supertype. - #[must_use] - pub fn node_kind_is_supertype(&self, id: u16) -> bool { - unsafe { ffi::ts_language_symbol_type(self.0, id) == ffi::TSSymbolTypeSupertype } - } - /// Get the number of distinct field names in this language. #[doc(alias = "ts_language_field_count")] #[must_use] @@ -619,7 +360,7 @@ impl Language { unsafe { ffi::ts_language_field_count(self.0) as usize } } - /// Get the field name for the given numerical id. + /// Get the field names for the given numerical id. #[doc(alias = "ts_language_field_name_for_id")] #[must_use] pub fn field_name_for_id(&self, field_id: u16) -> Option<&'static str> { @@ -647,7 +388,7 @@ impl Language { /// generate completion suggestions or valid symbols in error nodes. /// /// Example: - /// ```ignore + /// ``` /// let state = language.next_state(node.parse_state(), node.grammar_id()); /// ``` #[doc(alias = "ts_language_next_state")] @@ -665,7 +406,7 @@ impl Language { /// symbol from [`LookaheadIterator::current_symbol`]. /// /// Lookahead iterators can be useful to generate suggestions and improve - /// syntax error diagnostics. To get symbols valid in an `ERROR` node, use the + /// syntax error diagnostics. To get symbols valid in an ERROR node, use the /// lookahead iterator on its first leaf node state. For `MISSING` nodes, a /// lookahead iterator created on the previous non-extra leaf node may be /// appropriate. @@ -695,7 +436,7 @@ impl Drop for Language { } } -impl Deref for LanguageRef<'_> { +impl<'a> Deref for LanguageRef<'a> { type Target = Language; fn deref(&self) -> &Self::Target { @@ -727,29 +468,28 @@ impl Parser { /// version mismatch: the language was generated with an incompatible /// version of the Tree-sitter CLI. Check the language's version using /// [`Language::version`] and compare it to this library's - /// [`LANGUAGE_VERSION`] and [`MIN_COMPATIBLE_LANGUAGE_VERSION`] constants. + /// [`LANGUAGE_VERSION`](LANGUAGE_VERSION) and + /// [`MIN_COMPATIBLE_LANGUAGE_VERSION`](MIN_COMPATIBLE_LANGUAGE_VERSION) + /// constants. #[doc(alias = "ts_parser_set_language")] pub fn set_language(&mut self, language: &Language) -> Result<(), LanguageError> { - let version = language.abi_version(); + let version = language.version(); if (MIN_COMPATIBLE_LANGUAGE_VERSION..=LANGUAGE_VERSION).contains(&version) { - #[allow(unused_variables)] - let success = unsafe { ffi::ts_parser_set_language(self.0.as_ptr(), language.0) }; - #[cfg(feature = "wasm")] - if !success { - return Err(LanguageError::Wasm); + unsafe { + ffi::ts_parser_set_language(self.0.as_ptr(), language.0); } Ok(()) } else { - Err(LanguageError::Version(version)) + Err(LanguageError { version }) } } /// Get the parser's current language. #[doc(alias = "ts_parser_language")] #[must_use] - pub fn language(&self) -> Option> { + pub fn language(&self) -> Option { let ptr = unsafe { ffi::ts_parser_language(self.0.as_ptr()) }; - (!ptr.is_null()).then_some(LanguageRef(ptr, PhantomData)) + (!ptr.is_null()).then(|| Language(ptr)) } /// Get the parser's current logger. @@ -760,7 +500,7 @@ impl Parser { unsafe { logger.payload.cast::().as_ref() } } - /// Set the logging callback that the parser should use during parsing. + /// Set the logging callback that a parser should use during parsing. #[doc(alias = "ts_parser_set_logger")] pub fn set_logger(&mut self, logger: Option) { let prev_logger = unsafe { ffi::ts_parser_logger(self.0.as_ptr()) }; @@ -768,7 +508,8 @@ impl Parser { drop(unsafe { Box::from_raw(prev_logger.payload.cast::()) }); } - let c_logger = if let Some(logger) = logger { + let c_logger; + if let Some(logger) = logger { let container = Box::new(logger); unsafe extern "C" fn log( @@ -789,16 +530,16 @@ impl Parser { let raw_container = Box::into_raw(container); - ffi::TSLogger { + c_logger = ffi::TSLogger { payload: raw_container.cast::(), log: Some(log), - } + }; } else { - ffi::TSLogger { + c_logger = ffi::TSLogger { payload: ptr::null_mut(), log: None, - } - }; + }; + } unsafe { ffi::ts_parser_set_logger(self.0.as_ptr(), c_logger) }; } @@ -808,15 +549,13 @@ impl Parser { /// want to pipe these graphs directly to a `dot(1)` process in order to /// generate SVG output. #[doc(alias = "ts_parser_print_dot_graphs")] - #[cfg(not(target_os = "wasi"))] #[cfg(feature = "std")] - #[cfg_attr(docsrs, doc(cfg(feature = "std")))] pub fn print_dot_graphs( &mut self, - #[cfg(unix)] file: &impl AsRawFd, + #[cfg(any(unix, target_os = "wasi"))] file: &impl AsRawFd, #[cfg(windows)] file: &impl AsRawHandle, ) { - #[cfg(unix)] + #[cfg(any(unix, target_os = "wasi"))] { let fd = file.as_raw_fd(); unsafe { @@ -835,9 +574,6 @@ impl Parser { /// Stop the parser from printing debugging graphs while parsing. #[doc(alias = "ts_parser_print_dot_graphs")] - #[cfg(not(target_os = "wasi"))] - #[cfg(feature = "std")] - #[cfg_attr(docsrs, doc(cfg(feature = "std")))] pub fn stop_printing_dot_graphs(&mut self) { unsafe { ffi::ts_parser_print_dot_graphs(self.0.as_ptr(), -1) } } @@ -852,18 +588,39 @@ impl Parser { /// /// Returns a [`Tree`] if parsing succeeded, or `None` if: /// * The parser has not yet had a language assigned with [`Parser::set_language`] + /// * The timeout set with [`Parser::set_timeout_micros`] expired + /// * The cancellation flag set with [`Parser::set_cancellation_flag`] was flipped #[doc(alias = "ts_parser_parse")] pub fn parse(&mut self, text: impl AsRef<[u8]>, old_tree: Option<&Tree>) -> Option { let bytes = text.as_ref(); let len = bytes.len(); - self.parse_with_options( + self.parse_with( &mut |i, _| (i < len).then(|| &bytes[i..]).unwrap_or_default(), old_tree, - None, ) } - /// Parse text provided in chunks by a callback. + /// Parse a slice of UTF16 text. + /// + /// # Arguments: + /// * `text` The UTF16-encoded text to parse. + /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the + /// document has changed since `old_tree` was created, then you must edit `old_tree` to match + /// the new text using [`Tree::edit`]. + pub fn parse_utf16( + &mut self, + input: impl AsRef<[u16]>, + old_tree: Option<&Tree>, + ) -> Option { + let code_points = input.as_ref(); + let len = code_points.len(); + self.parse_utf16_with( + &mut |i, _| (i < len).then(|| &code_points[i..]).unwrap_or_default(), + old_tree, + ) + } + + /// Parse UTF8 text provided in chunks by a callback. /// /// # Arguments: /// * `callback` A function that takes a byte offset and position and returns a slice of @@ -873,27 +630,17 @@ impl Parser { /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the /// document has changed since `old_tree` was created, then you must edit `old_tree` to match /// the new text using [`Tree::edit`]. - /// * `options` Options for parsing the text. This can be used to set a progress callback. - pub fn parse_with_options, F: FnMut(usize, Point) -> T>( + pub fn parse_with, F: FnMut(usize, Point) -> T>( &mut self, callback: &mut F, old_tree: Option<&Tree>, - options: Option, ) -> Option { - type Payload<'a, F, T> = (&'a mut F, Option); - - // This C function is passed to Tree-sitter as the progress callback. - unsafe extern "C" fn progress(state: *mut ffi::TSParseState) -> bool { - let callback = (*state) - .payload - .cast::() - .as_mut() - .unwrap(); - match callback(&ParseState::from_raw(state)) { - ControlFlow::Continue(()) => false, - ControlFlow::Break(()) => true, - } - } + // A pointer to this payload is passed on every call to the `read` C function. + // The payload contains two things: + // 1. A reference to the rust `callback`. + // 2. The text that was returned from the previous call to `callback`. This allows the + // callback to return owned values like vectors. + let mut payload: (&mut F, Option) = (callback, None); // This C function is passed to Tree-sitter as the input callback. unsafe extern "C" fn read, F: FnMut(usize, Point) -> T>( @@ -902,82 +649,27 @@ impl Parser { position: ffi::TSPoint, bytes_read: *mut u32, ) -> *const c_char { - let (callback, text) = payload.cast::>().as_mut().unwrap(); + let (callback, text) = payload.cast::<(&mut F, Option)>().as_mut().unwrap(); *text = Some(callback(byte_offset as usize, position.into())); let slice = text.as_ref().unwrap().as_ref(); *bytes_read = slice.len() as u32; slice.as_ptr().cast::() } - let empty_options = ffi::TSParseOptions { - payload: ptr::null_mut(), - progress_callback: None, - }; - - let mut callback_ptr; - let parse_options = if let Some(options) = options { - if let Some(cb) = options.progress_callback { - callback_ptr = cb; - ffi::TSParseOptions { - payload: core::ptr::addr_of_mut!(callback_ptr).cast::(), - progress_callback: Some(progress), - } - } else { - empty_options - } - } else { - empty_options - }; - - // A pointer to this payload is passed on every call to the `read` C function. - // The payload contains two things: - // 1. A reference to the rust `callback`. - // 2. The text that was returned from the previous call to `callback`. This allows the - // callback to return owned values like vectors. - let mut payload: Payload = (callback, None); - let c_input = ffi::TSInput { - payload: ptr::addr_of_mut!(payload).cast::(), + payload: core::ptr::addr_of_mut!(payload).cast::(), read: Some(read::), encoding: ffi::TSInputEncodingUTF8, - decode: None, }; let c_old_tree = old_tree.map_or(ptr::null_mut(), |t| t.0.as_ptr()); unsafe { - let c_new_tree = ffi::ts_parser_parse_with_options( - self.0.as_ptr(), - c_old_tree, - c_input, - parse_options, - ); - + let c_new_tree = ffi::ts_parser_parse(self.0.as_ptr(), c_old_tree, c_input); NonNull::new(c_new_tree).map(Tree) } } - /// Parse a slice of UTF16 little-endian text. - /// - /// # Arguments: - /// * `text` The UTF16-encoded text to parse. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - pub fn parse_utf16_le( - &mut self, - input: impl AsRef<[u16]>, - old_tree: Option<&Tree>, - ) -> Option { - let code_points = input.as_ref(); - let len = code_points.len(); - self.parse_utf16_le_with_options( - &mut |i, _| (i < len).then(|| &code_points[i..]).unwrap_or_default(), - old_tree, - None, - ) - } - - /// Parse UTF16 little-endian text provided in chunks by a callback. + /// Parse UTF16 text provided in chunks by a callback. /// /// # Arguments: /// * `callback` A function that takes a code point offset and position and returns a slice of @@ -987,26 +679,17 @@ impl Parser { /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the /// document has changed since `old_tree` was created, then you must edit `old_tree` to match /// the new text using [`Tree::edit`]. - /// * `options` Options for parsing the text. This can be used to set a progress callback. - pub fn parse_utf16_le_with_options, F: FnMut(usize, Point) -> T>( + pub fn parse_utf16_with, F: FnMut(usize, Point) -> T>( &mut self, callback: &mut F, old_tree: Option<&Tree>, - options: Option, ) -> Option { - type Payload<'a, F, T> = (&'a mut F, Option); - - unsafe extern "C" fn progress(state: *mut ffi::TSParseState) -> bool { - let callback = (*state) - .payload - .cast::() - .as_mut() - .unwrap(); - match callback(&ParseState::from_raw(state)) { - ControlFlow::Continue(()) => false, - ControlFlow::Break(()) => true, - } - } + // A pointer to this payload is passed on every call to the `read` C function. + // The payload contains two things: + // 1. A reference to the rust `callback`. + // 2. The text that was returned from the previous call to `callback`. This allows the + // callback to return owned values like vectors. + let mut payload: (&mut F, Option) = (callback, None); // This C function is passed to Tree-sitter as the input callback. unsafe extern "C" fn read, F: FnMut(usize, Point) -> T>( @@ -1015,7 +698,7 @@ impl Parser { position: ffi::TSPoint, bytes_read: *mut u32, ) -> *const c_char { - let (callback, text) = payload.cast::>().as_mut().unwrap(); + let (callback, text) = payload.cast::<(&mut F, Option)>().as_mut().unwrap(); *text = Some(callback( (byte_offset / 2) as usize, Point { @@ -1028,295 +711,50 @@ impl Parser { slice.as_ptr().cast::() } - let empty_options = ffi::TSParseOptions { - payload: ptr::null_mut(), - progress_callback: None, - }; - - let mut callback_ptr; - let parse_options = if let Some(options) = options { - if let Some(cb) = options.progress_callback { - callback_ptr = cb; - ffi::TSParseOptions { - payload: core::ptr::addr_of_mut!(callback_ptr).cast::(), - progress_callback: Some(progress), - } - } else { - empty_options - } - } else { - empty_options - }; - - // A pointer to this payload is passed on every call to the `read` C function. - // The payload contains two things: - // 1. A reference to the rust `callback`. - // 2. The text that was returned from the previous call to `callback`. This allows the - // callback to return owned values like vectors. - let mut payload: Payload = (callback, None); - let c_input = ffi::TSInput { payload: core::ptr::addr_of_mut!(payload).cast::(), read: Some(read::), - encoding: ffi::TSInputEncodingUTF16LE, - decode: None, + encoding: ffi::TSInputEncodingUTF16, }; let c_old_tree = old_tree.map_or(ptr::null_mut(), |t| t.0.as_ptr()); unsafe { - let c_new_tree = ffi::ts_parser_parse_with_options( - self.0.as_ptr(), - c_old_tree, - c_input, - parse_options, - ); - - NonNull::new(c_new_tree).map(Tree) - } - } - - /// Parse a slice of UTF16 big-endian text. - /// - /// # Arguments: - /// * `text` The UTF16-encoded text to parse. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - pub fn parse_utf16_be( - &mut self, - input: impl AsRef<[u16]>, - old_tree: Option<&Tree>, - ) -> Option { - let code_points = input.as_ref(); - let len = code_points.len(); - self.parse_utf16_be_with_options( - &mut |i, _| if i < len { &code_points[i..] } else { &[] }, - old_tree, - None, - ) - } - - /// Parse UTF16 big-endian text provided in chunks by a callback. - /// - /// # Arguments: - /// * `callback` A function that takes a code point offset and position and returns a slice of - /// UTF16-encoded text starting at that byte offset and position. The slices can be of any - /// length. If the given position is at the end of the text, the callback should return an - /// empty slice. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - /// * `options` Options for parsing the text. This can be used to set a progress callback. - pub fn parse_utf16_be_with_options, F: FnMut(usize, Point) -> T>( - &mut self, - callback: &mut F, - old_tree: Option<&Tree>, - options: Option, - ) -> Option { - type Payload<'a, F, T> = (&'a mut F, Option); - - // This C function is passed to Tree-sitter as the progress callback. - unsafe extern "C" fn progress(state: *mut ffi::TSParseState) -> bool { - let callback = (*state) - .payload - .cast::() - .as_mut() - .unwrap(); - match callback(&ParseState::from_raw(state)) { - ControlFlow::Continue(()) => false, - ControlFlow::Break(()) => true, - } - } - - // This C function is passed to Tree-sitter as the input callback. - unsafe extern "C" fn read, F: FnMut(usize, Point) -> T>( - payload: *mut c_void, - byte_offset: u32, - position: ffi::TSPoint, - bytes_read: *mut u32, - ) -> *const c_char { - let (callback, text) = payload.cast::>().as_mut().unwrap(); - *text = Some(callback( - (byte_offset / 2) as usize, - Point { - row: position.row as usize, - column: position.column as usize / 2, - }, - )); - let slice = text.as_ref().unwrap().as_ref(); - *bytes_read = slice.len() as u32 * 2; - slice.as_ptr().cast::() - } - - let empty_options = ffi::TSParseOptions { - payload: ptr::null_mut(), - progress_callback: None, - }; - - let mut callback_ptr; - let parse_options = if let Some(options) = options { - if let Some(cb) = options.progress_callback { - callback_ptr = cb; - ffi::TSParseOptions { - payload: core::ptr::addr_of_mut!(callback_ptr).cast::(), - progress_callback: Some(progress), - } - } else { - empty_options - } - } else { - empty_options - }; - - // A pointer to this payload is passed on every call to the `read` C function. - // The payload contains two things: - // 1. A reference to the rust `callback`. - // 2. The text that was returned from the previous call to `callback`. This allows the - // callback to return owned values like vectors. - let mut payload: Payload = (callback, None); - - let c_input = ffi::TSInput { - payload: core::ptr::addr_of_mut!(payload).cast::(), - read: Some(read::), - encoding: ffi::TSInputEncodingUTF16BE, - decode: None, - }; - - let c_old_tree = old_tree.map_or(ptr::null_mut(), |t| t.0.as_ptr()); - unsafe { - let c_new_tree = ffi::ts_parser_parse_with_options( - self.0.as_ptr(), - c_old_tree, - c_input, - parse_options, - ); - - NonNull::new(c_new_tree).map(Tree) - } - } - - /// Parse text provided in chunks by a callback using a custom encoding. - /// This is useful for parsing text in encodings that are not UTF-8 or UTF-16. - /// - /// # Arguments: - /// * `callback` A function that takes a byte offset and position and returns a slice of text - /// starting at that byte offset and position. The slices can be of any length. If the given - /// position is at the end of the text, the callback should return an empty slice. - /// * `old_tree` A previous syntax tree parsed from the same document. If the text of the - /// document has changed since `old_tree` was created, then you must edit `old_tree` to match - /// the new text using [`Tree::edit`]. - /// * `options` Options for parsing the text. This can be used to set a progress callback. - /// - /// Additionally, you must set the generic parameter [`D`] to a type that implements the - /// [`Decode`] trait. This trait has a single method, [`decode`](Decode::decode), which takes a - /// slice of bytes and returns a tuple of the code point and the number of bytes consumed. - /// The `decode` method should return `-1` for the code point if decoding fails. - pub fn parse_custom_encoding, F: FnMut(usize, Point) -> T>( - &mut self, - callback: &mut F, - old_tree: Option<&Tree>, - options: Option, - ) -> Option { - type Payload<'a, F, T> = (&'a mut F, Option); - - unsafe extern "C" fn progress(state: *mut ffi::TSParseState) -> bool { - let callback = (*state) - .payload - .cast::() - .as_mut() - .unwrap(); - match callback(&ParseState::from_raw(state)) { - ControlFlow::Continue(()) => false, - ControlFlow::Break(()) => true, - } - } - - // At compile time, create a C-compatible callback that calls the custom `decode` method. - unsafe extern "C" fn decode_fn( - data: *const u8, - len: u32, - code_point: *mut i32, - ) -> u32 { - let (c, len) = D::decode(core::slice::from_raw_parts(data, len as usize)); - if let Some(code_point) = code_point.as_mut() { - *code_point = c; - } - len - } - - // This C function is passed to Tree-sitter as the input callback. - unsafe extern "C" fn read, F: FnMut(usize, Point) -> T>( - payload: *mut c_void, - byte_offset: u32, - position: ffi::TSPoint, - bytes_read: *mut u32, - ) -> *const c_char { - let (callback, text) = payload.cast::>().as_mut().unwrap(); - *text = Some(callback(byte_offset as usize, position.into())); - let slice = text.as_ref().unwrap().as_ref(); - *bytes_read = slice.len() as u32; - slice.as_ptr().cast::() - } - - let empty_options = ffi::TSParseOptions { - payload: ptr::null_mut(), - progress_callback: None, - }; - - let mut callback_ptr; - let parse_options = if let Some(options) = options { - if let Some(cb) = options.progress_callback { - callback_ptr = cb; - ffi::TSParseOptions { - payload: core::ptr::addr_of_mut!(callback_ptr).cast::(), - progress_callback: Some(progress), - } - } else { - empty_options - } - } else { - empty_options - }; - - // A pointer to this payload is passed on every call to the `read` C function. - // The payload contains two things: - // 1. A reference to the rust `callback`. - // 2. The text that was returned from the previous call to `callback`. This allows the - // callback to return owned values like vectors. - let mut payload: Payload = (callback, None); - - let c_input = ffi::TSInput { - payload: core::ptr::addr_of_mut!(payload).cast::(), - read: Some(read::), - encoding: ffi::TSInputEncodingCustom, - // Use this custom decode callback - decode: Some(decode_fn::), - }; - - let c_old_tree = old_tree.map_or(ptr::null_mut(), |t| t.0.as_ptr()); - unsafe { - let c_new_tree = ffi::ts_parser_parse_with_options( - self.0.as_ptr(), - c_old_tree, - c_input, - parse_options, - ); - + let c_new_tree = ffi::ts_parser_parse(self.0.as_ptr(), c_old_tree, c_input); NonNull::new(c_new_tree).map(Tree) } } /// Instruct the parser to start the next parse from the beginning. /// - /// If the parser previously failed because of a callback, then by default, - /// it will resume where it left off on the next call to [`parse`](Parser::parse) - /// or other parsing functions. If you don't want to resume, and instead intend to use - /// this parser to parse some other document, you must call `reset` first. + /// If the parser previously failed because of a timeout or a cancellation, + /// then by default, it will resume where it left off on the next call + /// to [`parse`](Parser::parse) or other parsing functions. If you don't + /// want to resume, and instead intend to use this parser to parse some + /// other document, you must call `reset` first. #[doc(alias = "ts_parser_reset")] pub fn reset(&mut self) { unsafe { ffi::ts_parser_reset(self.0.as_ptr()) } } + /// Get the duration in microseconds that parsing is allowed to take. + /// + /// This is set via [`set_timeout_micros`](Parser::set_timeout_micros). + #[doc(alias = "ts_parser_timeout_micros")] + #[must_use] + pub fn timeout_micros(&self) -> u64 { + unsafe { ffi::ts_parser_timeout_micros(self.0.as_ptr()) } + } + + /// Set the maximum duration in microseconds that parsing should be allowed + /// to take before halting. + /// + /// If parsing takes longer than this, it will halt early, returning `None`. + /// See [`parse`](Parser::parse) for more information. + #[doc(alias = "ts_parser_set_timeout_micros")] + pub fn set_timeout_micros(&mut self, timeout_micros: u64) { + unsafe { ffi::ts_parser_set_timeout_micros(self.0.as_ptr(), timeout_micros) } + } + /// Set the ranges of text that the parser should include when parsing. /// /// By default, the parser will always include entire documents. This @@ -1372,25 +810,51 @@ impl Parser { result } } + + /// Get the parser's current cancellation flag pointer. + /// + /// # Safety + /// + /// It uses FFI + #[doc(alias = "ts_parser_cancellation_flag")] + #[must_use] + pub unsafe fn cancellation_flag(&self) -> Option<&AtomicUsize> { + ffi::ts_parser_cancellation_flag(self.0.as_ptr()) + .cast::() + .as_ref() + } + + /// Set the parser's current cancellation flag pointer. + /// + /// If a pointer is assigned, then the parser will periodically read from + /// this pointer during parsing. If it reads a non-zero value, it will halt + /// early, returning `None`. See [`parse`](Parser::parse) for more + /// information. + /// + /// # Safety + /// + /// It uses FFI + #[doc(alias = "ts_parser_set_cancellation_flag")] + pub unsafe fn set_cancellation_flag(&mut self, flag: Option<&AtomicUsize>) { + if let Some(flag) = flag { + ffi::ts_parser_set_cancellation_flag( + self.0.as_ptr(), + (flag as *const AtomicUsize).cast::(), + ); + } else { + ffi::ts_parser_set_cancellation_flag(self.0.as_ptr(), ptr::null()); + } + } } impl Drop for Parser { fn drop(&mut self) { - #[cfg(feature = "std")] - #[cfg(not(target_os = "wasi"))] - { - self.stop_printing_dot_graphs(); - } + self.stop_printing_dot_graphs(); self.set_logger(None); unsafe { ffi::ts_parser_delete(self.0.as_ptr()) } } } -#[cfg(windows)] -extern "C" { - fn _open_osfhandle(osfhandle: isize, flags: core::ffi::c_int) -> core::ffi::c_int; -} - impl Tree { /// Get the root node of the syntax tree. #[doc(alias = "ts_tree_root_node")] @@ -1483,15 +947,13 @@ impl Tree { /// graph directly to a `dot(1)` process in order to generate SVG /// output. #[doc(alias = "ts_tree_print_dot_graph")] - #[cfg(not(target_os = "wasi"))] #[cfg(feature = "std")] - #[cfg_attr(docsrs, doc(cfg(feature = "std")))] pub fn print_dot_graph( &self, - #[cfg(unix)] file: &impl AsRawFd, + #[cfg(any(unix, target_os = "wasi"))] file: &impl AsRawFd, #[cfg(windows)] file: &impl AsRawHandle, ) { - #[cfg(unix)] + #[cfg(any(unix, target_os = "wasi"))] { let fd = file.as_raw_fd(); unsafe { ffi::ts_tree_print_dot_graph(self.0.as_ptr(), fd) } @@ -1500,8 +962,7 @@ impl Tree { #[cfg(windows)] { let handle = file.as_raw_handle(); - let fd = unsafe { _open_osfhandle(handle as isize, 0) }; - unsafe { ffi::ts_tree_print_dot_graph(self.0.as_ptr(), fd) } + unsafe { ffi::ts_tree_print_dot_graph(self.0.as_ptr(), handle as i32) } } } } @@ -1531,14 +992,10 @@ impl<'tree> Node<'tree> { /// Get a numeric id for this node that is unique. /// - /// Within a given syntax tree, no two nodes have the same id. However: - /// - /// - If a new tree is created based on an older tree, and a node from the old tree is reused in - /// the process, then that node will have the same id in both trees. - /// - /// - A node not marked as having changes does not guarantee it was reused. - /// - /// - If a node is marked as having changed in the old tree, it will not be reused. + /// Within a given syntax tree, no two nodes have the same id. However, if + /// a new tree is created based on an older tree, and a node from the old + /// tree is reused in the process, then that node will have the same id in + /// both trees. #[must_use] pub fn id(&self) -> usize { self.0.id as usize @@ -1581,7 +1038,7 @@ impl<'tree> Node<'tree> { /// Get the [`Language`] that was used to parse this node's syntax tree. #[doc(alias = "ts_node_language")] #[must_use] - pub fn language(&self) -> LanguageRef<'tree> { + pub fn language(&self) -> LanguageRef { LanguageRef(unsafe { ffi::ts_node_language(self.0) }, PhantomData) } @@ -1597,7 +1054,7 @@ impl<'tree> Node<'tree> { /// Check if this node is *extra*. /// - /// Extra nodes represent things like comments, which are not required by the + /// Extra nodes represent things like comments, which are not required the /// grammar, but can appear anywhere. #[doc(alias = "ts_node_is_extra")] #[must_use] @@ -1654,14 +1111,14 @@ impl<'tree> Node<'tree> { unsafe { ffi::ts_node_is_missing(self.0) } } - /// Get the byte offset where this node starts. + /// Get the byte offsets where this node starts. #[doc(alias = "ts_node_start_byte")] #[must_use] pub fn start_byte(&self) -> usize { unsafe { ffi::ts_node_start_byte(self.0) as usize } } - /// Get the byte offset where this node ends. + /// Get the byte offsets where this node end. #[doc(alias = "ts_node_end_byte")] #[must_use] pub fn end_byte(&self) -> usize { @@ -1710,8 +1167,8 @@ impl<'tree> Node<'tree> { /// [`Node::children`] instead. #[doc(alias = "ts_node_child")] #[must_use] - pub fn child(&self, i: u32) -> Option { - Self::new(unsafe { ffi::ts_node_child(self.0, i) }) + pub fn child(&self, i: usize) -> Option { + Self::new(unsafe { ffi::ts_node_child(self.0, i as u32) }) } /// Get this node's number of children. @@ -1729,8 +1186,8 @@ impl<'tree> Node<'tree> { /// [`Node::named_children`] instead. #[doc(alias = "ts_node_named_child")] #[must_use] - pub fn named_child(&self, i: u32) -> Option { - Self::new(unsafe { ffi::ts_node_named_child(self.0, i) }) + pub fn named_child(&self, i: usize) -> Option { + Self::new(unsafe { ffi::ts_node_named_child(self.0, i as u32) }) } /// Get this node's number of *named* children. @@ -1780,7 +1237,6 @@ impl<'tree> Node<'tree> { } /// Get the field name of this node's named child at the given index. - #[must_use] pub fn field_name_for_named_child(&self, named_child_index: u32) -> Option<&'static str> { unsafe { let ptr = ffi::ts_node_field_name_for_named_child(self.0, named_child_index); @@ -1891,7 +1347,7 @@ impl<'tree> Node<'tree> { } /// Get this node's immediate parent. - /// Prefer [`child_with_descendant`](Node::child_with_descendant) + /// Prefer [`child_containing_descendant`](Node::child_containing_descendant) /// for iterating over this node's ancestors. #[doc(alias = "ts_node_parent")] #[must_use] @@ -1899,13 +1355,11 @@ impl<'tree> Node<'tree> { Self::new(unsafe { ffi::ts_node_parent(self.0) }) } - /// Get the node that contains `descendant`. - /// - /// Note that this can return `descendant` itself. - #[doc(alias = "ts_node_child_with_descendant")] + /// Get this node's child that contains `descendant`. + #[doc(alias = "ts_node_child_containing_descendant")] #[must_use] - pub fn child_with_descendant(&self, descendant: Self) -> Option { - Self::new(unsafe { ffi::ts_node_child_with_descendant(self.0, descendant.0) }) + pub fn child_containing_descendant(&self, descendant: Self) -> Option { + Self::new(unsafe { ffi::ts_node_child_containing_descendant(self.0, descendant.0) }) } /// Get this node's next sibling. @@ -1936,14 +1390,14 @@ impl<'tree> Node<'tree> { Self::new(unsafe { ffi::ts_node_prev_named_sibling(self.0) }) } - /// Get this node's first child that contains or starts after the given byte offset. + /// Get the node's first child that extends beyond the given byte offset. #[doc(alias = "ts_node_first_child_for_byte")] #[must_use] pub fn first_child_for_byte(&self, byte: usize) -> Option { Self::new(unsafe { ffi::ts_node_first_child_for_byte(self.0, byte as u32) }) } - /// Get this node's first named child that contains or starts after the given byte offset. + /// Get the node's first named child that extends beyond the given byte offset. #[doc(alias = "ts_node_first_named_child_for_point")] #[must_use] pub fn first_named_child_for_byte(&self, byte: usize) -> Option { @@ -1957,7 +1411,7 @@ impl<'tree> Node<'tree> { unsafe { ffi::ts_node_descendant_count(self.0) as usize } } - /// Get the smallest node within this node that spans the given byte range. + /// Get the smallest node within this node that spans the given range. #[doc(alias = "ts_node_descendant_for_byte_range")] #[must_use] pub fn descendant_for_byte_range(&self, start: usize, end: usize) -> Option { @@ -1966,7 +1420,7 @@ impl<'tree> Node<'tree> { }) } - /// Get the smallest named node within this node that spans the given byte range. + /// Get the smallest named node within this node that spans the given range. #[doc(alias = "ts_node_named_descendant_for_byte_range")] #[must_use] pub fn named_descendant_for_byte_range(&self, start: usize, end: usize) -> Option { @@ -1975,7 +1429,7 @@ impl<'tree> Node<'tree> { }) } - /// Get the smallest node within this node that spans the given point range. + /// Get the smallest node within this node that spans the given range. #[doc(alias = "ts_node_descendant_for_point_range")] #[must_use] pub fn descendant_for_point_range(&self, start: Point, end: Point) -> Option { @@ -1984,7 +1438,7 @@ impl<'tree> Node<'tree> { }) } - /// Get the smallest named node within this node that spans the given point range. + /// Get the smallest named node within this node that spans the given range. #[doc(alias = "ts_node_named_descendant_for_point_range")] #[must_use] pub fn named_descendant_for_point_range(&self, start: Point, end: Point) -> Option { @@ -1993,7 +1447,6 @@ impl<'tree> Node<'tree> { }) } - /// Get an S-expression representing the node. #[doc(alias = "ts_node_string")] #[must_use] pub fn to_sexp(&self) -> String { @@ -2012,13 +1465,10 @@ impl<'tree> Node<'tree> { #[must_use] pub fn utf16_text<'a>(&self, source: &'a [u16]) -> &'a [u16] { - &source[self.start_byte() / 2..self.end_byte() / 2] + &source[self.start_byte()..self.end_byte()] } /// Create a new [`TreeCursor`] starting from this node. - /// - /// Note that the given node is considered the root of the cursor, - /// and the cursor cannot walk outside this node. #[doc(alias = "ts_tree_cursor_new")] #[must_use] pub fn walk(&self) -> TreeCursor<'tree> { @@ -2041,7 +1491,7 @@ impl<'tree> Node<'tree> { impl PartialEq for Node<'_> { fn eq(&self, other: &Self) -> bool { - core::ptr::eq(self.0.id, other.0.id) + self.0.id == other.0.id } } @@ -2082,11 +1532,11 @@ impl fmt::Display for Node<'_> { } } -impl<'tree> TreeCursor<'tree> { +impl<'cursor> TreeCursor<'cursor> { /// Get the tree cursor's current [`Node`]. #[doc(alias = "ts_tree_cursor_current_node")] #[must_use] - pub fn node(&self) -> Node<'tree> { + pub fn node(&self) -> Node<'cursor> { Node( unsafe { ffi::ts_tree_cursor_current_node(&self.0) }, PhantomData, @@ -2156,9 +1606,6 @@ impl<'tree> TreeCursor<'tree> { /// This returns `true` if the cursor successfully moved, and returns /// `false` if there was no parent node (the cursor was already on the /// root node). - /// - /// Note that the node the cursor was constructed with is considered the root - /// of the cursor, and the cursor cannot walk outside this node. #[doc(alias = "ts_tree_cursor_goto_parent")] pub fn goto_parent(&mut self) -> bool { unsafe { ffi::ts_tree_cursor_goto_parent(&mut self.0) } @@ -2168,9 +1615,6 @@ impl<'tree> TreeCursor<'tree> { /// /// This returns `true` if the cursor successfully moved, and returns /// `false` if there was no next sibling node. - /// - /// Note that the node the cursor was constructed with is considered the root - /// of the cursor, and the cursor cannot walk outside this node. #[doc(alias = "ts_tree_cursor_goto_next_sibling")] pub fn goto_next_sibling(&mut self) -> bool { unsafe { ffi::ts_tree_cursor_goto_next_sibling(&mut self.0) } @@ -2192,16 +1636,15 @@ impl<'tree> TreeCursor<'tree> { /// Note, that this function may be slower than /// [`goto_next_sibling`](TreeCursor::goto_next_sibling) due to how node /// positions are stored. In the worst case, this will need to iterate - /// through all the children up to the previous sibling node to recalculate - /// its position. Also note that the node the cursor was constructed with is - /// considered the root of the cursor, and the cursor cannot walk outside this node. + /// through all the children upto the previous sibling node to recalculate + /// its position. #[doc(alias = "ts_tree_cursor_goto_previous_sibling")] pub fn goto_previous_sibling(&mut self) -> bool { unsafe { ffi::ts_tree_cursor_goto_previous_sibling(&mut self.0) } } - /// Move this cursor to the first child of its current node that contains or - /// starts after the given byte offset. + /// Move this cursor to the first child of its current node that extends + /// beyond the given byte offset. /// /// This returns the index of the child node if one was found, and returns /// `None` if no such child was found. @@ -2209,11 +1652,11 @@ impl<'tree> TreeCursor<'tree> { pub fn goto_first_child_for_byte(&mut self, index: usize) -> Option { let result = unsafe { ffi::ts_tree_cursor_goto_first_child_for_byte(&mut self.0, index as u32) }; - result.try_into().ok() + (result >= 0).then_some(result as usize) } - /// Move this cursor to the first child of its current node that contains or - /// starts after the given byte offset. + /// Move this cursor to the first child of its current node that extends + /// beyond the given byte offset. /// /// This returns the index of the child node if one was found, and returns /// `None` if no such child was found. @@ -2221,13 +1664,13 @@ impl<'tree> TreeCursor<'tree> { pub fn goto_first_child_for_point(&mut self, point: Point) -> Option { let result = unsafe { ffi::ts_tree_cursor_goto_first_child_for_point(&mut self.0, point.into()) }; - result.try_into().ok() + (result >= 0).then_some(result as usize) } /// Re-initialize this tree cursor to start at the original node that the /// cursor was constructed with. #[doc(alias = "ts_tree_cursor_reset")] - pub fn reset(&mut self, node: Node<'tree>) { + pub fn reset(&mut self, node: Node<'cursor>) { unsafe { ffi::ts_tree_cursor_reset(&mut self.0, node.0) }; } @@ -2343,16 +1786,6 @@ impl Query { /// on syntax nodes parsed with that language. References to Queries can be /// shared between multiple threads. pub fn new(language: &Language, source: &str) -> Result { - let ptr = Self::new_raw(language, source)?; - unsafe { Self::from_raw_parts(ptr, source) } - } - - /// Constructs a raw [`TSQuery`](ffi::TSQuery) pointer without performing extra checks specific to the rust - /// bindings, such as predicate validation. A [`Query`] object can be constructed from the - /// returned pointer using [`from_raw_parts`](Query::from_raw_parts). The caller is - /// responsible for ensuring that the returned pointer is eventually freed by calling - /// [`ts_query_delete`](ffi::ts_query_delete). - pub fn new_raw(language: &Language, source: &str) -> Result<*mut ffi::TSQuery, QueryError> { let mut error_offset = 0u32; let mut error_type: ffi::TSQueryError = 0; let bytes = source.as_bytes(); @@ -2368,90 +1801,77 @@ impl Query { ) }; - if !ptr.is_null() { - return Ok(ptr); - } - // On failure, build an error based on the error code and offset. - if error_type == ffi::TSQueryErrorLanguage { + if ptr.is_null() { + if error_type == ffi::TSQueryErrorLanguage { + return Err(QueryError { + row: 0, + column: 0, + offset: 0, + message: LanguageError { + version: language.version(), + } + .to_string(), + kind: QueryErrorKind::Language, + }); + } + + let offset = error_offset as usize; + let mut line_start = 0; + let mut row = 0; + let mut line_containing_error = None; + for line in source.lines() { + let line_end = line_start + line.len() + 1; + if line_end > offset { + line_containing_error = Some(line); + break; + } + line_start = line_end; + row += 1; + } + let column = offset - line_start; + + let kind; + let message; + match error_type { + // Error types that report names + ffi::TSQueryErrorNodeType | ffi::TSQueryErrorField | ffi::TSQueryErrorCapture => { + let suffix = source.split_at(offset).1; + let end_offset = suffix + .find(|c| !char::is_alphanumeric(c) && c != '_' && c != '-') + .unwrap_or(suffix.len()); + message = suffix.split_at(end_offset).0.to_string(); + kind = match error_type { + ffi::TSQueryErrorNodeType => QueryErrorKind::NodeType, + ffi::TSQueryErrorField => QueryErrorKind::Field, + ffi::TSQueryErrorCapture => QueryErrorKind::Capture, + _ => unreachable!(), + }; + } + + // Error types that report positions + _ => { + message = line_containing_error.map_or_else( + || "Unexpected EOF".to_string(), + |line| line.to_string() + "\n" + &" ".repeat(offset - line_start) + "^", + ); + kind = match error_type { + ffi::TSQueryErrorStructure => QueryErrorKind::Structure, + _ => QueryErrorKind::Syntax, + }; + } + }; + return Err(QueryError { - row: 0, - column: 0, - offset: 0, - message: LanguageError::Version(language.abi_version()).to_string(), - kind: QueryErrorKind::Language, + row, + column, + offset, + message, + kind, }); } - let offset = error_offset as usize; - let mut line_start = 0; - let mut row = 0; - let mut line_containing_error = None; - for line in source.lines() { - let line_end = line_start + line.len() + 1; - if line_end > offset { - line_containing_error = Some(line); - break; - } - line_start = line_end; - row += 1; - } - let column = offset - line_start; - - let kind; - let message; - match error_type { - // Error types that report names - ffi::TSQueryErrorNodeType | ffi::TSQueryErrorField | ffi::TSQueryErrorCapture => { - let suffix = source.split_at(offset).1; - let in_quotes = offset > 0 && source.as_bytes()[offset - 1] == b'"'; - let mut backslashes = 0; - let end_offset = suffix - .find(|c| { - if in_quotes { - if c == '"' && backslashes % 2 == 0 { - true - } else if c == '\\' { - backslashes += 1; - false - } else { - backslashes = 0; - false - } - } else { - !char::is_alphanumeric(c) && c != '_' && c != '-' - } - }) - .unwrap_or(suffix.len()); - message = format!("\"{}\"", suffix.split_at(end_offset).0); - kind = match error_type { - ffi::TSQueryErrorNodeType => QueryErrorKind::NodeType, - ffi::TSQueryErrorField => QueryErrorKind::Field, - ffi::TSQueryErrorCapture => QueryErrorKind::Capture, - _ => unreachable!(), - }; - } - - // Error types that report positions - _ => { - message = line_containing_error.map_or_else( - || "Unexpected EOF".to_string(), - |line| line.to_string() + "\n" + &" ".repeat(offset - line_start) + "^", - ); - kind = match error_type { - ffi::TSQueryErrorStructure => QueryErrorKind::Structure, - _ => QueryErrorKind::Syntax, - }; - } - } - - Err(QueryError { - row, - column, - offset, - message, - kind, - }) + unsafe { Self::from_raw_parts(ptr, source) } } #[doc(hidden)] @@ -2490,7 +1910,7 @@ impl Query { } } - // Build a vector to store capture quantifiers. + // Build a vector to store capture qunatifiers. for i in 0..pattern_count { let mut capture_quantifiers = Vec::with_capacity(capture_count as usize); for j in 0..capture_count { @@ -2965,6 +2385,26 @@ impl QueryCursor { } } + /// Set the maximum duration in microseconds that query execution should be allowed to + /// take before halting. + /// + /// If query execution takes longer than this, it will halt early, returning None. + #[doc(alias = "ts_query_cursor_set_timeout_micros")] + pub fn set_timeout_micros(&mut self, timeout: u64) { + unsafe { + ffi::ts_query_cursor_set_timeout_micros(self.ptr.as_ptr(), timeout); + } + } + + /// Get the duration in microseconds that query execution is allowed to take. + /// + /// This is set via [`set_timeout_micros`](QueryCursor::set_timeout_micros). + #[doc(alias = "ts_query_cursor_timeout_micros")] + #[must_use] + pub fn timeout_micros(&self) -> u64 { + unsafe { ffi::ts_query_cursor_timeout_micros(self.ptr.as_ptr()) } + } + /// Check if, on its last execution, this cursor exceeded its maximum number /// of in-progress matches. #[doc(alias = "ts_query_cursor_did_exceed_match_limit")] @@ -2979,10 +2419,6 @@ impl QueryCursor { /// captures. Because multiple patterns can match the same set of nodes, /// one match may contain captures that appear *before* some of the /// captures from a previous match. - /// - /// Iterating over a `QueryMatches` object requires the `StreamingIterator` - /// or `StreamingIteratorMut` trait to be in scope. This can be done via - /// `use tree_sitter::StreamingIterator` or `use tree_sitter::StreamingIteratorMut` #[doc(alias = "ts_query_cursor_exec")] pub fn matches<'query, 'cursor: 'query, 'tree, T: TextProvider, I: AsRef<[u8]>>( &'cursor mut self, @@ -2998,68 +2434,6 @@ impl QueryCursor { text_provider, buffer1: Vec::default(), buffer2: Vec::default(), - current_match: None, - _options: None, - _phantom: PhantomData, - } - } - - /// Iterate over all of the matches in the order that they were found, with options. - /// - /// Each match contains the index of the pattern that matched, and a list of - /// captures. Because multiple patterns can match the same set of nodes, - /// one match may contain captures that appear *before* some of the - /// captures from a previous match. - #[doc(alias = "ts_query_cursor_exec_with_options")] - pub fn matches_with_options< - 'query, - 'cursor: 'query, - 'tree, - T: TextProvider, - I: AsRef<[u8]>, - >( - &'cursor mut self, - query: &'query Query, - node: Node<'tree>, - text_provider: T, - options: QueryCursorOptions, - ) -> QueryMatches<'query, 'tree, T, I> { - unsafe extern "C" fn progress(state: *mut ffi::TSQueryCursorState) -> bool { - let callback = (*state) - .payload - .cast::() - .as_mut() - .unwrap(); - match callback(&QueryCursorState::from_raw(state)) { - ControlFlow::Continue(()) => false, - ControlFlow::Break(()) => true, - } - } - - let query_options = options.progress_callback.map(|cb| { - QueryCursorOptionsDrop(Box::into_raw(Box::new(ffi::TSQueryCursorOptions { - payload: Box::into_raw(Box::new(cb)).cast::(), - progress_callback: Some(progress), - }))) - }); - - let ptr = self.ptr.as_ptr(); - unsafe { - ffi::ts_query_cursor_exec_with_options( - ptr, - query.ptr.as_ptr(), - node.0, - query_options.as_ref().map_or(ptr::null_mut(), |q| q.0), - ); - } - QueryMatches { - ptr, - query, - text_provider, - buffer1: Vec::default(), - buffer2: Vec::default(), - current_match: None, - _options: query_options, _phantom: PhantomData, } } @@ -3069,10 +2443,6 @@ impl QueryCursor { /// /// This is useful if you don't care about which pattern matched, and just /// want a single, ordered sequence of captures. - /// - /// Iterating over a `QueryCaptures` object requires the `StreamingIterator` - /// or `StreamingIteratorMut` trait to be in scope. This can be done via - /// `use tree_sitter::StreamingIterator` or `use tree_sitter::StreamingIteratorMut` #[doc(alias = "ts_query_cursor_exec")] pub fn captures<'query, 'cursor: 'query, 'tree, T: TextProvider, I: AsRef<[u8]>>( &'cursor mut self, @@ -3088,67 +2458,6 @@ impl QueryCursor { text_provider, buffer1: Vec::default(), buffer2: Vec::default(), - current_match: None, - _options: None, - _phantom: PhantomData, - } - } - - /// Iterate over all of the individual captures in the order that they - /// appear, with options. - /// - /// This is useful if you don't care about which pattern matched, and just - /// want a single, ordered sequence of captures. - #[doc(alias = "ts_query_cursor_exec")] - pub fn captures_with_options< - 'query, - 'cursor: 'query, - 'tree, - T: TextProvider, - I: AsRef<[u8]>, - >( - &'cursor mut self, - query: &'query Query, - node: Node<'tree>, - text_provider: T, - options: QueryCursorOptions, - ) -> QueryCaptures<'query, 'tree, T, I> { - unsafe extern "C" fn progress(state: *mut ffi::TSQueryCursorState) -> bool { - let callback = (*state) - .payload - .cast::() - .as_mut() - .unwrap(); - match callback(&QueryCursorState::from_raw(state)) { - ControlFlow::Continue(()) => false, - ControlFlow::Break(()) => true, - } - } - - let query_options = options.progress_callback.map(|cb| { - QueryCursorOptionsDrop(Box::into_raw(Box::new(ffi::TSQueryCursorOptions { - payload: Box::into_raw(Box::new(cb)).cast::(), - progress_callback: Some(progress), - }))) - }); - - let ptr = self.ptr.as_ptr(); - unsafe { - ffi::ts_query_cursor_exec_with_options( - ptr, - query.ptr.as_ptr(), - node.0, - query_options.as_ref().map_or(ptr::null_mut(), |q| q.0), - ); - } - QueryCaptures { - ptr, - query, - text_provider, - buffer1: Vec::default(), - buffer2: Vec::default(), - current_match: None, - _options: query_options, _phantom: PhantomData, } } @@ -3181,44 +2490,6 @@ impl QueryCursor { self } - /// Set the byte range within which all matches must be fully contained. - /// - /// Set the range of bytes in which matches will be searched for. In contrast to - /// `ts_query_cursor_set_byte_range`, this will restrict the query cursor to only return - /// matches where _all_ nodes are _fully_ contained within the given range. Both functions - /// can be used together, e.g. to search for any matches that intersect line 5000, as - /// long as they are fully contained within lines 4500-5500 - #[doc(alias = "ts_query_cursor_set_containing_byte_range")] - pub fn set_containing_byte_range(&mut self, range: ops::Range) -> &mut Self { - unsafe { - ffi::ts_query_cursor_set_containing_byte_range( - self.ptr.as_ptr(), - range.start as u32, - range.end as u32, - ); - } - self - } - - /// Set the point range within which all matches must be fully contained. - /// - /// Set the range of bytes in which matches will be searched for. In contrast to - /// `ts_query_cursor_set_point_range`, this will restrict the query cursor to only return - /// matches where _all_ nodes are _fully_ contained within the given range. Both functions - /// can be used together, e.g. to search for any matches that intersect line 5000, as - /// long as they are fully contained within lines 4500-5500 - #[doc(alias = "ts_query_cursor_set_containing_point_range")] - pub fn set_containing_point_range(&mut self, range: ops::Range) -> &mut Self { - unsafe { - ffi::ts_query_cursor_set_containing_point_range( - self.ptr.as_ptr(), - range.start.into(), - range.end.into(), - ); - } - self - } - /// Set the maximum start depth for a query cursor. /// /// This prevents cursors from exploring children nodes at a certain depth. @@ -3228,9 +2499,9 @@ impl QueryCursor { /// The zero max start depth value can be used as a special behavior and /// it helps to destructure a subtree by staying on a node and using /// captures for interested parts. Note that the zero max start depth - /// only limits a search depth for a pattern's root node but other nodes - /// that are parts of the pattern may be searched at any depth depending on - /// what is defined by the pattern structure. + /// only limit a search depth for a pattern's root node but other nodes + /// that are parts of the pattern may be searched at any depth what + /// defined by the pattern structure. /// /// Set to `None` to remove the maximum start depth. #[doc(alias = "ts_query_cursor_set_max_start_depth")] @@ -3252,7 +2523,7 @@ impl<'tree> QueryMatch<'_, 'tree> { } #[doc(alias = "ts_query_cursor_remove_match")] - pub fn remove(&self) { + pub fn remove(self) { unsafe { ffi::ts_query_cursor_remove_match(self.cursor, self.id) } } @@ -3281,7 +2552,7 @@ impl<'tree> QueryMatch<'_, 'tree> { } } - pub fn satisfies_text_predicates>( + fn satisfies_text_predicates>( &self, query: &Query, buffer1: &mut Vec, @@ -3326,11 +2597,9 @@ impl<'tree> QueryMatch<'_, 'tree> { .iter() .all(|predicate| match predicate { TextPredicateCapture::EqCapture(i, j, is_positive, match_all_nodes) => { - let mut nodes_1 = self.nodes_for_capture_index(*i).peekable(); - let mut nodes_2 = self.nodes_for_capture_index(*j).peekable(); - while nodes_1.peek().is_some() && nodes_2.peek().is_some() { - let node1 = nodes_1.next().unwrap(); - let node2 = nodes_2.next().unwrap(); + let mut nodes_1 = self.nodes_for_capture_index(*i); + let mut nodes_2 = self.nodes_for_capture_index(*j); + while let (Some(node1), Some(node2)) = (nodes_1.next(), nodes_2.next()) { let mut text1 = text_provider.text(node1); let mut text2 = text_provider.text(node2); let text1 = node_text1.get_text(&mut text1); @@ -3401,16 +2670,13 @@ impl QueryProperty { } } -/// Provide a `StreamingIterator` instead of the traditional `Iterator`, as the -/// underlying object in the C library gets updated on each iteration. Copies would -/// have their internal state overwritten, leading to Undefined Behavior -impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> StreamingIterator +impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> Iterator for QueryMatches<'query, 'tree, T, I> { type Item = QueryMatch<'query, 'tree>; - fn advance(&mut self) { - self.current_match = unsafe { + fn next(&mut self) -> Option { + unsafe { loop { let mut m = MaybeUninit::::uninit(); if ffi::ts_query_cursor_next_match(self.ptr, m.as_mut_ptr()) { @@ -3421,33 +2687,23 @@ impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> StreamingIterator &mut self.buffer2, &mut self.text_provider, ) { - break Some(result); + return Some(result); } } else { - break None; + return None; } } - }; - } - - fn get(&self) -> Option<&Self::Item> { - self.current_match.as_ref() + } } } -impl, I: AsRef<[u8]>> StreamingIteratorMut for QueryMatches<'_, '_, T, I> { - fn get_mut(&mut self) -> Option<&mut Self::Item> { - self.current_match.as_mut() - } -} - -impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> StreamingIterator +impl<'query, 'tree: 'query, T: TextProvider, I: AsRef<[u8]>> Iterator for QueryCaptures<'query, 'tree, T, I> { type Item = (QueryMatch<'query, 'tree>, usize); - fn advance(&mut self) { - self.current_match = unsafe { + fn next(&mut self) -> Option { + unsafe { loop { let mut capture_index = 0u32; let mut m = MaybeUninit::::uninit(); @@ -3463,25 +2719,15 @@ impl<'query, 'tree, T: TextProvider, I: AsRef<[u8]>> StreamingIterator &mut self.buffer2, &mut self.text_provider, ) { - break Some((result, capture_index as usize)); + return Some((result, capture_index as usize)); } result.remove(); } else { - break None; + return None; } } } } - - fn get(&self) -> Option<&Self::Item> { - self.current_match.as_ref() - } -} - -impl, I: AsRef<[u8]>> StreamingIteratorMut for QueryCaptures<'_, '_, T, I> { - fn get_mut(&mut self) -> Option<&mut Self::Item> { - self.current_match.as_mut() - } } impl, I: AsRef<[u8]>> QueryMatches<'_, '_, T, I> { @@ -3618,8 +2864,8 @@ impl From for Range { } } -impl From<&InputEdit> for ffi::TSInputEdit { - fn from(val: &InputEdit) -> Self { +impl From<&'_ InputEdit> for ffi::TSInputEdit { + fn from(val: &'_ InputEdit) -> Self { Self { start_byte: val.start_byte as u32, old_end_byte: val.old_end_byte as u32, @@ -3697,18 +2943,11 @@ impl fmt::Display for IncludedRangesError { impl fmt::Display for LanguageError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Self::Version(version) => { - write!( - f, - "Incompatible language version {version}. Expected minimum {MIN_COMPATIBLE_LANGUAGE_VERSION}, maximum {LANGUAGE_VERSION}", - ) - } - #[cfg(feature = "wasm")] - Self::Wasm => { - write!(f, "Failed to load the Wasm store.") - } - } + write!( + f, + "Incompatible language version {}. Expected minimum {}, maximum {}", + self.version, MIN_COMPATIBLE_LANGUAGE_VERSION, LANGUAGE_VERSION, + ) } } @@ -3861,23 +3100,20 @@ static mut FREE_FN: unsafe extern "C" fn(ptr: *mut c_void) = free; /// This function uses FFI and mutates a static global. #[doc(alias = "ts_set_allocator")] pub unsafe fn set_allocator( - new_malloc: Option *mut c_void>, - new_calloc: Option *mut c_void>, - new_realloc: Option *mut c_void>, - new_free: Option, + new_malloc: Option *mut c_void>, + new_calloc: Option *mut c_void>, + new_realloc: Option *mut c_void>, + new_free: Option, ) { FREE_FN = new_free.unwrap_or(free); ffi::ts_set_allocator(new_malloc, new_calloc, new_realloc, new_free); } #[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl error::Error for IncludedRangesError {} #[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl error::Error for LanguageError {} #[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl error::Error for QueryError {} unsafe impl Send for Language {} diff --git a/lib/binding_rust/wasm_language.rs b/lib/binding_rust/wasm_language.rs index 66df377a..d1ff067b 100644 --- a/lib/binding_rust/wasm_language.rs +++ b/lib/binding_rust/wasm_language.rs @@ -26,9 +26,6 @@ pub struct wasm_engine_t { pub struct WasmStore(*mut ffi::TSWasmStore); -unsafe impl Send for WasmStore {} -unsafe impl Sync for WasmStore {} - #[derive(Debug, PartialEq, Eq)] pub struct WasmError { pub kind: WasmErrorKind, @@ -48,9 +45,7 @@ impl WasmStore { unsafe { let mut error = MaybeUninit::::uninit(); let store = ffi::ts_wasm_store_new( - std::ptr::from_ref::(engine) - .cast_mut() - .cast(), + (engine as *const wasmtime::Engine as *mut wasmtime::Engine).cast(), error.as_mut_ptr(), ); if store.is_null() { @@ -135,9 +130,9 @@ impl Drop for WasmStore { impl fmt::Display for WasmError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let kind = match self.kind { - WasmErrorKind::Parse => "Failed to parse Wasm", - WasmErrorKind::Compile => "Failed to compile Wasm", - WasmErrorKind::Instantiate => "Failed to instantiate Wasm module", + WasmErrorKind::Parse => "Failed to parse wasm", + WasmErrorKind::Compile => "Failed to compile wasm", + WasmErrorKind::Instantiate => "Failed to instantiate wasm module", WasmErrorKind::Other => "Unknown error", }; write!(f, "{kind}: {}", self.message) diff --git a/lib/binding_web/.eslintrc.js b/lib/binding_web/.eslintrc.js new file mode 100644 index 00000000..38709eb8 --- /dev/null +++ b/lib/binding_web/.eslintrc.js @@ -0,0 +1,22 @@ +module.exports = { + 'env': { + 'commonjs': true, + 'es2021': true, + }, + 'extends': 'google', + 'overrides': [ + ], + 'parserOptions': { + 'ecmaVersion': 'latest', + 'sourceType': 'module', + }, + 'rules': { + 'indent': ['error', 2, {'SwitchCase': 1}], + 'max-len': [ + 'error', + {'code': 120, 'ignoreComments': true, 'ignoreUrls': true, 'ignoreStrings': true, 'ignoreTemplateLiterals': true}, + ], + 'require-jsdoc': 0, + 'new-cap': 0, + }, +}; diff --git a/lib/binding_web/.gitattributes b/lib/binding_web/.gitattributes deleted file mode 100644 index ab19847d..00000000 --- a/lib/binding_web/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -lib/web-tree-sitter.d.ts linguist-generated diff --git a/lib/binding_web/.gitignore b/lib/binding_web/.gitignore index 8f45e5f9..eec0cfe6 100644 --- a/lib/binding_web/.gitignore +++ b/lib/binding_web/.gitignore @@ -1,10 +1,6 @@ -debug/ -dist/ -web-tree-sitter* -lib/*.c -lib/*.h -!lib/tree-sitter.c -!lib/web-tree-sitter.d.ts +/tree-sitter.js +/tree-sitter.wasm +package-lock.json node_modules *.tgz LICENSE diff --git a/lib/binding_web/.npmignore b/lib/binding_web/.npmignore new file mode 100644 index 00000000..f110063a --- /dev/null +++ b/lib/binding_web/.npmignore @@ -0,0 +1,5 @@ +* +!README.md +!tree-sitter.js +!tree-sitter.wasm +!tree-sitter-web.d.ts diff --git a/lib/binding_web/CONTRIBUTING.md b/lib/binding_web/CONTRIBUTING.md deleted file mode 100644 index eb4e5fc3..00000000 --- a/lib/binding_web/CONTRIBUTING.md +++ /dev/null @@ -1,142 +0,0 @@ -# Contributing - -## Code of Conduct - -Contributors to Tree-sitter should abide by the [Contributor Covenant][covenant]. - -## Developing Web-tree-sitter - -### Prerequisites - -To make changes to Web-tree-sitter, you should have: - -1. A [Rust toolchain][rust], for running the xtasks necessary to build the library. -2. Node.js and NPM (or an equivalent package manager). -3. Either [Emscripten][emscripten], [Docker][docker], or [podman][podman] for -compiling the library to Wasm. - -### Building - -Clone the repository: - -```sh -git clone https://github.com/tree-sitter/tree-sitter -cd tree-sitter/lib/binding_web -``` - -Install the necessary dependencies: - -```sh -npm install -``` - -Build the library: - -```sh -npm run build -``` - -Note that the build process requires a Rust toolchain to be installed. If you don't have one installed, you can install it -by visiting the [Rust website][rust] and following the instructions there. - -> [!NOTE] -> By default, the build process will emit an ES6 module. If you need a CommonJS module, export `CJS` to `true`, or just -> run `CJS=true npm run build` (or the equivalent command for Windows). - -> [!TIP] -> To build the library with debug information, you can run `npm run build:debug`. The `CJS` environment variable is still -> taken into account. - -### Putting it together - -#### The C side - -There are several components that come together to build the final JS and Wasm files. First, we use `emscripten` in our -xtask located at `xtask/src/build_wasm.rs` from the root directory to compile the Wasm files. This Wasm module is output into the -local `lib` folder, and is used only in [`src/bindings.ts`][bindings.ts] to handle loading the Wasm module. The C code that -is compiled into the Wasm module is located in at [`lib/tree-sitter.c`][tree-sitter.c], and contains all the necessary -glue code to interact with the JS environment. If you need to update the imported functions from the tree-sitter library, -or anywhere else, you must update [`lib/exports.txt`][exports.txt]. Lastly, the type information for the Wasm module is -located at [`lib/tree-sitter.d.ts`][tree-sitter.d.ts], and can be updated by running `cargo xtask build-wasm --emit-tsd` -from the root directory. - -#### The TypeScript side - -The TypeScript library is a higher level abstraction over the Wasm module, and is located in `src`. This is where the -public API is defined, and where the Wasm module is loaded and initialized. The TypeScript library is built into a single -ES6 (or CommonJS) module, and is output into the same directory as `package.json`. If you need to update the public API, -you can do so by editing the files in `src`. - -If you make changes to the library that require updating the type definitions, such as adding a new public API method, -you should run: - -```sh -npm run build:dts -``` - -This uses [`dts-buddy`][dts-buddy] to generate `web-tree-sitter.d.ts` from the public types in `src`. Additionally, a sourcemap -is generated for the `.d.ts` file, which enables `go-to definition` and other editor integrations to take you straight -to the TypeScript source code. - -This TypeScript code is then compiled into a single JavaScript file with `esbuild`. The build configuration for this can -be found in [`script/build.js`][build.js], but this shouldn't need to be updated. This step is responsible for emitting -the final JS and Wasm files that are shipped with the library, as well as their sourcemaps. - -### Testing - -Before you can run the tests, you need to fetch and build some upstream grammars that are used for testing. -Run this in the root of the repository: - -```sh -cargo xtask fetch-fixtures -``` - -Optionally, to update the generated parser.c files: - -```sh -cargo xtask generate-fixtures -``` - -Then you can build the Wasm modules: - -```sh -cargo xtask generate-fixtures --wasm -``` - -Now, you can run the tests. In the `lib/binding_web` directory, run: - -```sh -npm test -``` - -> [!NOTE] -> We use `vitest` to run the tests. If you want to run a specific test, you can use the `-t` flag to pass in a pattern. -> If you want to run a specific file, you can just pass the name of the file as is. For example, to run the `parser` tests -> in `test/parser.test.ts`, you can run `npm test parser`. To run tests that have the name `descendant` somewhere, run -> `npm test -- -t descendant`. -> -> For coverage information, you can run `npm test -- --coverage`. - -### Debugging - -You might have noticed that when you ran `npm build`, the build process generated a couple of [sourcemaps][sourcemap]: -`web-tree-sitter.js.map` and `web-tree-sitter.wasm.map`. These sourcemaps can be used to debug the library in the browser, and are -shipped with the library on both NPM and the GitHub releases. - -#### Tweaking the Emscripten build - -If you're trying to tweak the Emscripten build, or are trying to debug an issue, the code for this lies in `xtask/src/build_wasm.rs` -file mentioned earlier, namely in the `run_wasm` function. - -[bindings.ts]: src/bindings.ts -[build.js]: script/build.js -[covenant]: https://www.contributor-covenant.org/version/1/4/code-of-conduct -[docker]: https://www.docker.com -[dts-buddy]: https://github.com/Rich-Harris/dts-buddy -[emscripten]: https://emscripten.org -[exports.txt]: lib/exports.txt -[podman]: https://podman.io -[rust]: https://www.rust-lang.org/tools/install -[sourcemap]: https://developer.mozilla.org/en-US/docs/Glossary/Source_map -[tree-sitter.c]: lib/tree-sitter.c -[tree-sitter.d.ts]: lib/tree-sitter.d.ts diff --git a/lib/binding_web/README.md b/lib/binding_web/README.md index 08a939dc..ce5def96 100644 --- a/lib/binding_web/README.md +++ b/lib/binding_web/README.md @@ -7,77 +7,46 @@ WebAssembly bindings to the [Tree-sitter](https://github.com/tree-sitter/tree-sitter) parsing library. -## Setup +### Setup -You can download the `web-tree-sitter.js` and `web-tree-sitter.wasm` files from [the latest GitHub release][gh release] and load -them using a standalone script: +You can download the `tree-sitter.js` and `tree-sitter.wasm` files from [the latest GitHub release](https://github.com/tree-sitter/tree-sitter/releases/latest) and load them using a standalone script: ```html - + ``` -You can also install [the `web-tree-sitter` module][npm module] from NPM and load it using a system like Webpack: +You can also install [the `web-tree-sitter` module](https://www.npmjs.com/package/web-tree-sitter) from NPM and load it using a system like Webpack: ```js -const { Parser } = require('web-tree-sitter'); +const Parser = require('web-tree-sitter'); Parser.init().then(() => { /* the library is ready */ }); ``` -or Vite: +You can use this module with [deno](https://deno.land/): ```js -import { Parser } from 'web-tree-sitter'; -Parser.init().then(() => { /* the library is ready */ }); -``` - -With Vite, you also need to make sure your server provides the `tree-sitter.wasm` -file to your `public` directory. You can do this automatically with a `postinstall` -[script](https://docs.npmjs.com/cli/v10/using-npm/scripts) in your `package.json`: - -```js -"postinstall": "cp node_modules/web-tree-sitter/tree-sitter.wasm public" -``` - -You can also use this module with [deno](https://deno.land/): - -```js -import { Parser } from "npm:web-tree-sitter"; +import Parser from "npm:web-tree-sitter"; await Parser.init(); // the library is ready ``` -To use the debug version of the library, replace your import of `web-tree-sitter` with `web-tree-sitter/debug`: - -```js -import { Parser } from 'web-tree-sitter/debug'; // or require('web-tree-sitter/debug') - -Parser.init().then(() => { /* the library is ready */ }); -``` - -This will load the debug version of the `.js` and `.wasm` file, which includes debug symbols and assertions. - -> [!NOTE] -> The `web-tree-sitter.js` file on GH releases is an ES6 module. If you are interested in using a pure CommonJS library, such -> as for Electron, you should use the `web-tree-sitter.cjs` file instead. - ### Basic Usage First, create a parser: ```js -const parser = new Parser(); +const parser = new Parser; ``` Then assign a language to the parser. Tree-sitter languages are packaged as individual `.wasm` files (more on this below): ```js -const { Language } = require('web-tree-sitter'); -const JavaScript = await Language.load('/path/to/tree-sitter-javascript.wasm'); +const JavaScript = await Parser.Language.load('/path/to/tree-sitter-javascript.wasm'); parser.setLanguage(JavaScript); ``` @@ -133,8 +102,7 @@ const newTree = parser.parse(newSourceCode, tree); ### Parsing Text From a Custom Data Structure -If your text is stored in a data structure other than a single string, you can parse it by supplying a callback to `parse` -instead of a string: +If your text is stored in a data structure other than a single string, you can parse it by supplying a callback to `parse` instead of a string: ```javascript const sourceLines = [ @@ -148,36 +116,13 @@ const tree = parser.parse((index, position) => { }); ``` -### Getting the `.wasm` language files +### Generate .wasm language files -There are several options on how to get the `.wasm` files for the languages you want to parse. +The following example shows how to generate `.wasm` file for tree-sitter JavaScript grammar. -#### From npmjs.com +**IMPORTANT**: [emscripten](https://emscripten.org/docs/getting_started/downloads.html), [docker](https://www.docker.com/), or [podman](https://podman.io) need to be installed. -The recommended way is to just install the package from npm. For example, to parse JavaScript, you can install the `tree-sitter-javascript` -package: - -```sh -npm install tree-sitter-javascript -``` - -Then you can find the `.wasm` file in the `node_modules/tree-sitter-javascript` directory. - -#### From GitHub - -You can also download the `.wasm` files from GitHub releases, so long as the repository uses our reusable workflow to publish -them. -For example, you can download the JavaScript `.wasm` file from the tree-sitter-javascript [releases page][gh release js]. - -#### Generating `.wasm` files - -You can also generate the `.wasm` file for your desired grammar. Shown below is an example of how to generate the `.wasm` -file for the JavaScript grammar. - -**IMPORTANT**: [Emscripten][emscripten], [Docker][docker], or [Podman][podman] need to be installed. - -First install `tree-sitter-cli`, and the tree-sitter language for which to generate `.wasm` -(`tree-sitter-javascript` in this example): +First install `tree-sitter-cli` and the tree-sitter language for which to generate `.wasm` (`tree-sitter-javascript` in this example): ```sh npm install --save-dev tree-sitter-cli tree-sitter-javascript @@ -191,10 +136,9 @@ npx tree-sitter build --wasm node_modules/tree-sitter-javascript If everything is fine, file `tree-sitter-javascript.wasm` should be generated in current directory. -### Running .wasm in Node.js +#### Running .wasm in Node.js -Notice that executing `.wasm` files in Node.js is considerably slower than running [Node.js bindings][node bindings]. -However, this could be useful for testing purposes: +Notice that executing `.wasm` files in node.js is considerably slower than running [node.js bindings](https://github.com/tree-sitter/node-tree-sitter). However could be useful for testing purposes: ```javascript const Parser = require('web-tree-sitter'); @@ -209,18 +153,18 @@ const Parser = require('web-tree-sitter'); })(); ``` -### Running .wasm in browser +#### Running .wasm in browser `web-tree-sitter` can run in the browser, but there are some common pitfalls. -#### Loading the .wasm file +##### Loading the .wasm file `web-tree-sitter` needs to load the `tree-sitter.wasm` file. By default, it assumes that this file is available in the same path as the JavaScript code. Therefore, if the code is being served from `http://localhost:3000/bundle.js`, then -the Wasm file should be at `http://localhost:3000/tree-sitter.wasm`. +the wasm file should be at `http://localhost:3000/tree-sitter.wasm`. For server side frameworks like NextJS, this can be tricky as pages are often served from a path such as -`http://localhost:3000/_next/static/chunks/pages/index.js`. The loader will therefore look for the Wasm file at +`http://localhost:3000/_next/static/chunks/pages/index.js`. The loader will therefore look for the wasm file at `http://localhost:3000/_next/static/chunks/pages/tree-sitter.wasm`. The solution is to pass a `locateFile` function in the `moduleOptions` argument to `Parser.init()`: @@ -232,17 +176,15 @@ await Parser.init({ }); ``` -`locateFile` takes in two parameters, `scriptName`, i.e. the Wasm file name, and `scriptDirectory`, i.e. the directory -where the loader expects the script to be. It returns the path where the loader will look for the Wasm file. In the NextJS +`locateFile` takes in two parameters, `scriptName`, i.e. the wasm file name, and `scriptDirectory`, i.e. the directory +where the loader expects the script to be. It returns the path where the loader will look for the wasm file. In the NextJS case, we want to return just the `scriptName` so that the loader will look at `http://localhost:3000/tree-sitter.wasm` and not `http://localhost:3000/_next/static/chunks/pages/tree-sitter.wasm`. -For more information on the module options you can pass in, see the [emscripten documentation][emscripten-module-options]. +##### `Can't resolve 'fs' in 'node_modules/web-tree-sitter'` -#### "Can't resolve 'fs' in 'node_modules/web-tree-sitter" - -Most bundlers will notice that the `web-tree-sitter.js` file is attempting to import `fs`, i.e. node's file system library. -Since this doesn't exist in the browser, the bundlers will get confused. For Webpack, you can fix this by adding the +Most bundlers will notice that the `tree-sitter.js` file is attempting to import `fs`, i.e. node's file system library. +Since this doesn't exist in the browser, the bundlers will get confused. For webpack you can fix this by adding the following to your webpack config: ```javascript @@ -254,12 +196,3 @@ following to your webpack config: } } ``` - -[docker]: https://www.docker.com -[emscripten]: https://emscripten.org -[emscripten-module-options]: https://emscripten.org/docs/api_reference/module.html#affecting-execution -[gh release]: https://github.com/tree-sitter/tree-sitter/releases/latest -[gh release js]: https://github.com/tree-sitter/tree-sitter-javascript/releases/latest -[node bindings]: https://github.com/tree-sitter/node-tree-sitter -[npm module]: https://www.npmjs.com/package/web-tree-sitter -[podman]: https://podman.io diff --git a/lib/binding_web/lib/tree-sitter.c b/lib/binding_web/binding.c similarity index 80% rename from lib/binding_web/lib/tree-sitter.c rename to lib/binding_web/binding.c index 828132ac..36efb042 100644 --- a/lib/binding_web/lib/tree-sitter.c +++ b/lib/binding_web/binding.c @@ -16,16 +16,10 @@ const void *TRANSFER_BUFFER[12] = { NULL, NULL, NULL, NULL, }; -static const int SIZE_OF_CURSOR = 4; -static const int SIZE_OF_NODE = 5; -static const int SIZE_OF_POINT = 2; -static const int SIZE_OF_RANGE = 2 + (2 * SIZE_OF_POINT); -static const int SIZE_OF_CAPTURE = 1 + SIZE_OF_NODE; - void *ts_init() { TRANSFER_BUFFER[0] = (const void *)TREE_SITTER_LANGUAGE_VERSION; TRANSFER_BUFFER[1] = (const void *)TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION; - return (void*)TRANSFER_BUFFER; + return TRANSFER_BUFFER; } static uint32_t code_unit_to_byte(uint32_t unit) { @@ -44,22 +38,17 @@ static inline void marshal_node(const void **buffer, TSNode node) { buffer[4] = (const void *)node.context[3]; } -static inline TSNode unmarshal_node_at(const TSTree *tree, uint32_t index) { +static inline TSNode unmarshal_node(const TSTree *tree) { TSNode node; - const void **buffer = TRANSFER_BUFFER + index * SIZE_OF_NODE; - node.id = buffer[0]; - node.context[0] = code_unit_to_byte((uint32_t)buffer[1]); - node.context[1] = (uint32_t)buffer[2]; - node.context[2] = code_unit_to_byte((uint32_t)buffer[3]); - node.context[3] = (uint32_t)buffer[4]; + node.id = TRANSFER_BUFFER[0]; + node.context[0] = code_unit_to_byte((uint32_t)TRANSFER_BUFFER[1]); + node.context[1] = (uint32_t)TRANSFER_BUFFER[2]; + node.context[2] = code_unit_to_byte((uint32_t)TRANSFER_BUFFER[3]); + node.context[3] = (uint32_t)TRANSFER_BUFFER[4]; node.tree = tree; return node; } -static inline TSNode unmarshal_node(const TSTree *tree) { - return unmarshal_node_at(tree, 0); -} - static inline void marshal_cursor(const TSTreeCursor *cursor) { TRANSFER_BUFFER[0] = cursor->id; TRANSFER_BUFFER[1] = (const void *)cursor->context[0]; @@ -106,26 +95,15 @@ static void unmarshal_range(TSRange *range) { static TSInputEdit unmarshal_edit() { TSInputEdit edit; const void **address = TRANSFER_BUFFER; - edit.start_point = unmarshal_point(address); address += SIZE_OF_POINT; - edit.old_end_point = unmarshal_point(address); address += SIZE_OF_POINT; - edit.new_end_point = unmarshal_point(address); address += SIZE_OF_POINT; + edit.start_point = unmarshal_point(address); address += 2; + edit.old_end_point = unmarshal_point(address); address += 2; + edit.new_end_point = unmarshal_point(address); address += 2; edit.start_byte = code_unit_to_byte((uint32_t)*address); address += 1; edit.old_end_byte = code_unit_to_byte((uint32_t)*address); address += 1; edit.new_end_byte = code_unit_to_byte((uint32_t)*address); address += 1; return edit; } -static void marshal_language_metadata(const TSLanguageMetadata *metadata) { - if (metadata == NULL) { - TRANSFER_BUFFER[0] = 0; - return; - } - TRANSFER_BUFFER[0] = (const void*)3; - TRANSFER_BUFFER[1] = (const void*)(uint32_t)metadata->major_version; - TRANSFER_BUFFER[2] = (const void*)(uint32_t)metadata->minor_version; - TRANSFER_BUFFER[3] = (const void*)(uint32_t)metadata->patch_version; -} - /********************/ /* Section - Parser */ /********************/ @@ -143,15 +121,6 @@ extern void tree_sitter_log_callback( const char *message ); -extern bool tree_sitter_progress_callback( - uint32_t current_offset, - bool has_error -); - -extern bool tree_sitter_query_progress_callback( - uint32_t current_offset -); - static const char *call_parse_callback( void *payload, uint32_t byte, @@ -181,18 +150,6 @@ static void call_log_callback( tree_sitter_log_callback(log_type == TSLogTypeLex, message); } -static bool progress_callback( - TSParseState *state -) { - return tree_sitter_progress_callback(state->current_byte_offset, state->has_error); -} - -static bool query_progress_callback( - TSQueryCursorState *state -) { - return tree_sitter_query_progress_callback(state->current_byte_offset); -} - void ts_parser_new_wasm() { TSParser *parser = ts_parser_new(); char *input_buffer = calloc(INPUT_BUFFER_SIZE, sizeof(char)); @@ -215,8 +172,7 @@ TSTree *ts_parser_parse_wasm( TSInput input = { input_buffer, call_parse_callback, - TSInputEncodingUTF16LE, - NULL, + TSInputEncodingUTF16 }; if (range_count) { for (unsigned i = 0; i < range_count; i++) { @@ -227,10 +183,7 @@ TSTree *ts_parser_parse_wasm( } else { ts_parser_set_included_ranges(self, NULL, 0); } - - TSParseOptions options = {.payload = NULL, .progress_callback = progress_callback}; - - return ts_parser_parse_with_options(self, old_tree, input, options); + return ts_parser_parse(self, old_tree, input); } void ts_parser_included_ranges_wasm(TSParser *self) { @@ -259,25 +212,6 @@ int ts_language_type_is_visible_wasm(const TSLanguage *self, TSSymbol typeId) { return symbolType <= TSSymbolTypeAnonymous; } -void ts_language_metadata_wasm(const TSLanguage *self) { - const TSLanguageMetadata *metadata = ts_language_metadata(self); - marshal_language_metadata(metadata); -} - -void ts_language_supertypes_wasm(const TSLanguage *self) { - uint32_t length; - const TSSymbol *supertypes = ts_language_supertypes(self, &length); - TRANSFER_BUFFER[0] = (const void *)length; - TRANSFER_BUFFER[1] = supertypes; -} - -void ts_language_subtypes_wasm(const TSLanguage *self, TSSymbol supertype) { - uint32_t length; - const TSSymbol *subtypes = ts_language_subtypes(self, supertype, &length); - TRANSFER_BUFFER[0] = (const void *)length; - TRANSFER_BUFFER[1] = subtypes; -} - /******************/ /* Section - Tree */ /******************/ @@ -288,7 +222,7 @@ void ts_tree_root_node_wasm(const TSTree *tree) { void ts_tree_root_node_with_offset_wasm(const TSTree *tree) { // read int and point from transfer buffer - const void **address = TRANSFER_BUFFER + SIZE_OF_NODE; + const void **address = TRANSFER_BUFFER + 5; uint32_t offset = code_unit_to_byte((uint32_t)address[0]); TSPoint extent = unmarshal_point(address + 1); TSNode node = ts_tree_root_node_with_offset(tree, offset, extent); @@ -330,12 +264,6 @@ void ts_tree_cursor_new_wasm(const TSTree *tree) { marshal_cursor(&cursor); } -void ts_tree_cursor_copy_wasm(const TSTree *tree) { - TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree); - TSTreeCursor copy = ts_tree_cursor_copy(&cursor); - marshal_cursor(©); -} - void ts_tree_cursor_delete_wasm(const TSTree *tree) { TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, tree); ts_tree_cursor_delete(&cursor); @@ -343,14 +271,14 @@ void ts_tree_cursor_delete_wasm(const TSTree *tree) { void ts_tree_cursor_reset_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - TSTreeCursor cursor = unmarshal_cursor(&TRANSFER_BUFFER[SIZE_OF_NODE], tree); + TSTreeCursor cursor = unmarshal_cursor(&TRANSFER_BUFFER[5], tree); ts_tree_cursor_reset(&cursor, node); marshal_cursor(&cursor); } void ts_tree_cursor_reset_to_wasm(const TSTree *_dst, const TSTree *_src) { TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, _dst); - TSTreeCursor src = unmarshal_cursor(&TRANSFER_BUFFER[SIZE_OF_CURSOR], _src); + TSTreeCursor src = unmarshal_cursor(&TRANSFER_BUFFER[4], _src); ts_tree_cursor_reset_to(&cursor, &src); marshal_cursor(&cursor); } @@ -505,11 +433,6 @@ const char *ts_node_field_name_for_child_wasm(const TSTree *tree, uint32_t index return ts_node_field_name_for_child(node, index); } -const char *ts_node_field_name_for_named_child_wasm(const TSTree *tree, uint32_t index) { - TSNode node = unmarshal_node(tree); - return ts_node_field_name_for_named_child(node, index); -} - void ts_node_children_by_field_id_wasm(const TSTree *tree, uint32_t field_id) { TSNode node = unmarshal_node(tree); TSTreeCursor cursor = ts_tree_cursor_new(node); @@ -536,25 +459,25 @@ void ts_node_children_by_field_id_wasm(const TSTree *tree, uint32_t field_id) { if (!ts_tree_cursor_goto_next_sibling(&cursor)) { done = true; } - array_grow_by(&result, SIZE_OF_NODE); - marshal_node(result.contents + result.size - SIZE_OF_NODE, result_node); + array_grow_by(&result, 5); + marshal_node(result.contents + result.size - 5, result_node); } ts_tree_cursor_delete(&cursor); - TRANSFER_BUFFER[0] = (const void*)(result.size / SIZE_OF_NODE); - TRANSFER_BUFFER[1] = (const void*)result.contents; + TRANSFER_BUFFER[0] = (const void*)(result.size / 5); + TRANSFER_BUFFER[1] = result.contents; } void ts_node_first_child_for_byte_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - const void** address = TRANSFER_BUFFER + SIZE_OF_NODE; + const void** address = TRANSFER_BUFFER + 5; uint32_t byte = code_unit_to_byte((uint32_t)address[0]); marshal_node(TRANSFER_BUFFER, ts_node_first_child_for_byte(node, byte)); } void ts_node_first_named_child_for_byte_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - const void** address = TRANSFER_BUFFER + SIZE_OF_NODE; + const void** address = TRANSFER_BUFFER + 5; uint32_t byte = code_unit_to_byte((uint32_t)address[0]); marshal_node(TRANSFER_BUFFER, ts_node_first_named_child_for_byte(node, byte)); } @@ -619,15 +542,9 @@ void ts_node_parent_wasm(const TSTree *tree) { marshal_node(TRANSFER_BUFFER, ts_node_parent(node)); } -void ts_node_child_with_descendant_wasm(const TSTree *tree) { - TSNode node = unmarshal_node(tree); - TSNode descendant = unmarshal_node_at(tree, 1); - marshal_node(TRANSFER_BUFFER, ts_node_child_with_descendant(node, descendant)); -} - void ts_node_descendant_for_index_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - const void **address = TRANSFER_BUFFER + SIZE_OF_NODE; + const void **address = TRANSFER_BUFFER + 5; uint32_t start = code_unit_to_byte((uint32_t)address[0]); uint32_t end = code_unit_to_byte((uint32_t)address[1]); marshal_node(TRANSFER_BUFFER, ts_node_descendant_for_byte_range(node, start, end)); @@ -635,7 +552,7 @@ void ts_node_descendant_for_index_wasm(const TSTree *tree) { void ts_node_named_descendant_for_index_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - const void **address = TRANSFER_BUFFER + SIZE_OF_NODE; + const void **address = TRANSFER_BUFFER + 5; uint32_t start = code_unit_to_byte((uint32_t)address[0]); uint32_t end = code_unit_to_byte((uint32_t)address[1]); marshal_node(TRANSFER_BUFFER, ts_node_named_descendant_for_byte_range(node, start, end)); @@ -643,16 +560,16 @@ void ts_node_named_descendant_for_index_wasm(const TSTree *tree) { void ts_node_descendant_for_position_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - const void **address = TRANSFER_BUFFER + SIZE_OF_NODE; - TSPoint start = unmarshal_point(address); address += SIZE_OF_POINT; + const void **address = TRANSFER_BUFFER + 5; + TSPoint start = unmarshal_point(address); address += 2; TSPoint end = unmarshal_point(address); marshal_node(TRANSFER_BUFFER, ts_node_descendant_for_point_range(node, start, end)); } void ts_node_named_descendant_for_position_wasm(const TSTree *tree) { TSNode node = unmarshal_node(tree); - const void **address = TRANSFER_BUFFER + SIZE_OF_NODE; - TSPoint start = unmarshal_point(address); address += SIZE_OF_POINT; + const void **address = TRANSFER_BUFFER + 5; + TSPoint start = unmarshal_point(address); address += 2; TSPoint end = unmarshal_point(address); marshal_node(TRANSFER_BUFFER, ts_node_named_descendant_for_point_range(node, start, end)); } @@ -687,20 +604,20 @@ void ts_node_children_wasm(const TSTree *tree) { uint32_t count = ts_node_child_count(node); const void **result = NULL; if (count > 0) { - result = (const void**)calloc(sizeof(void *), SIZE_OF_NODE * count); + result = calloc(sizeof(void *), 5 * count); const void **address = result; ts_tree_cursor_reset(&scratch_cursor, node); ts_tree_cursor_goto_first_child(&scratch_cursor); marshal_node(address, ts_tree_cursor_current_node(&scratch_cursor)); for (uint32_t i = 1; i < count; i++) { - address += SIZE_OF_NODE; + address += 5; ts_tree_cursor_goto_next_sibling(&scratch_cursor); TSNode child = ts_tree_cursor_current_node(&scratch_cursor); marshal_node(address, child); } } TRANSFER_BUFFER[0] = (const void *)count; - TRANSFER_BUFFER[1] = (const void *)result; + TRANSFER_BUFFER[1] = result; } void ts_node_named_children_wasm(const TSTree *tree) { @@ -708,7 +625,7 @@ void ts_node_named_children_wasm(const TSTree *tree) { uint32_t count = ts_node_named_child_count(node); const void **result = NULL; if (count > 0) { - result = (const void**)calloc(sizeof(void *), SIZE_OF_NODE * count); + result = calloc(sizeof(void *), 5 * count); const void **address = result; ts_tree_cursor_reset(&scratch_cursor, node); ts_tree_cursor_goto_first_child(&scratch_cursor); @@ -717,7 +634,7 @@ void ts_node_named_children_wasm(const TSTree *tree) { TSNode child = ts_tree_cursor_current_node(&scratch_cursor); if (ts_node_is_named(child)) { marshal_node(address, child); - address += SIZE_OF_NODE; + address += 5; i++; if (i == count) { break; @@ -729,7 +646,7 @@ void ts_node_named_children_wasm(const TSTree *tree) { } } TRANSFER_BUFFER[0] = (const void *)count; - TRANSFER_BUFFER[1] = (const void *)result; + TRANSFER_BUFFER[1] = result; } bool symbols_contain(const uint32_t *set, uint32_t length, uint32_t value) { @@ -791,8 +708,8 @@ void ts_node_descendants_of_type_wasm( // Add the node to the result if its type matches one of the given // node types. if (symbols_contain(symbols, symbol_count, ts_node_symbol(descendant))) { - array_grow_by(&result, SIZE_OF_NODE); - marshal_node(result.contents + result.size - SIZE_OF_NODE, descendant); + array_grow_by(&result, 5); + marshal_node(result.contents + result.size - 5, descendant); } // Continue walking. @@ -817,8 +734,8 @@ void ts_node_descendants_of_type_wasm( } } - TRANSFER_BUFFER[0] = (const void *)(result.size / SIZE_OF_NODE); - TRANSFER_BUFFER[1] = (const void *)result.contents; + TRANSFER_BUFFER[0] = (const void *)(result.size / 5); + TRANSFER_BUFFER[1] = result.contents; } int ts_node_is_named_wasm(const TSTree *tree) { @@ -874,14 +791,9 @@ void ts_query_matches_wasm( uint32_t end_column, uint32_t start_index, uint32_t end_index, - uint32_t start_containing_row, - uint32_t start_containing_column, - uint32_t end_containing_row, - uint32_t end_containing_column, - uint32_t start_containing_index, - uint32_t end_containing_index, uint32_t match_limit, - uint32_t max_start_depth + uint32_t max_start_depth, + uint32_t timeout_micros ) { if (!scratch_query_cursor) { scratch_query_cursor = ts_query_cursor_new(); @@ -895,26 +807,12 @@ void ts_query_matches_wasm( TSNode node = unmarshal_node(tree); TSPoint start_point = {start_row, code_unit_to_byte(start_column)}; TSPoint end_point = {end_row, code_unit_to_byte(end_column)}; - TSPoint start_containing_point = {start_containing_row, code_unit_to_byte(start_containing_column)}; - TSPoint end_containing_point = {end_containing_row, code_unit_to_byte(end_containing_column)}; ts_query_cursor_set_point_range(scratch_query_cursor, start_point, end_point); ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index); - ts_query_cursor_set_containing_point_range( - scratch_query_cursor, - start_containing_point, - end_containing_point - ); - ts_query_cursor_set_containing_byte_range( - scratch_query_cursor, - start_containing_index, - end_containing_index - ); ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit); ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth); - - TSQueryCursorOptions options = {.payload = NULL, .progress_callback = query_progress_callback}; - - ts_query_cursor_exec_with_options(scratch_query_cursor, self, node, &options); + ts_query_cursor_set_timeout_micros(scratch_query_cursor, timeout_micros); + ts_query_cursor_exec(scratch_query_cursor, self, node); uint32_t index = 0; uint32_t match_count = 0; @@ -923,21 +821,21 @@ void ts_query_matches_wasm( TSQueryMatch match; while (ts_query_cursor_next_match(scratch_query_cursor, &match)) { match_count++; - array_grow_by(&result, 2 + (SIZE_OF_CAPTURE * match.capture_count)); + array_grow_by(&result, 2 + 6 * match.capture_count); result.contents[index++] = (const void *)(uint32_t)match.pattern_index; result.contents[index++] = (const void *)(uint32_t)match.capture_count; for (unsigned i = 0; i < match.capture_count; i++) { const TSQueryCapture *capture = &match.captures[i]; result.contents[index++] = (const void *)capture->index; marshal_node(result.contents + index, capture->node); - index += SIZE_OF_NODE; + index += 5; } } bool did_exceed_match_limit = ts_query_cursor_did_exceed_match_limit(scratch_query_cursor); TRANSFER_BUFFER[0] = (const void *)(match_count); - TRANSFER_BUFFER[1] = (const void *)result.contents; + TRANSFER_BUFFER[1] = result.contents; TRANSFER_BUFFER[2] = (const void *)(did_exceed_match_limit); } @@ -950,14 +848,9 @@ void ts_query_captures_wasm( uint32_t end_column, uint32_t start_index, uint32_t end_index, - uint32_t start_containing_row, - uint32_t start_containing_column, - uint32_t end_containing_row, - uint32_t end_containing_column, - uint32_t start_containing_index, - uint32_t end_containing_index, uint32_t match_limit, - uint32_t max_start_depth + uint32_t max_start_depth, + uint32_t timeout_micros ) { if (!scratch_query_cursor) { scratch_query_cursor = ts_query_cursor_new(); @@ -968,22 +861,11 @@ void ts_query_captures_wasm( TSNode node = unmarshal_node(tree); TSPoint start_point = {start_row, code_unit_to_byte(start_column)}; TSPoint end_point = {end_row, code_unit_to_byte(end_column)}; - TSPoint start_containing_point = {start_containing_row, code_unit_to_byte(start_containing_column)}; - TSPoint end_containing_point = {end_containing_row, code_unit_to_byte(end_containing_column)}; ts_query_cursor_set_point_range(scratch_query_cursor, start_point, end_point); ts_query_cursor_set_byte_range(scratch_query_cursor, start_index, end_index); - ts_query_cursor_set_containing_point_range( - scratch_query_cursor, - start_containing_point, - end_containing_point - ); - ts_query_cursor_set_containing_byte_range( - scratch_query_cursor, - start_containing_index, - end_containing_index - ); ts_query_cursor_set_match_limit(scratch_query_cursor, match_limit); ts_query_cursor_set_max_start_depth(scratch_query_cursor, max_start_depth); + ts_query_cursor_set_timeout_micros(scratch_query_cursor, timeout_micros); ts_query_cursor_exec(scratch_query_cursor, self, node); unsigned index = 0; @@ -999,7 +881,7 @@ void ts_query_captures_wasm( )) { capture_count++; - array_grow_by(&result, 3 + (SIZE_OF_CAPTURE * match.capture_count)); + array_grow_by(&result, 3 + 6 * match.capture_count); result.contents[index++] = (const void *)(uint32_t)match.pattern_index; result.contents[index++] = (const void *)(uint32_t)match.capture_count; result.contents[index++] = (const void *)capture_index; @@ -1007,13 +889,13 @@ void ts_query_captures_wasm( const TSQueryCapture *capture = &match.captures[i]; result.contents[index++] = (const void *)capture->index; marshal_node(result.contents + index, capture->node); - index += SIZE_OF_NODE; + index += 5; } } bool did_exceed_match_limit = ts_query_cursor_did_exceed_match_limit(scratch_query_cursor); TRANSFER_BUFFER[0] = (const void *)(capture_count); - TRANSFER_BUFFER[1] = (const void *)result.contents; + TRANSFER_BUFFER[1] = result.contents; TRANSFER_BUFFER[2] = (const void *)(did_exceed_match_limit); } diff --git a/lib/binding_web/binding.js b/lib/binding_web/binding.js new file mode 100644 index 00000000..a626aa01 --- /dev/null +++ b/lib/binding_web/binding.js @@ -0,0 +1,1550 @@ +/* eslint-disable-next-line spaced-comment */ +/// +/* eslint-disable-next-line spaced-comment */ +/// + +const C = Module; +const INTERNAL = {}; +const SIZE_OF_INT = 4; +const SIZE_OF_CURSOR = 4 * SIZE_OF_INT; +const SIZE_OF_NODE = 5 * SIZE_OF_INT; +const SIZE_OF_POINT = 2 * SIZE_OF_INT; +const SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT; +const ZERO_POINT = {row: 0, column: 0}; +const QUERY_WORD_REGEX = /[\w-.]*/g; + +const PREDICATE_STEP_TYPE_CAPTURE = 1; +const PREDICATE_STEP_TYPE_STRING = 2; + +const LANGUAGE_FUNCTION_REGEX = /^_?tree_sitter_\w+/; + +let VERSION; +let MIN_COMPATIBLE_VERSION; +let TRANSFER_BUFFER; +let currentParseCallback; +// eslint-disable-next-line no-unused-vars +let currentLogCallback; + +// eslint-disable-next-line no-unused-vars +class ParserImpl { + static init() { + TRANSFER_BUFFER = C._ts_init(); + VERSION = getValue(TRANSFER_BUFFER, 'i32'); + MIN_COMPATIBLE_VERSION = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + } + + initialize() { + C._ts_parser_new_wasm(); + this[0] = getValue(TRANSFER_BUFFER, 'i32'); + this[1] = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + } + + delete() { + C._ts_parser_delete(this[0]); + C._free(this[1]); + this[0] = 0; + this[1] = 0; + } + + setLanguage(language) { + let address; + if (!language) { + address = 0; + language = null; + } else if (language.constructor === Language) { + address = language[0]; + const version = C._ts_language_version(address); + if (version < MIN_COMPATIBLE_VERSION || VERSION < version) { + throw new Error( + `Incompatible language version ${version}. ` + + `Compatibility range ${MIN_COMPATIBLE_VERSION} through ${VERSION}.`, + ); + } + } else { + throw new Error('Argument must be a Language'); + } + this.language = language; + C._ts_parser_set_language(this[0], address); + return this; + } + + getLanguage() { + return this.language; + } + + parse(callback, oldTree, options) { + if (typeof callback === 'string') { + currentParseCallback = (index, _) => callback.slice(index); + } else if (typeof callback === 'function') { + currentParseCallback = callback; + } else { + throw new Error('Argument must be a string or a function'); + } + + if (this.logCallback) { + currentLogCallback = this.logCallback; + C._ts_parser_enable_logger_wasm(this[0], 1); + } else { + currentLogCallback = null; + C._ts_parser_enable_logger_wasm(this[0], 0); + } + + let rangeCount = 0; + let rangeAddress = 0; + if (options?.includedRanges) { + rangeCount = options.includedRanges.length; + rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE); + let address = rangeAddress; + for (let i = 0; i < rangeCount; i++) { + marshalRange(address, options.includedRanges[i]); + address += SIZE_OF_RANGE; + } + } + + const treeAddress = C._ts_parser_parse_wasm( + this[0], + this[1], + oldTree ? oldTree[0] : 0, + rangeAddress, + rangeCount, + ); + + if (!treeAddress) { + currentParseCallback = null; + currentLogCallback = null; + throw new Error('Parsing failed'); + } + + const result = new Tree(INTERNAL, treeAddress, this.language, currentParseCallback); + currentParseCallback = null; + currentLogCallback = null; + return result; + } + + reset() { + C._ts_parser_reset(this[0]); + } + + getIncludedRanges() { + C._ts_parser_included_ranges_wasm(this[0]); + const count = getValue(TRANSFER_BUFFER, 'i32'); + const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i = 0; i < count; i++) { + result[i] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } + + getTimeoutMicros() { + return C._ts_parser_timeout_micros(this[0]); + } + + setTimeoutMicros(timeout) { + C._ts_parser_set_timeout_micros(this[0], timeout); + } + + setLogger(callback) { + if (!callback) { + callback = null; + } else if (typeof callback !== 'function') { + throw new Error('Logger callback must be a function'); + } + this.logCallback = callback; + return this; + } + + getLogger() { + return this.logCallback; + } +} + +class Tree { + constructor(internal, address, language, textCallback) { + assertInternal(internal); + this[0] = address; + this.language = language; + this.textCallback = textCallback; + } + + copy() { + const address = C._ts_tree_copy(this[0]); + return new Tree(INTERNAL, address, this.language, this.textCallback); + } + + delete() { + C._ts_tree_delete(this[0]); + this[0] = 0; + } + + edit(edit) { + marshalEdit(edit); + C._ts_tree_edit_wasm(this[0]); + } + + get rootNode() { + C._ts_tree_root_node_wasm(this[0]); + return unmarshalNode(this); + } + + rootNodeWithOffset(offsetBytes, offsetExtent) { + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + setValue(address, offsetBytes, 'i32'); + marshalPoint(address + SIZE_OF_INT, offsetExtent); + C._ts_tree_root_node_with_offset_wasm(this[0]); + return unmarshalNode(this); + } + + getLanguage() { + return this.language; + } + + walk() { + return this.rootNode.walk(); + } + + getChangedRanges(other) { + if (other.constructor !== Tree) { + throw new TypeError('Argument must be a Tree'); + } + + C._ts_tree_get_changed_ranges_wasm(this[0], other[0]); + const count = getValue(TRANSFER_BUFFER, 'i32'); + const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i = 0; i < count; i++) { + result[i] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } + + getIncludedRanges() { + C._ts_tree_included_ranges_wasm(this[0]); + const count = getValue(TRANSFER_BUFFER, 'i32'); + const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i = 0; i < count; i++) { + result[i] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } +} + +class Node { + constructor(internal, tree) { + assertInternal(internal); + this.tree = tree; + } + + get typeId() { + marshalNode(this); + return C._ts_node_symbol_wasm(this.tree[0]); + } + + get grammarId() { + marshalNode(this); + return C._ts_node_grammar_symbol_wasm(this.tree[0]); + } + + get type() { + return this.tree.language.types[this.typeId] || 'ERROR'; + } + + get grammarType() { + return this.tree.language.types[this.grammarId] || 'ERROR'; + } + + get endPosition() { + marshalNode(this); + C._ts_node_end_point_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + + get endIndex() { + marshalNode(this); + return C._ts_node_end_index_wasm(this.tree[0]); + } + + get text() { + return getText(this.tree, this.startIndex, this.endIndex); + } + + get parseState() { + marshalNode(this); + return C._ts_node_parse_state_wasm(this.tree[0]); + } + + get nextParseState() { + marshalNode(this); + return C._ts_node_next_parse_state_wasm(this.tree[0]); + } + + get isNamed() { + marshalNode(this); + return C._ts_node_is_named_wasm(this.tree[0]) === 1; + } + + get hasError() { + marshalNode(this); + return C._ts_node_has_error_wasm(this.tree[0]) === 1; + } + + get hasChanges() { + marshalNode(this); + return C._ts_node_has_changes_wasm(this.tree[0]) === 1; + } + + get isError() { + marshalNode(this); + return C._ts_node_is_error_wasm(this.tree[0]) === 1; + } + + get isMissing() { + marshalNode(this); + return C._ts_node_is_missing_wasm(this.tree[0]) === 1; + } + + get isExtra() { + marshalNode(this); + return C._ts_node_is_extra_wasm(this.tree[0]) === 1; + } + + equals(other) { + return this.id === other.id; + } + + child(index) { + marshalNode(this); + C._ts_node_child_wasm(this.tree[0], index); + return unmarshalNode(this.tree); + } + + namedChild(index) { + marshalNode(this); + C._ts_node_named_child_wasm(this.tree[0], index); + return unmarshalNode(this.tree); + } + + childForFieldId(fieldId) { + marshalNode(this); + C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId); + return unmarshalNode(this.tree); + } + + childForFieldName(fieldName) { + const fieldId = this.tree.language.fields.indexOf(fieldName); + if (fieldId !== -1) return this.childForFieldId(fieldId); + return null; + } + + fieldNameForChild(index) { + marshalNode(this); + const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index); + if (!address) { + return null; + } + const result = AsciiToString(address); + // must not free, the string memory is owned by the language + return result; + } + + childrenForFieldName(fieldName) { + const fieldId = this.tree.language.fields.indexOf(fieldName); + if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId); + return []; + } + + childrenForFieldId(fieldId) { + marshalNode(this); + C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId); + const count = getValue(TRANSFER_BUFFER, 'i32'); + const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i = 0; i < count; i++) { + result[i] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + return result; + } + + firstChildForIndex(index) { + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + setValue(address, index, 'i32'); + C._ts_node_first_child_for_byte_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + firstNamedChildForIndex(index) { + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + setValue(address, index, 'i32'); + C._ts_node_first_named_child_for_byte_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + get childCount() { + marshalNode(this); + return C._ts_node_child_count_wasm(this.tree[0]); + } + + get namedChildCount() { + marshalNode(this); + return C._ts_node_named_child_count_wasm(this.tree[0]); + } + + get firstChild() { + return this.child(0); + } + + get firstNamedChild() { + return this.namedChild(0); + } + + get lastChild() { + return this.child(this.childCount - 1); + } + + get lastNamedChild() { + return this.namedChild(this.namedChildCount - 1); + } + + get children() { + if (!this._children) { + marshalNode(this); + C._ts_node_children_wasm(this.tree[0]); + const count = getValue(TRANSFER_BUFFER, 'i32'); + const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + this._children = new Array(count); + if (count > 0) { + let address = buffer; + for (let i = 0; i < count; i++) { + this._children[i] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + } + return this._children; + } + + get namedChildren() { + if (!this._namedChildren) { + marshalNode(this); + C._ts_node_named_children_wasm(this.tree[0]); + const count = getValue(TRANSFER_BUFFER, 'i32'); + const buffer = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + this._namedChildren = new Array(count); + if (count > 0) { + let address = buffer; + for (let i = 0; i < count; i++) { + this._namedChildren[i] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + } + return this._namedChildren; + } + + descendantsOfType(types, startPosition, endPosition) { + if (!Array.isArray(types)) types = [types]; + if (!startPosition) startPosition = ZERO_POINT; + if (!endPosition) endPosition = ZERO_POINT; + + // Convert the type strings to numeric type symbols. + const symbols = []; + const typesBySymbol = this.tree.language.types; + for (let i = 0, n = typesBySymbol.length; i < n; i++) { + if (types.includes(typesBySymbol[i])) { + symbols.push(i); + } + } + + // Copy the array of symbols to the WASM heap. + const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length); + for (let i = 0, n = symbols.length; i < n; i++) { + setValue(symbolsAddress + i * SIZE_OF_INT, symbols[i], 'i32'); + } + + // Call the C API to compute the descendants. + marshalNode(this); + C._ts_node_descendants_of_type_wasm( + this.tree[0], + symbolsAddress, + symbols.length, + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + ); + + // Instantiate the nodes based on the data returned. + const descendantCount = getValue(TRANSFER_BUFFER, 'i32'); + const descendantAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const result = new Array(descendantCount); + if (descendantCount > 0) { + let address = descendantAddress; + for (let i = 0; i < descendantCount; i++) { + result[i] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + } + + // Free the intermediate buffers + C._free(descendantAddress); + C._free(symbolsAddress); + return result; + } + + get nextSibling() { + marshalNode(this); + C._ts_node_next_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + get previousSibling() { + marshalNode(this); + C._ts_node_prev_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + get nextNamedSibling() { + marshalNode(this); + C._ts_node_next_named_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + get previousNamedSibling() { + marshalNode(this); + C._ts_node_prev_named_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + get descendantCount() { + marshalNode(this); + return C._ts_node_descendant_count_wasm(this.tree[0]); + } + + get parent() { + marshalNode(this); + C._ts_node_parent_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + descendantForIndex(start, end = start) { + if (typeof start !== 'number' || typeof end !== 'number') { + throw new Error('Arguments must be numbers'); + } + + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + setValue(address, start, 'i32'); + setValue(address + SIZE_OF_INT, end, 'i32'); + C._ts_node_descendant_for_index_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + namedDescendantForIndex(start, end = start) { + if (typeof start !== 'number' || typeof end !== 'number') { + throw new Error('Arguments must be numbers'); + } + + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + setValue(address, start, 'i32'); + setValue(address + SIZE_OF_INT, end, 'i32'); + C._ts_node_named_descendant_for_index_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + descendantForPosition(start, end = start) { + if (!isPoint(start) || !isPoint(end)) { + throw new Error('Arguments must be {row, column} objects'); + } + + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + marshalPoint(address, start); + marshalPoint(address + SIZE_OF_POINT, end); + C._ts_node_descendant_for_position_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + namedDescendantForPosition(start, end = start) { + if (!isPoint(start) || !isPoint(end)) { + throw new Error('Arguments must be {row, column} objects'); + } + + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + marshalPoint(address, start); + marshalPoint(address + SIZE_OF_POINT, end); + C._ts_node_named_descendant_for_position_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + walk() { + marshalNode(this); + C._ts_tree_cursor_new_wasm(this.tree[0]); + return new TreeCursor(INTERNAL, this.tree); + } + + toString() { + marshalNode(this); + const address = C._ts_node_to_string_wasm(this.tree[0]); + const result = AsciiToString(address); + C._free(address); + return result; + } +} + +class TreeCursor { + constructor(internal, tree) { + assertInternal(internal); + this.tree = tree; + unmarshalTreeCursor(this); + } + + delete() { + marshalTreeCursor(this); + C._ts_tree_cursor_delete_wasm(this.tree[0]); + this[0] = this[1] = this[2] = 0; + } + + reset(node) { + marshalNode(node); + marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE); + C._ts_tree_cursor_reset_wasm(this.tree[0]); + unmarshalTreeCursor(this); + } + + resetTo(cursor) { + marshalTreeCursor(this, TRANSFER_BUFFER); + marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR); + C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]); + unmarshalTreeCursor(this); + } + + get nodeType() { + return this.tree.language.types[this.nodeTypeId] || 'ERROR'; + } + + get nodeTypeId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]); + } + + get nodeStateId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]); + } + + get nodeId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]); + } + + get nodeIsNamed() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1; + } + + get nodeIsMissing() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1; + } + + get nodeText() { + marshalTreeCursor(this); + const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]); + const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]); + return getText(this.tree, startIndex, endIndex); + } + + get startPosition() { + marshalTreeCursor(this); + C._ts_tree_cursor_start_position_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + + get endPosition() { + marshalTreeCursor(this); + C._ts_tree_cursor_end_position_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + + get startIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_start_index_wasm(this.tree[0]); + } + + get endIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_end_index_wasm(this.tree[0]); + } + + get currentNode() { + marshalTreeCursor(this); + C._ts_tree_cursor_current_node_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + + get currentFieldId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]); + } + + get currentFieldName() { + return this.tree.language.fields[this.currentFieldId]; + } + + get currentDepth() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_depth_wasm(this.tree[0]); + } + + get currentDescendantIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]); + } + + gotoFirstChild() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + + gotoLastChild() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + + gotoFirstChildForIndex(goalIndex) { + marshalTreeCursor(this); + setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, 'i32'); + const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + + gotoFirstChildForPosition(goalPosition) { + marshalTreeCursor(this); + marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition); + const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + + gotoNextSibling() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + + gotoPreviousSibling() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + + gotoDescendant(goalDescendantindex) { + marshalTreeCursor(this); + C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantindex); + unmarshalTreeCursor(this); + } + + gotoParent() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } +} + +class Language { + constructor(internal, address) { + assertInternal(internal); + this[0] = address; + this.types = new Array(C._ts_language_symbol_count(this[0])); + for (let i = 0, n = this.types.length; i < n; i++) { + if (C._ts_language_symbol_type(this[0], i) < 2) { + this.types[i] = UTF8ToString(C._ts_language_symbol_name(this[0], i)); + } + } + this.fields = new Array(C._ts_language_field_count(this[0]) + 1); + for (let i = 0, n = this.fields.length; i < n; i++) { + const fieldName = C._ts_language_field_name_for_id(this[0], i); + if (fieldName !== 0) { + this.fields[i] = UTF8ToString(fieldName); + } else { + this.fields[i] = null; + } + } + } + + get version() { + return C._ts_language_version(this[0]); + } + + get fieldCount() { + return this.fields.length - 1; + } + + get stateCount() { + return C._ts_language_state_count(this[0]); + } + + fieldIdForName(fieldName) { + const result = this.fields.indexOf(fieldName); + if (result !== -1) { + return result; + } else { + return null; + } + } + + fieldNameForId(fieldId) { + return this.fields[fieldId] || null; + } + + idForNodeType(type, named) { + const typeLength = lengthBytesUTF8(type); + const typeAddress = C._malloc(typeLength + 1); + stringToUTF8(type, typeAddress, typeLength + 1); + const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named); + C._free(typeAddress); + return result || null; + } + + get nodeTypeCount() { + return C._ts_language_symbol_count(this[0]); + } + + nodeTypeForId(typeId) { + const name = C._ts_language_symbol_name(this[0], typeId); + return name ? UTF8ToString(name) : null; + } + + nodeTypeIsNamed(typeId) { + return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false; + } + + nodeTypeIsVisible(typeId) { + return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false; + } + + nextState(stateId, typeId) { + return C._ts_language_next_state(this[0], stateId, typeId); + } + + lookaheadIterator(stateId) { + const address = C._ts_lookahead_iterator_new(this[0], stateId); + if (address) return new LookaheadIterable(INTERNAL, address, this); + return null; + } + + query(source) { + const sourceLength = lengthBytesUTF8(source); + const sourceAddress = C._malloc(sourceLength + 1); + stringToUTF8(source, sourceAddress, sourceLength + 1); + const address = C._ts_query_new( + this[0], + sourceAddress, + sourceLength, + TRANSFER_BUFFER, + TRANSFER_BUFFER + SIZE_OF_INT, + ); + + if (!address) { + const errorId = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const errorByte = getValue(TRANSFER_BUFFER, 'i32'); + const errorIndex = UTF8ToString(sourceAddress, errorByte).length; + const suffix = source.substr(errorIndex, 100).split('\n')[0]; + let word = suffix.match(QUERY_WORD_REGEX)[0]; + let error; + switch (errorId) { + case 2: + error = new RangeError(`Bad node name '${word}'`); + break; + case 3: + error = new RangeError(`Bad field name '${word}'`); + break; + case 4: + error = new RangeError(`Bad capture name @${word}`); + break; + case 5: + error = new TypeError(`Bad pattern structure at offset ${errorIndex}: '${suffix}'...`); + word = ''; + break; + default: + error = new SyntaxError(`Bad syntax at offset ${errorIndex}: '${suffix}'...`); + word = ''; + break; + } + error.index = errorIndex; + error.length = word.length; + C._free(sourceAddress); + throw error; + } + + const stringCount = C._ts_query_string_count(address); + const captureCount = C._ts_query_capture_count(address); + const patternCount = C._ts_query_pattern_count(address); + const captureNames = new Array(captureCount); + const stringValues = new Array(stringCount); + + for (let i = 0; i < captureCount; i++) { + const nameAddress = C._ts_query_capture_name_for_id( + address, + i, + TRANSFER_BUFFER, + ); + const nameLength = getValue(TRANSFER_BUFFER, 'i32'); + captureNames[i] = UTF8ToString(nameAddress, nameLength); + } + + for (let i = 0; i < stringCount; i++) { + const valueAddress = C._ts_query_string_value_for_id( + address, + i, + TRANSFER_BUFFER, + ); + const nameLength = getValue(TRANSFER_BUFFER, 'i32'); + stringValues[i] = UTF8ToString(valueAddress, nameLength); + } + + const setProperties = new Array(patternCount); + const assertedProperties = new Array(patternCount); + const refutedProperties = new Array(patternCount); + const predicates = new Array(patternCount); + const textPredicates = new Array(patternCount); + + for (let i = 0; i < patternCount; i++) { + const predicatesAddress = C._ts_query_predicates_for_pattern( + address, + i, + TRANSFER_BUFFER, + ); + const stepCount = getValue(TRANSFER_BUFFER, 'i32'); + + predicates[i] = []; + textPredicates[i] = []; + + const steps = []; + let stepAddress = predicatesAddress; + for (let j = 0; j < stepCount; j++) { + const stepType = getValue(stepAddress, 'i32'); + stepAddress += SIZE_OF_INT; + const stepValueId = getValue(stepAddress, 'i32'); + stepAddress += SIZE_OF_INT; + if (stepType === PREDICATE_STEP_TYPE_CAPTURE) { + steps.push({type: 'capture', name: captureNames[stepValueId]}); + } else if (stepType === PREDICATE_STEP_TYPE_STRING) { + steps.push({type: 'string', value: stringValues[stepValueId]}); + } else if (steps.length > 0) { + if (steps[0].type !== 'string') { + throw new Error('Predicates must begin with a literal value'); + } + const operator = steps[0].value; + let isPositive = true; + let matchAll = true; + let captureName; + switch (operator) { + case 'any-not-eq?': + case 'not-eq?': + isPositive = false; + case 'any-eq?': + case 'eq?': + if (steps.length !== 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}`, + ); + } + if (steps[1].type !== 'capture') { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}"`, + ); + } + matchAll = !operator.startsWith('any-'); + if (steps[2].type === 'capture') { + const captureName1 = steps[1].name; + const captureName2 = steps[2].name; + textPredicates[i].push((captures) => { + const nodes1 = []; + const nodes2 = []; + for (const c of captures) { + if (c.name === captureName1) nodes1.push(c.node); + if (c.name === captureName2) nodes2.push(c.node); + } + const compare = (n1, n2, positive) => { + return positive ? + n1.text === n2.text : + n1.text !== n2.text; + }; + return matchAll ? + nodes1.every((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))) : + nodes1.some((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))); + }); + } else { + captureName = steps[1].name; + const stringValue = steps[2].value; + const matches = (n) => n.text === stringValue; + const doesNotMatch = (n) => n.text !== stringValue; + textPredicates[i].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node); + } + const test = isPositive ? matches : doesNotMatch; + return matchAll ? + nodes.every(test) : + nodes.some(test); + }); + } + break; + + case 'any-not-match?': + case 'not-match?': + isPositive = false; + case 'any-match?': + case 'match?': + if (steps.length !== 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}.`, + ); + } + if (steps[1].type !== 'capture') { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".`, + ); + } + if (steps[2].type !== 'string') { + throw new Error( + `Second argument of \`#${operator}\` predicate must be a string. Got @${steps[2].value}.`, + ); + } + captureName = steps[1].name; + const regex = new RegExp(steps[2].value); + matchAll = !operator.startsWith('any-'); + textPredicates[i].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node.text); + } + const test = (text, positive) => { + return positive ? + regex.test(text) : + !regex.test(text); + }; + if (nodes.length === 0) return !isPositive; + return matchAll ? + nodes.every((text) => test(text, isPositive)) : + nodes.some((text) => test(text, isPositive)); + }); + break; + + case 'set!': + if (steps.length < 2 || steps.length > 3) { + throw new Error( + `Wrong number of arguments to \`#set!\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`, + ); + } + if (steps.some((s) => s.type !== 'string')) { + throw new Error( + `Arguments to \`#set!\` predicate must be a strings.".`, + ); + } + if (!setProperties[i]) setProperties[i] = {}; + setProperties[i][steps[1].value] = steps[2] ? steps[2].value : null; + break; + + case 'is?': + case 'is-not?': + if (steps.length < 2 || steps.length > 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`, + ); + } + if (steps.some((s) => s.type !== 'string')) { + throw new Error( + `Arguments to \`#${operator}\` predicate must be a strings.".`, + ); + } + const properties = operator === 'is?' ? assertedProperties : refutedProperties; + if (!properties[i]) properties[i] = {}; + properties[i][steps[1].value] = steps[2] ? steps[2].value : null; + break; + + case 'not-any-of?': + isPositive = false; + case 'any-of?': + if (steps.length < 2) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected at least 1. Got ${steps.length - 1}.`, + ); + } + if (steps[1].type !== 'capture') { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".`, + ); + } + for (let i = 2; i < steps.length; i++) { + if (steps[i].type !== 'string') { + throw new Error( + `Arguments to \`#${operator}\` predicate must be a strings.".`, + ); + } + } + captureName = steps[1].name; + const values = steps.slice(2).map((s) => s.value); + textPredicates[i].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node.text); + } + if (nodes.length === 0) return !isPositive; + return nodes.every((text) => values.includes(text)) === isPositive; + }); + break; + + default: + predicates[i].push({operator, operands: steps.slice(1)}); + } + + steps.length = 0; + } + } + + Object.freeze(setProperties[i]); + Object.freeze(assertedProperties[i]); + Object.freeze(refutedProperties[i]); + } + + C._free(sourceAddress); + return new Query( + INTERNAL, + address, + captureNames, + textPredicates, + predicates, + Object.freeze(setProperties), + Object.freeze(assertedProperties), + Object.freeze(refutedProperties), + ); + } + + static load(input) { + let bytes; + if (input instanceof Uint8Array) { + bytes = Promise.resolve(input); + } else { + const url = input; + if ( + typeof process !== 'undefined' && + process.versions && + process.versions.node + ) { + const fs = require('fs'); + bytes = Promise.resolve(fs.readFileSync(url)); + } else { + bytes = fetch(url) + .then((response) => response.arrayBuffer() + .then((buffer) => { + if (response.ok) { + return new Uint8Array(buffer); + } else { + const body = new TextDecoder('utf-8').decode(buffer); + throw new Error(`Language.load failed with status ${response.status}.\n\n${body}`); + } + })); + } + } + + return bytes + .then((bytes) => loadWebAssemblyModule(bytes, {loadAsync: true})) + .then((mod) => { + const symbolNames = Object.keys(mod); + const functionName = symbolNames.find((key) => + LANGUAGE_FUNCTION_REGEX.test(key) && + !key.includes('external_scanner_'), + ); + if (!functionName) { + console.log(`Couldn't find language function in WASM file. Symbols:\n${JSON.stringify(symbolNames, null, 2)}`); + } + const languageAddress = mod[functionName](); + return new Language(INTERNAL, languageAddress); + }); + } +} + +class LookaheadIterable { + constructor(internal, address, language) { + assertInternal(internal); + this[0] = address; + this.language = language; + } + + get currentTypeId() { + return C._ts_lookahead_iterator_current_symbol(this[0]); + } + + get currentType() { + return this.language.types[this.currentTypeId] || 'ERROR'; + } + + delete() { + C._ts_lookahead_iterator_delete(this[0]); + this[0] = 0; + } + + resetState(stateId) { + return C._ts_lookahead_iterator_reset_state(this[0], stateId); + } + + reset(language, stateId) { + if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) { + this.language = language; + return true; + } + + return false; + } + + [Symbol.iterator]() { + const self = this; + return { + next() { + if (C._ts_lookahead_iterator_next(self[0])) { + return {done: false, value: self.currentType}; + } + + return {done: true, value: ''}; + }, + }; + } +} + +class Query { + constructor( + internal, address, captureNames, textPredicates, predicates, + setProperties, assertedProperties, refutedProperties, + ) { + assertInternal(internal); + this[0] = address; + this.captureNames = captureNames; + this.textPredicates = textPredicates; + this.predicates = predicates; + this.setProperties = setProperties; + this.assertedProperties = assertedProperties; + this.refutedProperties = refutedProperties; + this.exceededMatchLimit = false; + } + + delete() { + C._ts_query_delete(this[0]); + this[0] = 0; + } + + matches( + node, + { + startPosition = ZERO_POINT, + endPosition = ZERO_POINT, + startIndex = 0, + endIndex = 0, + matchLimit = 0xFFFFFFFF, + maxStartDepth = 0xFFFFFFFF, + timeoutMicros = 0, + } = {}, + ) { + if (typeof matchLimit !== 'number') { + throw new Error('Arguments must be numbers'); + } + + marshalNode(node); + + C._ts_query_matches_wasm( + this[0], + node.tree[0], + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + startIndex, + endIndex, + matchLimit, + maxStartDepth, + timeoutMicros, + ); + + const rawCount = getValue(TRANSFER_BUFFER, 'i32'); + const startAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const didExceedMatchLimit = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32'); + const result = new Array(rawCount); + this.exceededMatchLimit = Boolean(didExceedMatchLimit); + + let filteredCount = 0; + let address = startAddress; + for (let i = 0; i < rawCount; i++) { + const pattern = getValue(address, 'i32'); + address += SIZE_OF_INT; + const captureCount = getValue(address, 'i32'); + address += SIZE_OF_INT; + + const captures = new Array(captureCount); + address = unmarshalCaptures(this, node.tree, address, captures); + if (this.textPredicates[pattern].every((p) => p(captures))) { + result[filteredCount] = {pattern, captures}; + const setProperties = this.setProperties[pattern]; + if (setProperties) result[filteredCount].setProperties = setProperties; + const assertedProperties = this.assertedProperties[pattern]; + if (assertedProperties) result[filteredCount].assertedProperties = assertedProperties; + const refutedProperties = this.refutedProperties[pattern]; + if (refutedProperties) result[filteredCount].refutedProperties = refutedProperties; + filteredCount++; + } + } + result.length = filteredCount; + + C._free(startAddress); + return result; + } + + captures( + node, + { + startPosition = ZERO_POINT, + endPosition = ZERO_POINT, + startIndex = 0, + endIndex = 0, + matchLimit = 0xFFFFFFFF, + maxStartDepth = 0xFFFFFFFF, + timeoutMicros = 0, + } = {}, + ) { + if (typeof matchLimit !== 'number') { + throw new Error('Arguments must be numbers'); + } + + marshalNode(node); + + C._ts_query_captures_wasm( + this[0], + node.tree[0], + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + startIndex, + endIndex, + matchLimit, + maxStartDepth, + timeoutMicros, + ); + + const count = getValue(TRANSFER_BUFFER, 'i32'); + const startAddress = getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); + const didExceedMatchLimit = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32'); + const result = []; + this.exceededMatchLimit = Boolean(didExceedMatchLimit); + + const captures = []; + let address = startAddress; + for (let i = 0; i < count; i++) { + const pattern = getValue(address, 'i32'); + address += SIZE_OF_INT; + const captureCount = getValue(address, 'i32'); + address += SIZE_OF_INT; + const captureIndex = getValue(address, 'i32'); + address += SIZE_OF_INT; + + captures.length = captureCount; + address = unmarshalCaptures(this, node.tree, address, captures); + + if (this.textPredicates[pattern].every((p) => p(captures))) { + const capture = captures[captureIndex]; + const setProperties = this.setProperties[pattern]; + if (setProperties) capture.setProperties = setProperties; + const assertedProperties = this.assertedProperties[pattern]; + if (assertedProperties) capture.assertedProperties = assertedProperties; + const refutedProperties = this.refutedProperties[pattern]; + if (refutedProperties) capture.refutedProperties = refutedProperties; + result.push(capture); + } + } + + C._free(startAddress); + return result; + } + + predicatesForPattern(patternIndex) { + return this.predicates[patternIndex]; + } + + disableCapture(captureName) { + const captureNameLength = lengthBytesUTF8(captureName); + const captureNameAddress = C._malloc(captureNameLength + 1); + stringToUTF8(captureName, captureNameAddress, captureNameLength + 1); + C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength); + C._free(captureNameAddress); + } + + didExceedMatchLimit() { + return this.exceededMatchLimit; + } +} + +function getText(tree, startIndex, endIndex) { + const length = endIndex - startIndex; + let result = tree.textCallback(startIndex, null, endIndex); + startIndex += result.length; + while (startIndex < endIndex) { + const string = tree.textCallback(startIndex, null, endIndex); + if (string && string.length > 0) { + startIndex += string.length; + result += string; + } else { + break; + } + } + if (startIndex > endIndex) { + result = result.slice(0, length); + } + return result; +} + +function unmarshalCaptures(query, tree, address, result) { + for (let i = 0, n = result.length; i < n; i++) { + const captureIndex = getValue(address, 'i32'); + address += SIZE_OF_INT; + const node = unmarshalNode(tree, address); + address += SIZE_OF_NODE; + result[i] = {name: query.captureNames[captureIndex], node}; + } + return address; +} + +function assertInternal(x) { + if (x !== INTERNAL) throw new Error('Illegal constructor'); +} + +function isPoint(point) { + return ( + point && + typeof point.row === 'number' && + typeof point.column === 'number' + ); +} + +function marshalNode(node) { + let address = TRANSFER_BUFFER; + setValue(address, node.id, 'i32'); + address += SIZE_OF_INT; + setValue(address, node.startIndex, 'i32'); + address += SIZE_OF_INT; + setValue(address, node.startPosition.row, 'i32'); + address += SIZE_OF_INT; + setValue(address, node.startPosition.column, 'i32'); + address += SIZE_OF_INT; + setValue(address, node[0], 'i32'); +} + +function unmarshalNode(tree, address = TRANSFER_BUFFER) { + const id = getValue(address, 'i32'); + address += SIZE_OF_INT; + if (id === 0) return null; + + const index = getValue(address, 'i32'); + address += SIZE_OF_INT; + const row = getValue(address, 'i32'); + address += SIZE_OF_INT; + const column = getValue(address, 'i32'); + address += SIZE_OF_INT; + const other = getValue(address, 'i32'); + + const result = new Node(INTERNAL, tree); + result.id = id; + result.startIndex = index; + result.startPosition = {row, column}; + result[0] = other; + + return result; +} + +function marshalTreeCursor(cursor, address = TRANSFER_BUFFER) { + setValue(address + 0 * SIZE_OF_INT, cursor[0], 'i32'); + setValue(address + 1 * SIZE_OF_INT, cursor[1], 'i32'); + setValue(address + 2 * SIZE_OF_INT, cursor[2], 'i32'); + setValue(address + 3 * SIZE_OF_INT, cursor[3], 'i32'); +} + +function unmarshalTreeCursor(cursor) { + cursor[0] = getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, 'i32'); + cursor[1] = getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, 'i32'); + cursor[2] = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32'); + cursor[3] = getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, 'i32'); +} + +function marshalPoint(address, point) { + setValue(address, point.row, 'i32'); + setValue(address + SIZE_OF_INT, point.column, 'i32'); +} + +function unmarshalPoint(address) { + const result = { + row: getValue(address, 'i32') >>> 0, + column: getValue(address + SIZE_OF_INT, 'i32') >>> 0, + }; + return result; +} + +function marshalRange(address, range) { + marshalPoint(address, range.startPosition); address += SIZE_OF_POINT; + marshalPoint(address, range.endPosition); address += SIZE_OF_POINT; + setValue(address, range.startIndex, 'i32'); address += SIZE_OF_INT; + setValue(address, range.endIndex, 'i32'); address += SIZE_OF_INT; +} + +function unmarshalRange(address) { + const result = {}; + result.startPosition = unmarshalPoint(address); address += SIZE_OF_POINT; + result.endPosition = unmarshalPoint(address); address += SIZE_OF_POINT; + result.startIndex = getValue(address, 'i32') >>> 0; address += SIZE_OF_INT; + result.endIndex = getValue(address, 'i32') >>> 0; + return result; +} + +function marshalEdit(edit) { + let address = TRANSFER_BUFFER; + marshalPoint(address, edit.startPosition); address += SIZE_OF_POINT; + marshalPoint(address, edit.oldEndPosition); address += SIZE_OF_POINT; + marshalPoint(address, edit.newEndPosition); address += SIZE_OF_POINT; + setValue(address, edit.startIndex, 'i32'); address += SIZE_OF_INT; + setValue(address, edit.oldEndIndex, 'i32'); address += SIZE_OF_INT; + setValue(address, edit.newEndIndex, 'i32'); address += SIZE_OF_INT; +} diff --git a/lib/binding_web/check-artifacts-fresh.js b/lib/binding_web/check-artifacts-fresh.js new file mode 100755 index 00000000..a0c24933 --- /dev/null +++ b/lib/binding_web/check-artifacts-fresh.js @@ -0,0 +1,36 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +const inputFiles = [ + 'binding.c', + 'binding.js', + 'exports.txt', + 'imports.js', + 'prefix.js', + ...list('../include/tree_sitter'), + ...list('../src'), +]; + +const outputFiles = ['tree-sitter.js', 'tree-sitter.wasm']; + +const outputMtime = Math.min(...outputFiles.map(mtime)); + +for (const inputFile of inputFiles) { + if (mtime(inputFile) > outputMtime) { + console.log(`File '${inputFile}' has changed. Re-run 'script/build-wasm'.`); + process.exit(1); + } +} + +function list(dir) { + return fs + .readdirSync(path.join(__dirname, dir), 'utf8') + .filter((p) => !p.startsWith('.')) + .map((p) => path.join(dir, p)); +} + +function mtime(p) { + return fs.statSync(path.join(__dirname, p)).mtime; +} diff --git a/lib/binding_web/eslint.config.mjs b/lib/binding_web/eslint.config.mjs deleted file mode 100644 index a8bb9739..00000000 --- a/lib/binding_web/eslint.config.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; - -export default tseslint.config( - eslint.configs.recommended, - tseslint.configs.recommendedTypeChecked, - tseslint.configs.strictTypeChecked, - tseslint.configs.stylisticTypeChecked, - { - languageOptions: { - parserOptions: { - projectService: true, - tsconfigRootDir: import.meta.dirname, - }, - }, - rules: { - 'no-fallthrough': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/no-unnecessary-condition': ['error', { - allowConstantLoopConditions: true - }], - '@typescript-eslint/restrict-template-expressions': ['error', { - allowNumber: true - }], - } - }, -); diff --git a/lib/binding_web/lib/exports.txt b/lib/binding_web/exports.txt similarity index 86% rename from lib/binding_web/lib/exports.txt rename to lib/binding_web/exports.txt index 86104496..7507c51f 100644 --- a/lib/binding_web/lib/exports.txt +++ b/lib/binding_web/exports.txt @@ -5,17 +5,12 @@ "ts_language_type_is_visible_wasm", "ts_language_symbol_count", "ts_language_state_count", -"ts_language_supertypes_wasm", -"ts_language_subtypes_wasm", "ts_language_symbol_for_name", "ts_language_symbol_name", "ts_language_symbol_type", -"ts_language_name", -"ts_language_abi_version", -"ts_language_metadata_wasm", +"ts_language_version", "ts_language_next_state", "ts_node_field_name_for_child_wasm", -"ts_node_field_name_for_named_child_wasm", "ts_node_children_by_field_id_wasm", "ts_node_first_child_for_byte_wasm", "ts_node_first_named_child_for_byte_wasm", @@ -44,7 +39,6 @@ "ts_node_next_named_sibling_wasm", "ts_node_next_sibling_wasm", "ts_node_parent_wasm", -"ts_node_child_with_descendant_wasm", "ts_node_prev_named_sibling_wasm", "ts_node_prev_sibling_wasm", "ts_node_descendant_count_wasm", @@ -61,7 +55,8 @@ "ts_parser_set_language", "ts_parser_set_included_ranges", "ts_parser_included_ranges_wasm", -"ts_point_edit", +"ts_parser_set_timeout_micros", +"ts_parser_timeout_micros", "ts_query_capture_count", "ts_query_capture_name_for_id", "ts_query_captures_wasm", @@ -71,16 +66,8 @@ "ts_query_pattern_count", "ts_query_predicates_for_pattern", "ts_query_disable_capture", -"ts_query_start_byte_for_pattern", -"ts_query_end_byte_for_pattern", "ts_query_string_count", "ts_query_string_value_for_id", -"ts_query_disable_pattern", -"ts_query_capture_quantifier_for_id", -"ts_query_is_pattern_non_local", -"ts_query_is_pattern_rooted", -"ts_query_is_pattern_guaranteed_at_step", -"ts_range_edit", "ts_tree_copy", "ts_tree_cursor_current_field_id_wasm", "ts_tree_cursor_current_depth_wasm", @@ -107,7 +94,6 @@ "ts_tree_cursor_reset_to_wasm", "ts_tree_cursor_start_index_wasm", "ts_tree_cursor_start_position_wasm", -"ts_tree_cursor_copy_wasm", "ts_tree_delete", "ts_tree_included_ranges_wasm", "ts_tree_edit_wasm", diff --git a/lib/binding_web/imports.js b/lib/binding_web/imports.js new file mode 100644 index 00000000..dfb65bbe --- /dev/null +++ b/lib/binding_web/imports.js @@ -0,0 +1,25 @@ +mergeInto(LibraryManager.library, { + tree_sitter_parse_callback( + inputBufferAddress, + index, + row, + column, + lengthAddress, + ) { + const INPUT_BUFFER_SIZE = 10 * 1024; + const string = currentParseCallback(index, {row, column}); + if (typeof string === 'string') { + setValue(lengthAddress, string.length, 'i32'); + stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE); + } else { + setValue(lengthAddress, 0, 'i32'); + } + }, + + tree_sitter_log_callback(isLexMessage, messageAddress) { + if (currentLogCallback) { + const message = UTF8ToString(messageAddress); + currentLogCallback(message, isLexMessage !== 0); + } + }, +}); diff --git a/lib/binding_web/lib/imports.js b/lib/binding_web/lib/imports.js deleted file mode 100644 index 01e789ae..00000000 --- a/lib/binding_web/lib/imports.js +++ /dev/null @@ -1,39 +0,0 @@ -mergeInto(LibraryManager.library, { - tree_sitter_parse_callback( - inputBufferAddress, - index, - row, - column, - lengthAddress, - ) { - const INPUT_BUFFER_SIZE = 10 * 1024; - const string = Module.currentParseCallback(index, { row, column }); - if (typeof string === 'string') { - setValue(lengthAddress, string.length, 'i32'); - stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE); - } else { - setValue(lengthAddress, 0, 'i32'); - } - }, - - tree_sitter_log_callback(isLexMessage, messageAddress) { - if (Module.currentLogCallback) { - const message = UTF8ToString(messageAddress); - Module.currentLogCallback(message, isLexMessage !== 0); - } - }, - - tree_sitter_progress_callback(currentOffset, hasError) { - if (Module.currentProgressCallback) { - return Module.currentProgressCallback({ currentOffset, hasError }); - } - return false; - }, - - tree_sitter_query_progress_callback(currentOffset) { - if (Module.currentQueryProgressCallback) { - return Module.currentQueryProgressCallback({ currentOffset }); - } - return false; - }, -}); diff --git a/lib/binding_web/lib/prefix.js b/lib/binding_web/lib/prefix.js deleted file mode 100644 index bd953d5d..00000000 --- a/lib/binding_web/lib/prefix.js +++ /dev/null @@ -1,4 +0,0 @@ -Module.currentQueryProgressCallback = null; -Module.currentProgressCallback = null; -Module.currentLogCallback = null; -Module.currentParseCallback = null; diff --git a/lib/binding_web/lib/web-tree-sitter.d.ts b/lib/binding_web/lib/web-tree-sitter.d.ts deleted file mode 100644 index c1e0e0dd..00000000 --- a/lib/binding_web/lib/web-tree-sitter.d.ts +++ /dev/null @@ -1,205 +0,0 @@ -// TypeScript bindings for emscripten-generated code. Automatically @generated at compile time. -declare namespace RuntimeExports { - function AsciiToString(ptr: number): string; - function stringToUTF8(str: string, outPtr: number, maxBytesToWrite: number): number; - /** - * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the - * emscripten HEAP, returns a copy of that string as a Javascript String object. - * - * @param {number} ptr - * @param {number=} maxBytesToRead - An optional length that specifies the - * maximum number of bytes to read. You can omit this parameter to scan the - * string until the first 0 byte. If maxBytesToRead is passed, and the string - * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the - * string will cut short at that byte index. - * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. - * @return {string} - */ - function UTF8ToString(ptr: number, maxBytesToRead?: number | undefined, ignoreNul?: boolean | undefined): string; - function lengthBytesUTF8(str: string): number; - function stringToUTF16(str: string, outPtr: number, maxBytesToWrite: number): number; - /** - * @param {string=} libName - * @param {Object=} localScope - * @param {number=} handle - */ - function loadWebAssemblyModule(binary: Uint8Array | WebAssembly.Module, flags: Record, libName?: string, localScope?: Record, handle?: number): Promise number>>; - /** - * @param {number} ptr - * @param {string} type - */ - function getValue(ptr: number, type?: string): number; - /** - * @param {number} ptr - * @param {number} value - * @param {string} type - */ - function setValue(ptr: number, value: number, type?: string): void; - let HEAPF32: Float32Array; - let HEAPF64: Float64Array; - let HEAP_DATA_VIEW: DataView; - let HEAP8: Int8Array; - let HEAPU8: Uint8Array; - let HEAP16: Int16Array; - let HEAPU16: Uint16Array; - let HEAP32: Int32Array; - let HEAPU32: Uint32Array; - let HEAP64: BigInt64Array; - let HEAPU64: BigUint64Array; - function LE_HEAP_STORE_I64(byteOffset: any, value: any): any; -} -interface WasmModule { - _malloc(_0: number): number; - _calloc(_0: number, _1: number): number; - _realloc(_0: number, _1: number): number; - _free(_0: number): void; - _memcmp(_0: number, _1: number, _2: number): number; - _ts_language_symbol_count(_0: number): number; - _ts_language_state_count(_0: number): number; - _ts_language_abi_version(_0: number): number; - _ts_language_name(_0: number): number; - _ts_language_field_count(_0: number): number; - _ts_language_next_state(_0: number, _1: number, _2: number): number; - _ts_language_symbol_name(_0: number, _1: number): number; - _ts_language_symbol_for_name(_0: number, _1: number, _2: number, _3: number): number; - _strncmp(_0: number, _1: number, _2: number): number; - _ts_language_symbol_type(_0: number, _1: number): number; - _ts_language_field_name_for_id(_0: number, _1: number): number; - _ts_lookahead_iterator_new(_0: number, _1: number): number; - _ts_lookahead_iterator_delete(_0: number): void; - _ts_lookahead_iterator_reset_state(_0: number, _1: number): number; - _ts_lookahead_iterator_reset(_0: number, _1: number, _2: number): number; - _ts_lookahead_iterator_next(_0: number): number; - _ts_lookahead_iterator_current_symbol(_0: number): number; - _ts_parser_delete(_0: number): void; - _ts_parser_reset(_0: number): void; - _ts_parser_set_language(_0: number, _1: number): number; - _ts_parser_set_included_ranges(_0: number, _1: number, _2: number): number; - _ts_query_new(_0: number, _1: number, _2: number, _3: number, _4: number): number; - _ts_query_delete(_0: number): void; - _iswspace(_0: number): number; - _iswalnum(_0: number): number; - _ts_query_pattern_count(_0: number): number; - _ts_query_capture_count(_0: number): number; - _ts_query_string_count(_0: number): number; - _ts_query_capture_name_for_id(_0: number, _1: number, _2: number): number; - _ts_query_capture_quantifier_for_id(_0: number, _1: number, _2: number): number; - _ts_query_string_value_for_id(_0: number, _1: number, _2: number): number; - _ts_query_predicates_for_pattern(_0: number, _1: number, _2: number): number; - _ts_query_start_byte_for_pattern(_0: number, _1: number): number; - _ts_query_end_byte_for_pattern(_0: number, _1: number): number; - _ts_query_is_pattern_rooted(_0: number, _1: number): number; - _ts_query_is_pattern_non_local(_0: number, _1: number): number; - _ts_query_is_pattern_guaranteed_at_step(_0: number, _1: number): number; - _ts_query_disable_capture(_0: number, _1: number, _2: number): void; - _ts_query_disable_pattern(_0: number, _1: number): void; - _ts_tree_copy(_0: number): number; - _ts_tree_delete(_0: number): void; - _ts_init(): number; - _ts_parser_new_wasm(): void; - _ts_parser_enable_logger_wasm(_0: number, _1: number): void; - _ts_parser_parse_wasm(_0: number, _1: number, _2: number, _3: number, _4: number): number; - _ts_parser_included_ranges_wasm(_0: number): void; - _ts_language_type_is_named_wasm(_0: number, _1: number): number; - _ts_language_type_is_visible_wasm(_0: number, _1: number): number; - _ts_language_metadata_wasm(_0: number): void; - _ts_language_supertypes_wasm(_0: number): void; - _ts_language_subtypes_wasm(_0: number, _1: number): void; - _ts_tree_root_node_wasm(_0: number): void; - _ts_tree_root_node_with_offset_wasm(_0: number): void; - _ts_tree_edit_wasm(_0: number): void; - _ts_tree_included_ranges_wasm(_0: number): void; - _ts_tree_get_changed_ranges_wasm(_0: number, _1: number): void; - _ts_tree_cursor_new_wasm(_0: number): void; - _ts_tree_cursor_copy_wasm(_0: number): void; - _ts_tree_cursor_delete_wasm(_0: number): void; - _ts_tree_cursor_reset_wasm(_0: number): void; - _ts_tree_cursor_reset_to_wasm(_0: number, _1: number): void; - _ts_tree_cursor_goto_first_child_wasm(_0: number): number; - _ts_tree_cursor_goto_last_child_wasm(_0: number): number; - _ts_tree_cursor_goto_first_child_for_index_wasm(_0: number): number; - _ts_tree_cursor_goto_first_child_for_position_wasm(_0: number): number; - _ts_tree_cursor_goto_next_sibling_wasm(_0: number): number; - _ts_tree_cursor_goto_previous_sibling_wasm(_0: number): number; - _ts_tree_cursor_goto_descendant_wasm(_0: number, _1: number): void; - _ts_tree_cursor_goto_parent_wasm(_0: number): number; - _ts_tree_cursor_current_node_type_id_wasm(_0: number): number; - _ts_tree_cursor_current_node_state_id_wasm(_0: number): number; - _ts_tree_cursor_current_node_is_named_wasm(_0: number): number; - _ts_tree_cursor_current_node_is_missing_wasm(_0: number): number; - _ts_tree_cursor_current_node_id_wasm(_0: number): number; - _ts_tree_cursor_start_position_wasm(_0: number): void; - _ts_tree_cursor_end_position_wasm(_0: number): void; - _ts_tree_cursor_start_index_wasm(_0: number): number; - _ts_tree_cursor_end_index_wasm(_0: number): number; - _ts_tree_cursor_current_field_id_wasm(_0: number): number; - _ts_tree_cursor_current_depth_wasm(_0: number): number; - _ts_tree_cursor_current_descendant_index_wasm(_0: number): number; - _ts_tree_cursor_current_node_wasm(_0: number): void; - _ts_node_symbol_wasm(_0: number): number; - _ts_node_field_name_for_child_wasm(_0: number, _1: number): number; - _ts_node_field_name_for_named_child_wasm(_0: number, _1: number): number; - _ts_node_children_by_field_id_wasm(_0: number, _1: number): void; - _ts_node_first_child_for_byte_wasm(_0: number): void; - _ts_node_first_named_child_for_byte_wasm(_0: number): void; - _ts_node_grammar_symbol_wasm(_0: number): number; - _ts_node_child_count_wasm(_0: number): number; - _ts_node_named_child_count_wasm(_0: number): number; - _ts_node_child_wasm(_0: number, _1: number): void; - _ts_node_named_child_wasm(_0: number, _1: number): void; - _ts_node_child_by_field_id_wasm(_0: number, _1: number): void; - _ts_node_next_sibling_wasm(_0: number): void; - _ts_node_prev_sibling_wasm(_0: number): void; - _ts_node_next_named_sibling_wasm(_0: number): void; - _ts_node_prev_named_sibling_wasm(_0: number): void; - _ts_node_descendant_count_wasm(_0: number): number; - _ts_node_parent_wasm(_0: number): void; - _ts_node_child_with_descendant_wasm(_0: number): void; - _ts_node_descendant_for_index_wasm(_0: number): void; - _ts_node_named_descendant_for_index_wasm(_0: number): void; - _ts_node_descendant_for_position_wasm(_0: number): void; - _ts_node_named_descendant_for_position_wasm(_0: number): void; - _ts_node_start_point_wasm(_0: number): void; - _ts_node_end_point_wasm(_0: number): void; - _ts_node_start_index_wasm(_0: number): number; - _ts_node_end_index_wasm(_0: number): number; - _ts_node_to_string_wasm(_0: number): number; - _ts_node_children_wasm(_0: number): void; - _ts_node_named_children_wasm(_0: number): void; - _ts_node_descendants_of_type_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number): void; - _ts_node_is_named_wasm(_0: number): number; - _ts_node_has_changes_wasm(_0: number): number; - _ts_node_has_error_wasm(_0: number): number; - _ts_node_is_error_wasm(_0: number): number; - _ts_node_is_missing_wasm(_0: number): number; - _ts_node_is_extra_wasm(_0: number): number; - _ts_node_parse_state_wasm(_0: number): number; - _ts_node_next_parse_state_wasm(_0: number): number; - _ts_query_matches_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: number, _11: number, _12: number, _13: number, _14: number, _15: number): void; - _ts_query_captures_wasm(_0: number, _1: number, _2: number, _3: number, _4: number, _5: number, _6: number, _7: number, _8: number, _9: number, _10: number, _11: number, _12: number, _13: number, _14: number, _15: number): void; - _memset(_0: number, _1: number, _2: number): number; - _memcpy(_0: number, _1: number, _2: number): number; - _memmove(_0: number, _1: number, _2: number): number; - _iswalpha(_0: number): number; - _iswblank(_0: number): number; - _iswdigit(_0: number): number; - _iswlower(_0: number): number; - _iswupper(_0: number): number; - _iswxdigit(_0: number): number; - _memchr(_0: number, _1: number, _2: number): number; - _strlen(_0: number): number; - _strcmp(_0: number, _1: number): number; - _strncat(_0: number, _1: number, _2: number): number; - _strncpy(_0: number, _1: number, _2: number): number; - _towlower(_0: number): number; - _towupper(_0: number): number; -} - -export type MainModule = WasmModule & typeof RuntimeExports & { - currentParseCallback: ((index: number, position: {row: number, column: number}) => string | undefined) | null; - currentLogCallback: ((message: string, isLex: boolean) => void) | null; - currentProgressCallback: ((state: {currentOffset: number, hasError: boolean}) => void) | null; - currentQueryProgressCallback: ((state: {currentOffset: number}) => void) | null; -}; - -export default function MainModuleFactory(options?: Partial): Promise; diff --git a/lib/binding_web/package-lock.json b/lib/binding_web/package-lock.json deleted file mode 100644 index 4ec07f7b..00000000 --- a/lib/binding_web/package-lock.json +++ /dev/null @@ -1,4297 +0,0 @@ -{ - "name": "web-tree-sitter", - "version": "0.27.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "web-tree-sitter", - "version": "0.27.0", - "license": "MIT", - "devDependencies": { - "@eslint/js": "^9.39.1", - "@types/emscripten": "^1.41.5", - "@types/node": "^24.10.1", - "@vitest/coverage-v8": "^3.0.5", - "dts-buddy": "^0.6.2", - "esbuild": "^0.27.1", - "eslint": "^9.39.1", - "source-map": "^0.7.4", - "tsx": "^4.21.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.48.1", - "vitest": "^3.0.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", - "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", - "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", - "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", - "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", - "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", - "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", - "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", - "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", - "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", - "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", - "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", - "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", - "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", - "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", - "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", - "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", - "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", - "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", - "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", - "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", - "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", - "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", - "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", - "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", - "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", - "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", - "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", - "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", - "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", - "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", - "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", - "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", - "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", - "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", - "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", - "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", - "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", - "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", - "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", - "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", - "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", - "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", - "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", - "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", - "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", - "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/emscripten": { - "version": "1.41.5", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz", - "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.48.1.tgz", - "integrity": "sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/type-utils": "8.48.1", - "@typescript-eslint/utils": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.48.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.1.tgz", - "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.48.1.tgz", - "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.48.1", - "@typescript-eslint/types": "^8.48.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.48.1.tgz", - "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.48.1.tgz", - "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.48.1.tgz", - "integrity": "sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/utils": "8.48.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.48.1.tgz", - "integrity": "sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.48.1.tgz", - "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.48.1", - "@typescript-eslint/tsconfig-utils": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/visitor-keys": "8.48.1", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.48.1.tgz", - "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.48.1", - "@typescript-eslint/types": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.48.1.tgz", - "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.48.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", - "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^1.0.2", - "ast-v8-to-istanbul": "^0.3.3", - "debug": "^4.4.1", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "3.2.4", - "vitest": "3.2.4" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-v8-to-istanbul": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", - "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.30", - "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dts-buddy": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/dts-buddy/-/dts-buddy-0.6.2.tgz", - "integrity": "sha512-KUmYrRKpVpjmnqM/JY93p1PWezMXodKCiMd5CFvfLtRCRc5i2GZiojrkVQXO2Dd8HeaU1C3sgTKDWxCEK5cyXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/source-map": "^0.3.5", - "@jridgewell/sourcemap-codec": "^1.4.15", - "kleur": "^4.1.5", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "sade": "^1.8.1", - "tinyglobby": "^0.2.10", - "ts-api-utils": "^1.0.3" - }, - "bin": { - "dts-buddy": "src/cli.js" - }, - "peerDependencies": { - "typescript": ">=5.0.4 <5.9" - } - }, - "node_modules/dts-buddy/node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", - "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.1", - "@esbuild/android-arm": "0.27.1", - "@esbuild/android-arm64": "0.27.1", - "@esbuild/android-x64": "0.27.1", - "@esbuild/darwin-arm64": "0.27.1", - "@esbuild/darwin-x64": "0.27.1", - "@esbuild/freebsd-arm64": "0.27.1", - "@esbuild/freebsd-x64": "0.27.1", - "@esbuild/linux-arm": "0.27.1", - "@esbuild/linux-arm64": "0.27.1", - "@esbuild/linux-ia32": "0.27.1", - "@esbuild/linux-loong64": "0.27.1", - "@esbuild/linux-mips64el": "0.27.1", - "@esbuild/linux-ppc64": "0.27.1", - "@esbuild/linux-riscv64": "0.27.1", - "@esbuild/linux-s390x": "0.27.1", - "@esbuild/linux-x64": "0.27.1", - "@esbuild/netbsd-arm64": "0.27.1", - "@esbuild/netbsd-x64": "0.27.1", - "@esbuild/openbsd-arm64": "0.27.1", - "@esbuild/openbsd-x64": "0.27.1", - "@esbuild/openharmony-arm64": "0.27.1", - "@esbuild/sunos-x64": "0.27.1", - "@esbuild/win32-arm64": "0.27.1", - "@esbuild/win32-ia32": "0.27.1", - "@esbuild/win32-x64": "0.27.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/rollup": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", - "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.49.0", - "@rollup/rollup-android-arm64": "4.49.0", - "@rollup/rollup-darwin-arm64": "4.49.0", - "@rollup/rollup-darwin-x64": "4.49.0", - "@rollup/rollup-freebsd-arm64": "4.49.0", - "@rollup/rollup-freebsd-x64": "4.49.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", - "@rollup/rollup-linux-arm-musleabihf": "4.49.0", - "@rollup/rollup-linux-arm64-gnu": "4.49.0", - "@rollup/rollup-linux-arm64-musl": "4.49.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", - "@rollup/rollup-linux-ppc64-gnu": "4.49.0", - "@rollup/rollup-linux-riscv64-gnu": "4.49.0", - "@rollup/rollup-linux-riscv64-musl": "4.49.0", - "@rollup/rollup-linux-s390x-gnu": "4.49.0", - "@rollup/rollup-linux-x64-gnu": "4.49.0", - "@rollup/rollup-linux-x64-musl": "4.49.0", - "@rollup/rollup-win32-arm64-msvc": "4.49.0", - "@rollup/rollup-win32-ia32-msvc": "4.49.0", - "@rollup/rollup-win32-x64-msvc": "4.49.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.48.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.48.1.tgz", - "integrity": "sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.48.1", - "@typescript-eslint/parser": "8.48.1", - "@typescript-eslint/typescript-estree": "8.48.1", - "@typescript-eslint/utils": "8.48.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.6.tgz", - "integrity": "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 1bc53aad..06319dc7 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,100 +1,36 @@ { "name": "web-tree-sitter", - "version": "0.27.0", + "version": "0.23.0", "description": "Tree-sitter bindings for the web", - "repository": { - "type": "git", - "url": "git+https://github.com/tree-sitter/tree-sitter.git", - "directory": "lib/binding_web" - }, - "license": "MIT", - "author": { - "name": "Max Brunsfeld", - "email": "maxbrunsfeld@gmail.com" - }, - "maintainers": [ - { - "name": "Amaan Qureshi", - "email": "amaanq12@gmail.com" - } - ], - "type": "module", - "exports": { - ".": { - "import": { - "types": "./web-tree-sitter.d.ts", - "default": "./web-tree-sitter.js" - }, - "require": { - "types": "./web-tree-sitter.d.cts", - "default": "./web-tree-sitter.cjs" - } - }, - "./web-tree-sitter.wasm": "./web-tree-sitter.wasm", - "./debug": { - "import": { - "types": "./web-tree-sitter.d.ts", - "default": "./debug/web-tree-sitter.js" - }, - "require": { - "types": "./web-tree-sitter.d.cts", - "default": "./debug/web-tree-sitter.cjs" - } - }, - "./debug/web-tree-sitter.wasm": "./debug/web-tree-sitter.wasm" - }, - "types": "web-tree-sitter.d.ts", - "keywords": [ - "incremental", - "parsing", - "tree-sitter", - "wasm" - ], - "files": [ - "web-tree-sitter.cjs", - "web-tree-sitter.cjs.map", - "web-tree-sitter.js", - "web-tree-sitter.js.map", - "web-tree-sitter.wasm", - "web-tree-sitter.wasm.map", - "debug/web-tree-sitter.cjs", - "debug/web-tree-sitter.cjs.map", - "debug/web-tree-sitter.js", - "debug/web-tree-sitter.js.map", - "debug/web-tree-sitter.wasm", - "debug/web-tree-sitter.wasm.map", - "web-tree-sitter.d.ts", - "web-tree-sitter.d.ts.map", - "web-tree-sitter.d.cts", - "web-tree-sitter.d.cts.map" - ], - "devDependencies": { - "@eslint/js": "^9.39.1", - "@types/emscripten": "^1.41.5", - "@types/node": "^24.10.1", - "@vitest/coverage-v8": "^3.0.5", - "dts-buddy": "^0.6.2", - "esbuild": "^0.27.1", - "eslint": "^9.39.1", - "source-map": "^0.7.4", - "tsx": "^4.21.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.48.1", - "vitest": "^3.0.5" + "main": "tree-sitter.js", + "types": "tree-sitter-web.d.ts", + "directories": { + "test": "test" }, "scripts": { - "build:ts": "tsc -b . && node script/build.js", - "build:wasm": "cd ../../ && cargo xtask build-wasm", - "build:wasm:debug": "cd ../../ && cargo xtask build-wasm --debug", - "build": "npm run build:wasm && npm run build:ts", - "build:debug": "npm run build:wasm:debug && npm run build:ts -- --debug", - "build:dts": "node script/generate-dts.js", - "lint": "eslint src/*.ts script/*.ts test/*.ts", - "lint:fix": "eslint src/*.ts script/*.ts test/*.ts --fix", - "test": "vitest run", - "test:watch": "vitest", + "test": "mocha", "prepack": "cp ../../LICENSE .", - "postpack": "rm LICENSE", - "prepublishOnly": "tsx script/check-artifacts-fresh.ts" + "prepublishOnly": "node check-artifacts-fresh.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tree-sitter/tree-sitter.git" + }, + "keywords": [ + "incremental", + "parsing" + ], + "author": "Max Brunsfeld", + "license": "MIT", + "bugs": { + "url": "https://github.com/tree-sitter/tree-sitter/issues" + }, + "homepage": "https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web", + "devDependencies": { + "@types/emscripten": "^1.39.10", + "chai": "^4.3.7", + "eslint": ">=8.56.0", + "eslint-config-google": "^0.14.0", + "mocha": "^10.2.0" } } diff --git a/lib/binding_web/package.nix b/lib/binding_web/package.nix deleted file mode 100644 index 83f286b5..00000000 --- a/lib/binding_web/package.nix +++ /dev/null @@ -1,73 +0,0 @@ -{ - wasm-test-grammars, - lib, - buildNpmPackage, - rustPlatform, - cargo, - pkg-config, - emscripten, - src, - version, -}: -buildNpmPackage { - inherit src version; - - pname = "web-tree-sitter"; - - npmDepsHash = "sha256-y0GobcskcZTmju90TM64GjeWiBmPFCrTOg0yfccdB+Q="; - - nativeBuildInputs = [ - rustPlatform.cargoSetupHook - cargo - pkg-config - emscripten - ]; - - cargoDeps = rustPlatform.importCargoLock { - lockFile = ../../Cargo.lock; - }; - - doCheck = true; - - postPatch = '' - cp lib/binding_web/package{,-lock}.json . - ''; - - buildPhase = '' - pushd lib/binding_web - - CJS=true npm run build - CJS=true npm run build:debug - npm run build:debug - npm run build - - popd - - mkdir -p target/release - - for grammar in ${wasm-test-grammars}/*.wasm; do - if [ -f "$grammar" ]; then - cp "$grammar" target/release/ - fi - done - ''; - - checkPhase = '' - cd lib/binding_web && npm test - ''; - - meta = { - description = "web-tree-sitter - WebAssembly bindings to the Tree-sitter parsing library."; - longDescription = '' - web-tree-sitter provides WebAssembly bindings to the Tree-sitter parsing library. - It can build a concrete syntax tree for a source file and efficiently update - the syntax tree as the source file is edited. This package provides the WebAssembly bindings - and a JavaScript API for using them in web browsers - ''; - homepage = "https://tree-sitter.github.io/tree-sitter"; - changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}"; - license = lib.licenses.mit; - maintainers = with lib.maintainers; [ amaanq ]; - platforms = lib.platforms.all; - }; -} diff --git a/lib/binding_web/prefix.js b/lib/binding_web/prefix.js new file mode 100644 index 00000000..c6bc7c22 --- /dev/null +++ b/lib/binding_web/prefix.js @@ -0,0 +1,19 @@ +var TreeSitter = function() { + var initPromise; + var document = typeof window == 'object' + ? {currentScript: window.document.currentScript} + : null; + + class Parser { + constructor() { + this.initialize(); + } + + initialize() { + throw new Error("cannot construct a Parser before calling `init()`"); + } + + static init(moduleOptions) { + if (initPromise) return initPromise; + Module = Object.assign({}, Module, moduleOptions); + return initPromise = new Promise((resolveInitPromise) => { diff --git a/lib/binding_web/script/build.js b/lib/binding_web/script/build.js deleted file mode 100644 index 737267a1..00000000 --- a/lib/binding_web/script/build.js +++ /dev/null @@ -1,56 +0,0 @@ -import esbuild from 'esbuild'; -import fs from 'fs/promises'; - -const format = process.env.CJS ? 'cjs' : 'esm'; -const debug = process.argv.includes('--debug'); -const outfile = `${debug ? 'debug/' : ''}web-tree-sitter.${format === 'esm' ? 'js' : 'cjs'}`; - -async function processWasmSourceMap(inputPath, outputPath) { - const mapContent = await fs.readFile(inputPath, 'utf8'); - const sourceMap = JSON.parse(mapContent); - - const isTreeSitterSource = (source) => - source.includes('../../src/') || source === 'tree-sitter.c'; - - const normalizePath = (source) => { - if (source.includes('../../src/')) { - return source.replace('../../src/', debug ? '../lib/' : 'lib/'); - } else if (source === 'tree-sitter.c') { - return debug ? '../lib/tree-sitter.c' : 'lib/tree-sitter.c'; - } - return source; - }; - - const filtered = sourceMap.sources - .map((source, index) => ({ source, content: sourceMap.sourcesContent?.[index] })) - .filter(item => isTreeSitterSource(item.source)) - .map(item => ({ source: normalizePath(item.source), content: item.content })); - - sourceMap.sources = filtered.map(item => item.source); - sourceMap.sourcesContent = filtered.map(item => item.content); - - await fs.writeFile(outputPath, JSON.stringify(sourceMap, null, 2)); -} - -async function build() { - await esbuild.build({ - entryPoints: ['src/index.ts'], - bundle: true, - platform: 'node', - format, - outfile, - sourcemap: true, - sourcesContent: true, - keepNames: true, - external: ['fs/*', 'fs/promises'], - resolveExtensions: ['.ts', '.js', format === 'esm' ? '.mjs' : '.cjs'], - }); - - // Copy the Wasm files to the appropriate spot, as esbuild doesn't "bundle" Wasm files - const outputWasmName = `${debug ? 'debug/' : ''}web-tree-sitter.wasm`; - await fs.copyFile('lib/web-tree-sitter.wasm', outputWasmName); - - await processWasmSourceMap('lib/web-tree-sitter.wasm.map', `${outputWasmName}.map`); -} - -build().catch(console.error); diff --git a/lib/binding_web/script/check-artifacts-fresh.ts b/lib/binding_web/script/check-artifacts-fresh.ts deleted file mode 100755 index fc7d191e..00000000 --- a/lib/binding_web/script/check-artifacts-fresh.ts +++ /dev/null @@ -1,45 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'node:url'; - -const scriptDir = path.dirname(fileURLToPath(import.meta.url)); - -const inputFiles = [ - '../lib/tree-sitter.c', - '../src/constants.ts', - '../src/index.ts', - '../src/language.ts', - '../src/lookahead_iterator.ts', - '../src/marshal.ts', - '../src/node.ts', - '../src/parser.ts', - '../src/query.ts', - '../src/tree.ts', - '../src/tree_cursor.ts', - '../lib/exports.txt', - '../lib/imports.js', - '../lib/prefix.js', - ...listFiles('../../include/tree_sitter'), - ...listFiles('../../src'), -]; - -const outputFiles = ['../web-tree-sitter.js', '../web-tree-sitter.wasm']; -const outputMtime = Math.min(...outputFiles.map(getMtime)); - -for (const inputFile of inputFiles) { - if (getMtime(inputFile) > outputMtime) { - console.log(`File '${inputFile}' has changed. Re-run 'npm run build:wasm'.`); - process.exit(1); - } -} - -function listFiles(dir: string): string[] { - return fs - .readdirSync(path.resolve(scriptDir, dir)) - .filter(p => !p.startsWith('.')) - .map(p => path.join(dir, p)); -} - -function getMtime(p: string): number { - return fs.statSync(path.resolve(scriptDir, p)).mtime.getTime(); -} diff --git a/lib/binding_web/script/generate-dts.js b/lib/binding_web/script/generate-dts.js deleted file mode 100644 index 0be5999d..00000000 --- a/lib/binding_web/script/generate-dts.js +++ /dev/null @@ -1,14 +0,0 @@ -import { createBundle } from 'dts-buddy'; - -for (let ext of ['ts', 'cts']) { - await createBundle({ - project: 'tsconfig.json', - output: `web-tree-sitter.d.${ext}`, - modules: { - 'web-tree-sitter': 'src/index.ts' - }, - compilerOptions: { - stripInternal: true, - }, - }); -} diff --git a/lib/binding_web/src/bindings.ts b/lib/binding_web/src/bindings.ts deleted file mode 100644 index c7b10c93..00000000 --- a/lib/binding_web/src/bindings.ts +++ /dev/null @@ -1,23 +0,0 @@ -import createModule, { type MainModule } from '../lib/web-tree-sitter'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import { type Parser } from './parser'; - -export let Module: MainModule | null = null; - -/** - * @internal - * - * Initialize the Tree-sitter Wasm module. This should only be called by the {@link Parser} class via {@link Parser.init}. - */ -export async function initializeBinding(moduleOptions?: Partial): Promise { - return Module ??= await createModule(moduleOptions); -} - -/** - * @internal - * - * Checks if the Tree-sitter Wasm module has been initialized. - */ -export function checkModule(): boolean { - return !!Module; -} diff --git a/lib/binding_web/src/constants.ts b/lib/binding_web/src/constants.ts deleted file mode 100644 index 026e9f16..00000000 --- a/lib/binding_web/src/constants.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { type MainModule } from '../lib/web-tree-sitter'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import { ParseState, type Parser } from './parser'; - -/** - * A position in a multi-line text document, in terms of rows and columns. - * - * Rows and columns are zero-based. - */ -export interface Point { - /** The zero-based row number. */ - row: number; - - /** The zero-based column number. */ - column: number; -} - -/** - * A range of positions in a multi-line text document, both in terms of bytes - * and of rows and columns. - */ -export interface Range { - /** The start position of the range. */ - startPosition: Point; - - /** The end position of the range. */ - endPosition: Point; - - /** The start index of the range. */ - startIndex: number; - - /** The end index of the range. */ - endIndex: number; -} - -/** @internal */ -export const SIZE_OF_SHORT = 2; - -/** @internal */ -export const SIZE_OF_INT = 4; - -/** @internal */ -export const SIZE_OF_CURSOR = 4 * SIZE_OF_INT; - -/** @internal */ -export const SIZE_OF_NODE = 5 * SIZE_OF_INT; - -/** @internal */ -export const SIZE_OF_POINT = 2 * SIZE_OF_INT; - -/** @internal */ -export const SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT; - -/** @internal */ -export const ZERO_POINT: Point = { row: 0, column: 0 }; - -/** - * A callback for parsing that takes an index and point, and should return a string. - */ -export type ParseCallback = (index: number, position: Point) => string | undefined; - -/** - * A callback that receives the parse state during parsing. - */ -export type ProgressCallback = (progress: ParseState) => boolean; - -/** - * A callback for logging messages. - * - * If `isLex` is `true`, the message is from the lexer, otherwise it's from the parser. - */ -export type LogCallback = (message: string, isLex: boolean) => void; - -// Helper type for internal use -/** @internal */ -export const INTERNAL = Symbol('INTERNAL'); -/** @internal */ -export type Internal = typeof INTERNAL; - -// Helper functions for type checking -/** @internal */ -export function assertInternal(x: unknown): asserts x is Internal { - if (x !== INTERNAL) throw new Error('Illegal constructor'); -} - -/** @internal */ -export function isPoint(point?: Point): point is Point { - return ( - !!point && - typeof (point).row === 'number' && - typeof (point).column === 'number' - ); -} - -/** - * @internal - * - * Sets the Tree-sitter Wasm module. This should only be called by the {@link Parser} class via {@link Parser.init}. - */ -export function setModule(module: MainModule) { - C = module; -} - -/** - * @internal - * - * `C` is a convenient shorthand for the Tree-sitter Wasm module, - * which allows us to call all of the exported functions. - */ -export let C: MainModule; diff --git a/lib/binding_web/src/edit.ts b/lib/binding_web/src/edit.ts deleted file mode 100644 index ee3d2d46..00000000 --- a/lib/binding_web/src/edit.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Point, Range } from "./constants"; - -export class Edit { - /** The start position of the change. */ - startPosition: Point; - - /** The end position of the change before the edit. */ - oldEndPosition: Point; - - /** The end position of the change after the edit. */ - newEndPosition: Point; - - /** The start index of the change. */ - startIndex: number; - - /** The end index of the change before the edit. */ - oldEndIndex: number; - - /** The end index of the change after the edit. */ - newEndIndex: number; - - constructor({ - startIndex, - oldEndIndex, - newEndIndex, - startPosition, - oldEndPosition, - newEndPosition, - }: { - startIndex: number; - oldEndIndex: number; - newEndIndex: number; - startPosition: Point; - oldEndPosition: Point; - newEndPosition: Point; - }) { - this.startIndex = startIndex >>> 0; - this.oldEndIndex = oldEndIndex >>> 0; - this.newEndIndex = newEndIndex >>> 0; - this.startPosition = startPosition; - this.oldEndPosition = oldEndPosition; - this.newEndPosition = newEndPosition; - } - - /** - * Edit a point and index to keep it in-sync with source code that has been edited. - * - * This function updates a single point's byte offset and row/column position - * based on an edit operation. This is useful for editing points without - * requiring a tree or node instance. - */ - editPoint(point: Point, index: number): { point: Point; index: number } { - let newIndex = index; - const newPoint = { ...point }; - - if (index >= this.oldEndIndex) { - newIndex = this.newEndIndex + (index - this.oldEndIndex); - const originalRow = point.row; - newPoint.row = this.newEndPosition.row + (point.row - this.oldEndPosition.row); - newPoint.column = originalRow === this.oldEndPosition.row - ? this.newEndPosition.column + (point.column - this.oldEndPosition.column) - : point.column; - } else if (index > this.startIndex) { - newIndex = this.newEndIndex; - newPoint.row = this.newEndPosition.row; - newPoint.column = this.newEndPosition.column; - } - - return { point: newPoint, index: newIndex }; - } - - /** - * Edit a range to keep it in-sync with source code that has been edited. - * - * This function updates a range's start and end positions based on an edit - * operation. This is useful for editing ranges without requiring a tree - * or node instance. - */ - editRange(range: Range): Range { - const newRange: Range = { - startIndex: range.startIndex, - startPosition: { ...range.startPosition }, - endIndex: range.endIndex, - endPosition: { ...range.endPosition } - }; - - if (range.endIndex >= this.oldEndIndex) { - if (range.endIndex !== Number.MAX_SAFE_INTEGER) { - newRange.endIndex = this.newEndIndex + (range.endIndex - this.oldEndIndex); - newRange.endPosition = { - row: this.newEndPosition.row + (range.endPosition.row - this.oldEndPosition.row), - column: range.endPosition.row === this.oldEndPosition.row - ? this.newEndPosition.column + (range.endPosition.column - this.oldEndPosition.column) - : range.endPosition.column, - }; - if (newRange.endIndex < this.newEndIndex) { - newRange.endIndex = Number.MAX_SAFE_INTEGER; - newRange.endPosition = { row: Number.MAX_SAFE_INTEGER, column: Number.MAX_SAFE_INTEGER }; - } - } - } else if (range.endIndex > this.startIndex) { - newRange.endIndex = this.startIndex; - newRange.endPosition = { ...this.startPosition }; - } - - if (range.startIndex >= this.oldEndIndex) { - newRange.startIndex = this.newEndIndex + (range.startIndex - this.oldEndIndex); - newRange.startPosition = { - row: this.newEndPosition.row + (range.startPosition.row - this.oldEndPosition.row), - column: range.startPosition.row === this.oldEndPosition.row - ? this.newEndPosition.column + (range.startPosition.column - this.oldEndPosition.column) - : range.startPosition.column, - }; - if (newRange.startIndex < this.newEndIndex) { - newRange.startIndex = Number.MAX_SAFE_INTEGER; - newRange.startPosition = { row: Number.MAX_SAFE_INTEGER, column: Number.MAX_SAFE_INTEGER }; - } - } else if (range.startIndex > this.startIndex) { - newRange.startIndex = this.startIndex; - newRange.startPosition = { ...this.startPosition }; - } - - return newRange; - } -} diff --git a/lib/binding_web/src/finalization_registry.ts b/lib/binding_web/src/finalization_registry.ts deleted file mode 100644 index 5f9c45cc..00000000 --- a/lib/binding_web/src/finalization_registry.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function newFinalizer(handler: (value: T) => void): FinalizationRegistry | undefined { - try { - return new FinalizationRegistry(handler); - } catch(e) { - console.error('Unsupported FinalizationRegistry:', e); - return; - } -} diff --git a/lib/binding_web/src/index.ts b/lib/binding_web/src/index.ts deleted file mode 100644 index 5876db92..00000000 --- a/lib/binding_web/src/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -export type { - Point, - Range, - ParseCallback, - ProgressCallback, - LogCallback, -} from './constants'; -export { Edit } from './edit'; -export { - type ParseOptions, - type ParseState, - LANGUAGE_VERSION, - MIN_COMPATIBLE_VERSION, - Parser, -} from './parser'; -export { Language } from './language'; -export { Tree } from './tree'; -export { Node } from './node'; -export { TreeCursor } from './tree_cursor'; -export { - type QueryOptions, - type QueryState, - type QueryProperties, - type QueryPredicate, - type QueryCapture, - type QueryMatch, - CaptureQuantifier, - type PredicateStep, - Query, -} from './query'; -export { LookaheadIterator } from './lookahead_iterator'; diff --git a/lib/binding_web/src/language.ts b/lib/binding_web/src/language.ts deleted file mode 100644 index 664e355b..00000000 --- a/lib/binding_web/src/language.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { C, INTERNAL, Internal, assertInternal, SIZE_OF_INT, SIZE_OF_SHORT } from './constants'; -import { LookaheadIterator } from './lookahead_iterator'; -import { unmarshalLanguageMetadata } from './marshal'; -import { TRANSFER_BUFFER } from './parser'; - -const LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\w+$/; - -export interface LanguageMetadata { - readonly major_version: number; - readonly minor_version: number; - readonly patch_version: number; -} - -/** - * An opaque object that defines how to parse a particular language. - * The code for each `Language` is generated by the Tree-sitter CLI. - */ -export class Language { - /** @internal */ - private [0] = 0; // Internal handle for Wasm - - /** - * A list of all node types in the language. The index of each type in this - * array is its node type id. - */ - types: string[]; - - /** - * A list of all field names in the language. The index of each field name in - * this array is its field id. - */ - fields: (string | null)[]; - - /** @internal */ - constructor(internal: Internal, address: number) { - assertInternal(internal); - this[0] = address; - this.types = new Array(C._ts_language_symbol_count(this[0])); - for (let i = 0, n = this.types.length; i < n; i++) { - if (C._ts_language_symbol_type(this[0], i) < 2) { - this.types[i] = C.UTF8ToString(C._ts_language_symbol_name(this[0], i)); - } - } - this.fields = new Array(C._ts_language_field_count(this[0]) + 1); - for (let i = 0, n = this.fields.length; i < n; i++) { - const fieldName = C._ts_language_field_name_for_id(this[0], i); - if (fieldName !== 0) { - this.fields[i] = C.UTF8ToString(fieldName); - } else { - this.fields[i] = null; - } - } - } - - - /** - * Gets the name of the language. - */ - get name(): string | null { - const ptr = C._ts_language_name(this[0]); - if (ptr === 0) return null; - return C.UTF8ToString(ptr); - } - - /** - * Gets the ABI version of the language. - */ - get abiVersion(): number { - return C._ts_language_abi_version(this[0]); - } - - /** - * Get the metadata for this language. This information is generated by the - * CLI, and relies on the language author providing the correct metadata in - * the language's `tree-sitter.json` file. - */ - get metadata(): LanguageMetadata | null { - C._ts_language_metadata_wasm(this[0]); - const length = C.getValue(TRANSFER_BUFFER, 'i32'); - if (length === 0) return null; - return unmarshalLanguageMetadata(TRANSFER_BUFFER + SIZE_OF_INT); - } - - /** - * Gets the number of fields in the language. - */ - get fieldCount(): number { - return this.fields.length - 1; - } - - /** - * Gets the number of states in the language. - */ - get stateCount(): number { - return C._ts_language_state_count(this[0]); - } - - /** - * Get the field id for a field name. - */ - fieldIdForName(fieldName: string): number | null { - const result = this.fields.indexOf(fieldName); - return result !== -1 ? result : null; - } - - /** - * Get the field name for a field id. - */ - fieldNameForId(fieldId: number): string | null { - return this.fields[fieldId] ?? null; - } - - /** - * Get the node type id for a node type name. - */ - idForNodeType(type: string, named: boolean): number | null { - const typeLength = C.lengthBytesUTF8(type); - const typeAddress = C._malloc(typeLength + 1); - C.stringToUTF8(type, typeAddress, typeLength + 1); - const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named ? 1 : 0); - C._free(typeAddress); - return result || null; - } - - /** - * Gets the number of node types in the language. - */ - get nodeTypeCount(): number { - return C._ts_language_symbol_count(this[0]); - } - - /** - * Get the node type name for a node type id. - */ - nodeTypeForId(typeId: number): string | null { - const name = C._ts_language_symbol_name(this[0], typeId); - return name ? C.UTF8ToString(name) : null; - } - - /** - * Check if a node type is named. - * - * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/2-basic-parsing.html#named-vs-anonymous-nodes} - */ - nodeTypeIsNamed(typeId: number): boolean { - return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false; - } - - /** - * Check if a node type is visible. - */ - nodeTypeIsVisible(typeId: number): boolean { - return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false; - } - - /** - * Get the supertypes ids of this language. - * - * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.html?highlight=supertype#supertype-nodes} - */ - get supertypes(): number[] { - C._ts_language_supertypes_wasm(this[0]); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(count); - - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - result[i] = C.getValue(address, 'i16'); - address += SIZE_OF_SHORT; - } - } - - return result; - } - - /** - * Get the subtype ids for a given supertype node id. - */ - subtypes(supertype: number): number[] { - C._ts_language_subtypes_wasm(this[0], supertype); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(count); - - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - result[i] = C.getValue(address, 'i16'); - address += SIZE_OF_SHORT; - } - } - - return result; - } - - /** - * Get the next state id for a given state id and node type id. - */ - nextState(stateId: number, typeId: number): number { - return C._ts_language_next_state(this[0], stateId, typeId); - } - - /** - * Create a new lookahead iterator for this language and parse state. - * - * This returns `null` if state is invalid for this language. - * - * Iterating {@link LookaheadIterator} will yield valid symbols in the given - * parse state. Newly created lookahead iterators will return the `ERROR` - * symbol from {@link LookaheadIterator#currentType}. - * - * Lookahead iterators can be useful for generating suggestions and improving - * syntax error diagnostics. To get symbols valid in an `ERROR` node, use the - * lookahead iterator on its first leaf node state. For `MISSING` nodes, a - * lookahead iterator created on the previous non-extra leaf node may be - * appropriate. - */ - lookaheadIterator(stateId: number): LookaheadIterator | null { - const address = C._ts_lookahead_iterator_new(this[0], stateId); - if (address) return new LookaheadIterator(INTERNAL, address, this); - return null; - } - - /** - * Load a language from a WebAssembly module. - * The module can be provided as a path to a file or as a buffer. - */ - static async load(input: string | Uint8Array): Promise { - let binary: Uint8Array | WebAssembly.Module; - if (input instanceof Uint8Array) { - binary = input; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - } else if (globalThis.process?.versions.node) { - const fs: typeof import('fs/promises') = await import('fs/promises'); - binary = await fs.readFile(input); - } else { - const response = await fetch(input); - - if (!response.ok){ - const body = await response.text(); - throw new Error(`Language.load failed with status ${response.status}.\n\n${body}`); - } - - const retryResp = response.clone(); - try { - binary = await WebAssembly.compileStreaming(response); - } catch (reason) { - console.error('wasm streaming compile failed:', reason); - console.error('falling back to ArrayBuffer instantiation'); - // fallback, probably because of bad MIME type - binary = new Uint8Array(await retryResp.arrayBuffer()) - } - } - - const mod = await C.loadWebAssemblyModule(binary, { loadAsync: true }); - const symbolNames = Object.keys(mod); - const functionName = symbolNames.find((key) => LANGUAGE_FUNCTION_REGEX.test(key) && - !key.includes('external_scanner_')); - if (!functionName) { - console.log(`Couldn't find language function in Wasm file. Symbols:\n${JSON.stringify(symbolNames, null, 2)}`); - throw new Error('Language.load failed: no language function found in Wasm file'); - } - const languageAddress = mod[functionName](); - return new Language(INTERNAL, languageAddress); - } -} diff --git a/lib/binding_web/src/lookahead_iterator.ts b/lib/binding_web/src/lookahead_iterator.ts deleted file mode 100644 index 4dd6b296..00000000 --- a/lib/binding_web/src/lookahead_iterator.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { C, Internal, assertInternal } from './constants'; -import { Language } from './language'; -import { newFinalizer } from './finalization_registry'; - -const finalizer = newFinalizer((address: number) => { - C._ts_lookahead_iterator_delete(address); -}); - -export class LookaheadIterator implements Iterable { - /** @internal */ - private [0] = 0; // Internal handle for Wasm - - /** @internal */ - private language: Language; - - /** @internal */ - constructor(internal: Internal, address: number, language: Language) { - assertInternal(internal); - this[0] = address; - this.language = language; - finalizer?.register(this, address, this); - } - - /** Get the current symbol of the lookahead iterator. */ - get currentTypeId(): number { - return C._ts_lookahead_iterator_current_symbol(this[0]); - } - - /** Get the current symbol name of the lookahead iterator. */ - get currentType(): string { - return this.language.types[this.currentTypeId] || 'ERROR'; - } - - /** Delete the lookahead iterator, freeing its resources. */ - delete(): void { - finalizer?.unregister(this); - C._ts_lookahead_iterator_delete(this[0]); - this[0] = 0; - } - - - /** - * Reset the lookahead iterator. - * - * This returns `true` if the language was set successfully and `false` - * otherwise. - */ - reset(language: Language, stateId: number): boolean { - if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) { - this.language = language; - return true; - } - return false; - } - - /** - * Reset the lookahead iterator to another state. - * - * This returns `true` if the iterator was reset to the given state and - * `false` otherwise. - */ - resetState(stateId: number): boolean { - return Boolean(C._ts_lookahead_iterator_reset_state(this[0], stateId)); - } - - /** - * Returns an iterator that iterates over the symbols of the lookahead iterator. - * - * The iterator will yield the current symbol name as a string for each step - * until there are no more symbols to iterate over. - */ - [Symbol.iterator](): Iterator { - return { - next: (): IteratorResult => { - if (C._ts_lookahead_iterator_next(this[0])) { - return { done: false, value: this.currentType }; - } - return { done: true, value: '' }; - } - }; - } -} diff --git a/lib/binding_web/src/marshal.ts b/lib/binding_web/src/marshal.ts deleted file mode 100644 index f09f8e23..00000000 --- a/lib/binding_web/src/marshal.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { INTERNAL, Point, Range, SIZE_OF_INT, SIZE_OF_NODE, SIZE_OF_POINT, C } from "./constants"; -import { Node } from "./node"; -import { Tree } from "./tree"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import { Query, QueryCapture, type QueryMatch } from "./query"; -import { TreeCursor } from "./tree_cursor"; -import { TRANSFER_BUFFER } from "./parser"; -import { LanguageMetadata } from "./language"; -import { Edit } from "./edit"; - -/** - * @internal - * - * Unmarshals a {@link QueryMatch} to the transfer buffer. - */ -export function unmarshalCaptures( - query: Query, - tree: Tree, - address: number, - patternIndex: number, - result: QueryCapture[] -) { - for (let i = 0, n = result.length; i < n; i++) { - const captureIndex = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const node = unmarshalNode(tree, address)!; - address += SIZE_OF_NODE; - result[i] = {patternIndex, name: query.captureNames[captureIndex], node}; - } - return address; -} - -/** - * @internal - * - * Marshals a {@link Node} to the transfer buffer. - */ -export function marshalNode(node: Node, index = 0) { - let address = TRANSFER_BUFFER + index * SIZE_OF_NODE; - C.setValue(address, node.id, 'i32'); - address += SIZE_OF_INT; - C.setValue(address, node.startIndex, 'i32'); - address += SIZE_OF_INT; - C.setValue(address, node.startPosition.row, 'i32'); - address += SIZE_OF_INT; - C.setValue(address, node.startPosition.column, 'i32'); - address += SIZE_OF_INT; - C.setValue(address, node[0], 'i32'); -} - -/** - * @internal - * - * Unmarshals a {@link Node} from the transfer buffer. - */ -export function unmarshalNode(tree: Tree, address = TRANSFER_BUFFER): Node | null { - const id = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - if (id === 0) return null; - - const index = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const row = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const column = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const other = C.getValue(address, 'i32'); - - const result = new Node(INTERNAL, { - id, - tree, - startIndex: index, - startPosition: {row, column}, - other, - }); - - return result; -} - -/** - * @internal - * - * Marshals a {@link TreeCursor} to the transfer buffer. - */ -export function marshalTreeCursor(cursor: TreeCursor, address = TRANSFER_BUFFER) { - C.setValue(address + 0 * SIZE_OF_INT, cursor[0], 'i32'); - C.setValue(address + 1 * SIZE_OF_INT, cursor[1], 'i32'); - C.setValue(address + 2 * SIZE_OF_INT, cursor[2], 'i32'); - C.setValue(address + 3 * SIZE_OF_INT, cursor[3], 'i32'); -} - -/** - * @internal - * - * Unmarshals a {@link TreeCursor} from the transfer buffer. - */ -export function unmarshalTreeCursor(cursor: TreeCursor) { - cursor[0] = C.getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, 'i32'); - cursor[1] = C.getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, 'i32'); - cursor[2] = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32'); - cursor[3] = C.getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, 'i32'); -} - -/** - * @internal - * - * Marshals a {@link Point} to the transfer buffer. - */ -export function marshalPoint(address: number, point: Point): void { - C.setValue(address, point.row, 'i32'); - C.setValue(address + SIZE_OF_INT, point.column, 'i32'); -} - -/** - * @internal - * - * Unmarshals a {@link Point} from the transfer buffer. - */ -export function unmarshalPoint(address: number): Point { - const result = { - row: C.getValue(address, 'i32') >>> 0, - column: C.getValue(address + SIZE_OF_INT, 'i32') >>> 0, - }; - return result; -} - -/** - * @internal - * - * Marshals a {@link Range} to the transfer buffer. - */ -export function marshalRange(address: number, range: Range): void { - marshalPoint(address, range.startPosition); address += SIZE_OF_POINT; - marshalPoint(address, range.endPosition); address += SIZE_OF_POINT; - C.setValue(address, range.startIndex, 'i32'); address += SIZE_OF_INT; - C.setValue(address, range.endIndex, 'i32'); address += SIZE_OF_INT; -} - -/** - * @internal - * - * Unmarshals a {@link Range} from the transfer buffer. - */ -export function unmarshalRange(address: number): Range { - const result = {} as Range; - result.startPosition = unmarshalPoint(address); address += SIZE_OF_POINT; - result.endPosition = unmarshalPoint(address); address += SIZE_OF_POINT; - result.startIndex = C.getValue(address, 'i32') >>> 0; address += SIZE_OF_INT; - result.endIndex = C.getValue(address, 'i32') >>> 0; - return result; -} - -/** - * @internal - * - * Marshals an {@link Edit} to the transfer buffer. - */ -export function marshalEdit(edit: Edit, address = TRANSFER_BUFFER) { - marshalPoint(address, edit.startPosition); address += SIZE_OF_POINT; - marshalPoint(address, edit.oldEndPosition); address += SIZE_OF_POINT; - marshalPoint(address, edit.newEndPosition); address += SIZE_OF_POINT; - C.setValue(address, edit.startIndex, 'i32'); address += SIZE_OF_INT; - C.setValue(address, edit.oldEndIndex, 'i32'); address += SIZE_OF_INT; - C.setValue(address, edit.newEndIndex, 'i32'); address += SIZE_OF_INT; -} - -/** - * @internal - * - * Unmarshals a {@link LanguageMetadata} from the transfer buffer. - */ -export function unmarshalLanguageMetadata(address: number): LanguageMetadata { - const major_version = C.getValue(address, 'i32'); - const minor_version = C.getValue(address += SIZE_OF_INT, 'i32'); - const patch_version = C.getValue(address += SIZE_OF_INT, 'i32'); - return { major_version, minor_version, patch_version }; -} diff --git a/lib/binding_web/src/node.ts b/lib/binding_web/src/node.ts deleted file mode 100644 index 1026d680..00000000 --- a/lib/binding_web/src/node.ts +++ /dev/null @@ -1,647 +0,0 @@ -import { INTERNAL, Internal, assertInternal, SIZE_OF_INT, SIZE_OF_NODE, SIZE_OF_POINT, ZERO_POINT, isPoint, C, Point } from './constants'; -import { getText, Tree } from './tree'; -import { TreeCursor } from './tree_cursor'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import { Language } from './language'; -import { marshalNode, marshalPoint, unmarshalNode, unmarshalPoint } from './marshal'; -import { TRANSFER_BUFFER } from './parser'; -import { Edit } from './edit'; - -/** A single node within a syntax {@link Tree}. */ -export class Node { - /** @internal */ - // @ts-expect-error: never read - private [0] = 0; // Internal handle for Wasm - - /** @internal */ - private _children?: Node[]; - - /** @internal */ - private _namedChildren?: Node[]; - - /** @internal */ - constructor( - internal: Internal, - { - id, - tree, - startIndex, - startPosition, - other, - }: { - id: number; - tree: Tree; - startIndex: number; - startPosition: Point; - other: number; - } - ) { - assertInternal(internal); - this[0] = other; - this.id = id; - this.tree = tree; - this.startIndex = startIndex; - this.startPosition = startPosition; - } - - /** - * The numeric id for this node that is unique. - * - * Within a given syntax tree, no two nodes have the same id. However: - * - * * If a new tree is created based on an older tree, and a node from the old tree is reused in - * the process, then that node will have the same id in both trees. - * - * * A node not marked as having changes does not guarantee it was reused. - * - * * If a node is marked as having changed in the old tree, it will not be reused. - */ - id: number; - - /** The byte index where this node starts. */ - startIndex: number; - - /** The position where this node starts. */ - startPosition: Point; - - /** The tree that this node belongs to. */ - tree: Tree; - - /** Get this node's type as a numerical id. */ - get typeId(): number { - marshalNode(this); - return C._ts_node_symbol_wasm(this.tree[0]); - } - - /** - * Get the node's type as a numerical id as it appears in the grammar, - * ignoring aliases. - */ - get grammarId(): number { - marshalNode(this); - return C._ts_node_grammar_symbol_wasm(this.tree[0]); - } - - /** Get this node's type as a string. */ - get type(): string { - return this.tree.language.types[this.typeId] || 'ERROR'; - } - - /** - * Get this node's symbol name as it appears in the grammar, ignoring - * aliases as a string. - */ - get grammarType(): string { - return this.tree.language.types[this.grammarId] || 'ERROR'; - } - - /** - * Check if this node is *named*. - * - * Named nodes correspond to named rules in the grammar, whereas - * *anonymous* nodes correspond to string literals in the grammar. - */ - get isNamed(): boolean { - marshalNode(this); - return C._ts_node_is_named_wasm(this.tree[0]) === 1; - } - - /** - * Check if this node is *extra*. - * - * Extra nodes represent things like comments, which are not required - * by the grammar, but can appear anywhere. - */ - get isExtra(): boolean { - marshalNode(this); - return C._ts_node_is_extra_wasm(this.tree[0]) === 1; - } - - /** - * Check if this node represents a syntax error. - * - * Syntax errors represent parts of the code that could not be incorporated - * into a valid syntax tree. - */ - get isError(): boolean { - marshalNode(this); - return C._ts_node_is_error_wasm(this.tree[0]) === 1; - } - - /** - * Check if this node is *missing*. - * - * Missing nodes are inserted by the parser in order to recover from - * certain kinds of syntax errors. - */ - get isMissing(): boolean { - marshalNode(this); - return C._ts_node_is_missing_wasm(this.tree[0]) === 1; - } - - /** Check if this node has been edited. */ - get hasChanges(): boolean { - marshalNode(this); - return C._ts_node_has_changes_wasm(this.tree[0]) === 1; - } - - /** - * Check if this node represents a syntax error or contains any syntax - * errors anywhere within it. - */ - get hasError(): boolean { - marshalNode(this); - return C._ts_node_has_error_wasm(this.tree[0]) === 1; - } - - /** Get the byte index where this node ends. */ - get endIndex(): number { - marshalNode(this); - return C._ts_node_end_index_wasm(this.tree[0]); - } - - /** Get the position where this node ends. */ - get endPosition(): Point { - marshalNode(this); - C._ts_node_end_point_wasm(this.tree[0]); - return unmarshalPoint(TRANSFER_BUFFER); - } - - /** Get the string content of this node. */ - get text(): string { - return getText(this.tree, this.startIndex, this.endIndex, this.startPosition); - } - - /** Get this node's parse state. */ - get parseState(): number { - marshalNode(this); - return C._ts_node_parse_state_wasm(this.tree[0]); - } - - /** Get the parse state after this node. */ - get nextParseState(): number { - marshalNode(this); - return C._ts_node_next_parse_state_wasm(this.tree[0]); - } - - /** Check if this node is equal to another node. */ - equals(other: Node): boolean { - return this.tree === other.tree && this.id === other.id; - } - - /** - * Get the node's child at the given index, where zero represents the first child. - * - * This method is fairly fast, but its cost is technically log(n), so if - * you might be iterating over a long list of children, you should use - * {@link Node#children} instead. - */ - child(index: number): Node | null { - marshalNode(this); - C._ts_node_child_wasm(this.tree[0], index); - return unmarshalNode(this.tree); - } - - /** - * Get this node's *named* child at the given index. - * - * See also {@link Node#isNamed}. - * This method is fairly fast, but its cost is technically log(n), so if - * you might be iterating over a long list of children, you should use - * {@link Node#namedChildren} instead. - */ - namedChild(index: number): Node | null { - marshalNode(this); - C._ts_node_named_child_wasm(this.tree[0], index); - return unmarshalNode(this.tree); - } - - /** - * Get this node's child with the given numerical field id. - * - * See also {@link Node#childForFieldName}. You can - * convert a field name to an id using {@link Language#fieldIdForName}. - */ - childForFieldId(fieldId: number): Node | null { - marshalNode(this); - C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId); - return unmarshalNode(this.tree); - } - - /** - * Get the first child with the given field name. - * - * If multiple children may have the same field name, access them using - * {@link Node#childrenForFieldName}. - */ - childForFieldName(fieldName: string): Node | null { - const fieldId = this.tree.language.fields.indexOf(fieldName); - if (fieldId !== -1) return this.childForFieldId(fieldId); - return null; - } - - /** Get the field name of this node's child at the given index. */ - fieldNameForChild(index: number): string | null { - marshalNode(this); - const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index); - if (!address) return null; - return C.AsciiToString(address); - } - - /** Get the field name of this node's named child at the given index. */ - fieldNameForNamedChild(index: number): string | null { - marshalNode(this); - const address = C._ts_node_field_name_for_named_child_wasm(this.tree[0], index); - if (!address) return null; - return C.AsciiToString(address); - } - /** - * Get an array of this node's children with a given field name. - * - * See also {@link Node#children}. - */ - childrenForFieldName(fieldName: string): Node[] { - const fieldId = this.tree.language.fields.indexOf(fieldName); - if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId); - return []; - } - - /** - * Get an array of this node's children with a given field id. - * - * See also {@link Node#childrenForFieldName}. - */ - childrenForFieldId(fieldId: number): Node[] { - marshalNode(this); - C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(count); - - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - result[i] = unmarshalNode(this.tree, address)!; - address += SIZE_OF_NODE; - } - C._free(buffer); - } - return result; - } - - /** Get the node's first child that contains or starts after the given byte offset. */ - firstChildForIndex(index: number): Node | null { - marshalNode(this); - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - C.setValue(address, index, 'i32'); - C._ts_node_first_child_for_byte_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get the node's first named child that contains or starts after the given byte offset. */ - firstNamedChildForIndex(index: number): Node | null { - marshalNode(this); - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - C.setValue(address, index, 'i32'); - C._ts_node_first_named_child_for_byte_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get this node's number of children. */ - get childCount(): number { - marshalNode(this); - return C._ts_node_child_count_wasm(this.tree[0]); - } - - - /** - * Get this node's number of *named* children. - * - * See also {@link Node#isNamed}. - */ - get namedChildCount(): number { - marshalNode(this); - return C._ts_node_named_child_count_wasm(this.tree[0]); - } - - /** Get this node's first child. */ - get firstChild(): Node | null { - return this.child(0); - } - - /** - * Get this node's first named child. - * - * See also {@link Node#isNamed}. - */ - get firstNamedChild(): Node | null { - return this.namedChild(0); - } - - /** Get this node's last child. */ - get lastChild(): Node | null { - return this.child(this.childCount - 1); - } - - /** - * Get this node's last named child. - * - * See also {@link Node#isNamed}. - */ - get lastNamedChild(): Node | null { - return this.namedChild(this.namedChildCount - 1); - } - - /** - * Iterate over this node's children. - * - * If you're walking the tree recursively, you may want to use the - * {@link TreeCursor} APIs directly instead. - */ - get children(): Node[] { - if (!this._children) { - marshalNode(this); - C._ts_node_children_wasm(this.tree[0]); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - this._children = new Array(count); - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - this._children[i] = unmarshalNode(this.tree, address)!; - address += SIZE_OF_NODE; - } - C._free(buffer); - } - } - return this._children; - } - - /** - * Iterate over this node's named children. - * - * See also {@link Node#children}. - */ - get namedChildren(): Node[] { - if (!this._namedChildren) { - marshalNode(this); - C._ts_node_named_children_wasm(this.tree[0]); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - this._namedChildren = new Array(count); - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - this._namedChildren[i] = unmarshalNode(this.tree, address)!; - address += SIZE_OF_NODE; - } - C._free(buffer); - } - } - return this._namedChildren; - } - - /** - * Get the descendants of this node that are the given type, or in the given types array. - * - * The types array should contain node type strings, which can be retrieved from {@link Language#types}. - * - * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range. - */ - descendantsOfType( - types: string | string[], - startPosition: Point = ZERO_POINT, - endPosition: Point = ZERO_POINT - ): Node[] { - if (!Array.isArray(types)) types = [types]; - - // Convert the type strings to numeric type symbols - const symbols: number[] = []; - const typesBySymbol = this.tree.language.types; - for (const node_type of types) { - if (node_type == "ERROR") { - symbols.push(65535); // Internally, ts_builtin_sym_error is -1, which is UINT_16MAX - } - } - for (let i = 0, n = typesBySymbol.length; i < n; i++) { - if (types.includes(typesBySymbol[i])) { - symbols.push(i); - } - } - - // Copy the array of symbols to the Wasm heap - const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length); - for (let i = 0, n = symbols.length; i < n; i++) { - C.setValue(symbolsAddress + i * SIZE_OF_INT, symbols[i], 'i32'); - } - - // Call the C API to compute the descendants - marshalNode(this); - C._ts_node_descendants_of_type_wasm( - this.tree[0], - symbolsAddress, - symbols.length, - startPosition.row, - startPosition.column, - endPosition.row, - endPosition.column - ); - - // Instantiate the nodes based on the data returned - const descendantCount = C.getValue(TRANSFER_BUFFER, 'i32'); - const descendantAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(descendantCount); - if (descendantCount > 0) { - let address = descendantAddress; - for (let i = 0; i < descendantCount; i++) { - result[i] = unmarshalNode(this.tree, address)!; - address += SIZE_OF_NODE; - } - } - - // Free the intermediate buffers - C._free(descendantAddress); - C._free(symbolsAddress); - return result; - } - - /** Get this node's next sibling. */ - get nextSibling(): Node | null { - marshalNode(this); - C._ts_node_next_sibling_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get this node's previous sibling. */ - get previousSibling(): Node | null { - marshalNode(this); - C._ts_node_prev_sibling_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** - * Get this node's next *named* sibling. - * - * See also {@link Node#isNamed}. - */ - get nextNamedSibling(): Node | null { - marshalNode(this); - C._ts_node_next_named_sibling_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** - * Get this node's previous *named* sibling. - * - * See also {@link Node#isNamed}. - */ - get previousNamedSibling(): Node | null { - marshalNode(this); - C._ts_node_prev_named_sibling_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get the node's number of descendants, including one for the node itself. */ - get descendantCount(): number { - marshalNode(this); - return C._ts_node_descendant_count_wasm(this.tree[0]); - } - - /** - * Get this node's immediate parent. - * Prefer {@link Node#childWithDescendant} for iterating over this node's ancestors. - */ - get parent(): Node | null { - marshalNode(this); - C._ts_node_parent_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** - * Get the node that contains `descendant`. - * - * Note that this can return `descendant` itself. - */ - childWithDescendant(descendant: Node): Node | null { - marshalNode(this); - marshalNode(descendant, 1); - C._ts_node_child_with_descendant_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get the smallest node within this node that spans the given byte range. */ - descendantForIndex(start: number, end: number = start): Node | null { - if (typeof start !== 'number' || typeof end !== 'number') { - throw new Error('Arguments must be numbers'); - } - - marshalNode(this); - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - C.setValue(address, start, 'i32'); - C.setValue(address + SIZE_OF_INT, end, 'i32'); - C._ts_node_descendant_for_index_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get the smallest named node within this node that spans the given byte range. */ - namedDescendantForIndex(start: number, end: number = start): Node | null { - if (typeof start !== 'number' || typeof end !== 'number') { - throw new Error('Arguments must be numbers'); - } - - marshalNode(this); - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - C.setValue(address, start, 'i32'); - C.setValue(address + SIZE_OF_INT, end, 'i32'); - C._ts_node_named_descendant_for_index_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get the smallest node within this node that spans the given point range. */ - descendantForPosition(start: Point, end: Point = start) { - if (!isPoint(start) || !isPoint(end)) { - throw new Error('Arguments must be {row, column} objects'); - } - - marshalNode(this); - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - marshalPoint(address, start); - marshalPoint(address + SIZE_OF_POINT, end); - C._ts_node_descendant_for_position_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** Get the smallest named node within this node that spans the given point range. */ - namedDescendantForPosition(start: Point, end: Point = start) { - if (!isPoint(start) || !isPoint(end)) { - throw new Error('Arguments must be {row, column} objects'); - } - - marshalNode(this); - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - marshalPoint(address, start); - marshalPoint(address + SIZE_OF_POINT, end); - C._ts_node_named_descendant_for_position_wasm(this.tree[0]); - return unmarshalNode(this.tree); - } - - /** - * Create a new {@link TreeCursor} starting from this node. - * - * Note that the given node is considered the root of the cursor, - * and the cursor cannot walk outside this node. - */ - walk(): TreeCursor { - marshalNode(this); - C._ts_tree_cursor_new_wasm(this.tree[0]); - return new TreeCursor(INTERNAL, this.tree); - } - - /** - * Edit this node to keep it in-sync with source code that has been edited. - * - * This function is only rarely needed. When you edit a syntax tree with - * the {@link Tree#edit} method, all of the nodes that you retrieve from - * the tree afterward will already reflect the edit. You only need to - * use {@link Node#edit} when you have a specific {@link Node} instance that - * you want to keep and continue to use after an edit. - */ - edit(edit: Edit) { - if (this.startIndex >= edit.oldEndIndex) { - this.startIndex = edit.newEndIndex + (this.startIndex - edit.oldEndIndex); - let subbedPointRow; - let subbedPointColumn; - if (this.startPosition.row > edit.oldEndPosition.row) { - subbedPointRow = this.startPosition.row - edit.oldEndPosition.row; - subbedPointColumn = this.startPosition.column; - } else { - subbedPointRow = 0; - subbedPointColumn = this.startPosition.column; - if (this.startPosition.column >= edit.oldEndPosition.column) { - subbedPointColumn = - this.startPosition.column - edit.oldEndPosition.column; - } - } - - if (subbedPointRow > 0) { - this.startPosition.row += subbedPointRow; - this.startPosition.column = subbedPointColumn; - } else { - this.startPosition.column += subbedPointColumn; - } - } else if (this.startIndex > edit.startIndex) { - this.startIndex = edit.newEndIndex; - this.startPosition.row = edit.newEndPosition.row; - this.startPosition.column = edit.newEndPosition.column; - } - } - - /** Get the S-expression representation of this node. */ - toString(): string { - marshalNode(this); - const address = C._ts_node_to_string_wasm(this.tree[0]); - const result = C.AsciiToString(address); - C._free(address); - return result; - } -} diff --git a/lib/binding_web/src/parser.ts b/lib/binding_web/src/parser.ts deleted file mode 100644 index 7e3c3b4a..00000000 --- a/lib/binding_web/src/parser.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { C, INTERNAL, LogCallback, ParseCallback, Range, SIZE_OF_INT, SIZE_OF_RANGE, setModule } from './constants'; -import { Language } from './language'; -import { marshalRange, unmarshalRange } from './marshal'; -import { checkModule, initializeBinding } from './bindings'; -import { Tree } from './tree'; -import { newFinalizer } from './finalization_registry'; - -/** - * Options for parsing - * - * The `includedRanges` property is an array of {@link Range} objects that - * represent the ranges of text that the parser should include when parsing. - * - * The `progressCallback` property is a function that is called periodically - * during parsing to check whether parsing should be cancelled. - * - * See {@link Parser#parse} for more information. - */ -export interface ParseOptions { - /** - * An array of {@link Range} objects that - * represent the ranges of text that the parser should include when parsing. - * - * This sets the ranges of text that the parser should include when parsing. - * By default, the parser will always include entire documents. This - * function allows you to parse only a *portion* of a document but - * still return a syntax tree whose ranges match up with the document - * as a whole. You can also pass multiple disjoint ranges. - * If `ranges` is empty, then the entire document will be parsed. - * Otherwise, the given ranges must be ordered from earliest to latest - * in the document, and they must not overlap. That is, the following - * must hold for all `i` < `length - 1`: - * ```text - * ranges[i].end_byte <= ranges[i + 1].start_byte - * ``` - */ - includedRanges?: Range[]; - - /** - * A function that is called periodically during parsing to check - * whether parsing should be cancelled. If the progress callback returns - * `true`, then parsing will be cancelled. You can also use this to instrument - * parsing and check where the parser is at in the document. The progress callback - * takes a single argument, which is a {@link ParseState} representing the current - * state of the parser. - */ - progressCallback?: (state: ParseState) => void; -} - -/** - * A stateful object that is passed into the progress callback {@link ParseOptions#progressCallback} - * to provide the current state of the parser. - */ -export interface ParseState { - /** The byte offset in the document that the parser is at. */ - currentOffset: number; - - /** Indicates whether the parser has encountered an error during parsing. */ - hasError: boolean; -} - -/** - * @internal - * - * Global variable for transferring data across the FFI boundary - */ -export let TRANSFER_BUFFER: number; - -/** - * The latest ABI version that is supported by the current version of the - * library. - * - * When Languages are generated by the Tree-sitter CLI, they are - * assigned an ABI version number that corresponds to the current CLI version. - * The Tree-sitter library is generally backwards-compatible with languages - * generated using older CLI versions, but is not forwards-compatible. - */ -export let LANGUAGE_VERSION: number; - -/** - * The earliest ABI version that is supported by the current version of the - * library. - */ -export let MIN_COMPATIBLE_VERSION: number; - -const finalizer = newFinalizer((addresses: number[]) => { - C._ts_parser_delete(addresses[0]); - C._free(addresses[1]); -}); - -/** - * A stateful object that is used to produce a {@link Tree} based on some - * source code. - */ -export class Parser { - /** @internal */ - private [0] = 0; // Internal handle for Wasm - - /** @internal */ - private [1] = 0; // Internal handle for Wasm - - /** @internal */ - private logCallback: LogCallback | null = null; - - /** The parser's current language. */ - language: Language | null = null; - - /** - * This must always be called before creating a Parser. - * - * You can optionally pass in options to configure the Wasm module, the most common - * one being `locateFile` to help the module find the `.wasm` file. - */ - static async init(moduleOptions?: Partial) { - setModule(await initializeBinding(moduleOptions)); - TRANSFER_BUFFER = C._ts_init(); - LANGUAGE_VERSION = C.getValue(TRANSFER_BUFFER, 'i32'); - MIN_COMPATIBLE_VERSION = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - } - - /** - * Create a new parser. - */ - constructor() { - this.initialize(); - finalizer?.register(this, [this[0], this[1]], this); - } - - /** @internal */ - initialize() { - if (!checkModule()) { - throw new Error("cannot construct a Parser before calling `init()`"); - } - C._ts_parser_new_wasm(); - this[0] = C.getValue(TRANSFER_BUFFER, 'i32'); - this[1] = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - } - - /** Delete the parser, freeing its resources. */ - delete() { - finalizer?.unregister(this); - C._ts_parser_delete(this[0]); - C._free(this[1]); - this[0] = 0; - this[1] = 0; - } - - /** - * Set the language that the parser should use for parsing. - * - * If the language was not successfully assigned, an error will be thrown. - * This happens if the language was generated with an incompatible - * version of the Tree-sitter CLI. Check the language's version using - * {@link Language#version} and compare it to this library's - * {@link LANGUAGE_VERSION} and {@link MIN_COMPATIBLE_VERSION} constants. - */ - setLanguage(language: Language | null): this { - let address: number; - if (!language) { - address = 0; - this.language = null; - } else if (language.constructor === Language) { - address = language[0]; - const version = C._ts_language_abi_version(address); - if (version < MIN_COMPATIBLE_VERSION || LANGUAGE_VERSION < version) { - throw new Error( - `Incompatible language version ${version}. ` + - `Compatibility range ${MIN_COMPATIBLE_VERSION} through ${LANGUAGE_VERSION}.` - ); - } - this.language = language; - } else { - throw new Error('Argument must be a Language'); - } - - C._ts_parser_set_language(this[0], address); - return this; - } - - /** - * Parse a slice of UTF8 text. - * - * @param {string | ParseCallback} callback - The UTF8-encoded text to parse or a callback function. - * - * @param {Tree | null} [oldTree] - A previous syntax tree parsed from the same document. If the text of the - * document has changed since `oldTree` was created, then you must edit `oldTree` to match - * the new text using {@link Tree#edit}. - * - * @param {ParseOptions} [options] - Options for parsing the text. - * This can be used to set the included ranges, or a progress callback. - * - * @returns {Tree | null} A {@link Tree} if parsing succeeded, or `null` if: - * - The parser has not yet had a language assigned with {@link Parser#setLanguage}. - * - The progress callback returned true. - */ - parse( - callback: string | ParseCallback, - oldTree?: Tree | null, - options?: ParseOptions, - ): Tree | null { - if (typeof callback === 'string') { - C.currentParseCallback = (index: number) => callback.slice(index); - } else if (typeof callback === 'function') { - C.currentParseCallback = callback; - } else { - throw new Error('Argument must be a string or a function'); - } - - if (options?.progressCallback) { - C.currentProgressCallback = options.progressCallback; - } else { - C.currentProgressCallback = null; - } - - if (this.logCallback) { - C.currentLogCallback = this.logCallback; - C._ts_parser_enable_logger_wasm(this[0], 1); - } else { - C.currentLogCallback = null; - C._ts_parser_enable_logger_wasm(this[0], 0); - } - - let rangeCount = 0; - let rangeAddress = 0; - if (options?.includedRanges) { - rangeCount = options.includedRanges.length; - rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE); - let address = rangeAddress; - for (let i = 0; i < rangeCount; i++) { - marshalRange(address, options.includedRanges[i]); - address += SIZE_OF_RANGE; - } - } - - const treeAddress = C._ts_parser_parse_wasm( - this[0], - this[1], - oldTree ? oldTree[0] : 0, - rangeAddress, - rangeCount - ); - - if (!treeAddress) { - C.currentParseCallback = null; - C.currentLogCallback = null; - C.currentProgressCallback = null; - return null; - } - - if (!this.language) { - throw new Error('Parser must have a language to parse'); - } - - const result = new Tree(INTERNAL, treeAddress, this.language, C.currentParseCallback); - C.currentParseCallback = null; - C.currentLogCallback = null; - C.currentProgressCallback = null; - return result; - } - - /** - * Instruct the parser to start the next parse from the beginning. - * - * If the parser previously failed because of a callback, - * then by default, it will resume where it left off on the - * next call to {@link Parser#parse} or other parsing functions. - * If you don't want to resume, and instead intend to use this parser to - * parse some other document, you must call `reset` first. - */ - reset(): void { - C._ts_parser_reset(this[0]); - } - - /** Get the ranges of text that the parser will include when parsing. */ - getIncludedRanges(): Range[] { - C._ts_parser_included_ranges_wasm(this[0]); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(count); - - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - result[i] = unmarshalRange(address); - address += SIZE_OF_RANGE; - } - C._free(buffer); - } - - return result; - } - - /** Set the logging callback that a parser should use during parsing. */ - setLogger(callback: LogCallback | boolean | null): this { - if (!callback) { - this.logCallback = null; - } else if (typeof callback !== 'function') { - throw new Error('Logger callback must be a function'); - } else { - this.logCallback = callback; - } - return this; - } - - /** Get the parser's current logger. */ - getLogger(): LogCallback | null { - return this.logCallback; - } -} diff --git a/lib/binding_web/src/query.ts b/lib/binding_web/src/query.ts deleted file mode 100644 index e2994b14..00000000 --- a/lib/binding_web/src/query.ts +++ /dev/null @@ -1,1029 +0,0 @@ -import { Point, ZERO_POINT, SIZE_OF_INT, C } from './constants'; -import { Node } from './node'; -import { marshalNode, unmarshalCaptures } from './marshal'; -import { TRANSFER_BUFFER } from './parser'; -import { Language } from './language'; -import { newFinalizer } from './finalization_registry'; - -const PREDICATE_STEP_TYPE_CAPTURE = 1; - -const PREDICATE_STEP_TYPE_STRING = 2; - -const QUERY_WORD_REGEX = /[\w-]+/g; - -/** - * Options for query execution - */ -export interface QueryOptions { - /** The start position of the range to query */ - startPosition?: Point; - - /** The end position of the range to query */ - endPosition?: Point; - - /** The start position of the range to query Only the matches that are fully - * contained within provided range will be returned. - **/ - startContainingPosition?: Point; - - /** The end position of the range to query Only the matches that are fully - * contained within provided range will be returned. - **/ - endContainingPosition?: Point; - - /** The start index of the range to query */ - startIndex?: number; - - /** The end index of the range to query */ - endIndex?: number; - - /** The start index of the range to query Only the matches that are fully - * contained within provided range will be returned. - **/ - startContainingIndex?: number; - - /** The end index of the range to query Only the matches that are fully - * contained within provided range will be returned. - **/ - endContainingIndex?: number; - - /** - * The maximum number of in-progress matches for this query. - * The limit must be > 0 and <= 65536. - */ - matchLimit?: number; - - /** - * The maximum start depth for a query cursor. - * - * This prevents cursors from exploring children nodes at a certain depth. - * Note if a pattern includes many children, then they will still be - * checked. - * - * The zero max start depth value can be used as a special behavior and - * it helps to destructure a subtree by staying on a node and using - * captures for interested parts. Note that the zero max start depth - * only limit a search depth for a pattern's root node but other nodes - * that are parts of the pattern may be searched at any depth what - * defined by the pattern structure. - * - * Set to `null` to remove the maximum start depth. - */ - maxStartDepth?: number; - - /** - * A function that will be called periodically during the execution of the query to check - * if query execution should be cancelled. You can also use this to instrument query execution - * and check where the query is at in the document. The progress callback takes a single argument, - * which is a {@link QueryState} representing the current state of the query. - */ - progressCallback?: (state: QueryState) => void; -} - -/** - * A stateful object that is passed into the progress callback {@link QueryOptions#progressCallback} - * to provide the current state of the query. - */ -export interface QueryState { - /** The byte offset in the document that the query is at. */ - currentOffset: number; -} - -/** A record of key-value pairs associated with a particular pattern in a {@link Query}. */ -export type QueryProperties = Record; - -/** - * A predicate that contains an operator and list of operands. - */ -export interface QueryPredicate { - /** The operator of the predicate, like `match?`, `eq?`, `set!`, etc. */ - operator: string; - - /** The operands of the predicate, which are either captures or strings. */ - operands: PredicateStep[]; -} - -/** - * A particular {@link Node} that has been captured with a particular name within a - * {@link Query}. - */ -export interface QueryCapture { - /** The index of the pattern that matched. */ - patternIndex: number; - - /** The name of the capture */ - name: string; - - /** The captured node */ - node: Node; - - /** The properties for predicates declared with the operator `set!`. */ - setProperties?: QueryProperties; - - /** The properties for predicates declared with the operator `is?`. */ - assertedProperties?: QueryProperties; - - /** The properties for predicates declared with the operator `is-not?`. */ - refutedProperties?: QueryProperties; -} - -/** A match of a {@link Query} to a particular set of {@link Node}s. */ -export interface QueryMatch { - /** The index of the pattern that matched. */ - patternIndex: number; - - /** The captures associated with the match. */ - captures: QueryCapture[]; - - /** The properties for predicates declared with the operator `set!`. */ - setProperties?: QueryProperties; - - /** The properties for predicates declared with the operator `is?`. */ - assertedProperties?: QueryProperties; - - /** The properties for predicates declared with the operator `is-not?`. */ - refutedProperties?: QueryProperties; -} - -/** A quantifier for captures */ -export const CaptureQuantifier = { - Zero: 0, - ZeroOrOne: 1, - ZeroOrMore: 2, - One: 3, - OneOrMore: 4 -} as const; - -/** A quantifier for captures */ -export type CaptureQuantifier = typeof CaptureQuantifier[keyof typeof CaptureQuantifier]; - -/** - * Predicates are represented as a single array of steps. There are two - * types of steps, which correspond to the two legal values for - * the `type` field: - * - * - `CapturePredicateStep` - Steps with this type represent names - * of captures. - * - * - `StringPredicateStep` - Steps with this type represent literal - * strings. - */ -export type PredicateStep = CapturePredicateStep | StringPredicateStep; - -/** - * A step in a predicate that refers to a capture. - * - * The `name` field is the name of the capture. - */ -export interface CapturePredicateStep { type: 'capture', name: string } - -/** - * A step in a predicate that refers to a string. - * - * The `value` field is the string value. - */ -export interface StringPredicateStep { type: 'string', value: string } - -const isCaptureStep = (step: PredicateStep): step is Extract => - step.type === 'capture'; - -const isStringStep = (step: PredicateStep): step is Extract => - step.type === 'string'; - -/** - * @internal - * - * A function that checks if a given set of captures matches a particular - * condition. This is used in the built-in `eq?`, `match?`, and `any-of?` - * predicates. - */ -export type TextPredicate = (captures: QueryCapture[]) => boolean; - -/** Error codes returned from tree-sitter query parsing */ -export const QueryErrorKind = { - Syntax: 1, - NodeName: 2, - FieldName: 3, - CaptureName: 4, - PatternStructure: 5, -} as const; - -/** An error that occurred while parsing a query string. */ -export type QueryErrorKind = typeof QueryErrorKind[keyof typeof QueryErrorKind]; - -/** Information about a {@link QueryError}. */ -export interface QueryErrorInfo { - [QueryErrorKind.NodeName]: { word: string }; - [QueryErrorKind.FieldName]: { word: string }; - [QueryErrorKind.CaptureName]: { word: string }; - [QueryErrorKind.PatternStructure]: { suffix: string }; - [QueryErrorKind.Syntax]: { suffix: string }; -} - -/** Error thrown when parsing a tree-sitter query fails */ -export class QueryError extends Error { - constructor( - public kind: QueryErrorKind, - public info: QueryErrorInfo[typeof kind], - public index: number, - public length: number - ) { - super(QueryError.formatMessage(kind, info)); - this.name = 'QueryError'; - } - - /** Formats an error message based on the error kind and info */ - private static formatMessage(kind: QueryErrorKind, info: QueryErrorInfo[QueryErrorKind]): string { - switch (kind) { - case QueryErrorKind.NodeName: - return `Bad node name '${(info as QueryErrorInfo[2]).word}'`; - case QueryErrorKind.FieldName: - return `Bad field name '${(info as QueryErrorInfo[3]).word}'`; - case QueryErrorKind.CaptureName: - return `Bad capture name @${(info as QueryErrorInfo[4]).word}`; - case QueryErrorKind.PatternStructure: - return `Bad pattern structure at offset ${(info as QueryErrorInfo[5]).suffix}`; - case QueryErrorKind.Syntax: - return `Bad syntax at offset ${(info as QueryErrorInfo[1]).suffix}`; - } - } -} - -/** - * Parses the `eq?` and `not-eq?` predicates in a query, and updates the text predicates. - */ -function parseAnyPredicate( - steps: PredicateStep[], - index: number, - operator: string, - textPredicates: TextPredicate[][], -) { - if (steps.length !== 3) { - throw new Error( - `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}` - ); - } - - if (!isCaptureStep(steps[1])) { - throw new Error( - `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}"` - ); - } - - const isPositive = operator === 'eq?' || operator === 'any-eq?'; - const matchAll = !operator.startsWith('any-'); - - if (isCaptureStep(steps[2])) { - const captureName1 = steps[1].name; - const captureName2 = steps[2].name; - textPredicates[index].push((captures) => { - const nodes1: Node[] = []; - const nodes2: Node[] = []; - for (const c of captures) { - if (c.name === captureName1) nodes1.push(c.node); - if (c.name === captureName2) nodes2.push(c.node); - } - const compare = (n1: { text: string }, n2: { text: string }, positive: boolean) => { - return positive ? n1.text === n2.text : n1.text !== n2.text; - }; - return matchAll - ? nodes1.every((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))) - : nodes1.some((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))); - }); - } else { - const captureName = steps[1].name; - const stringValue = steps[2].value; - const matches = (n: Node) => n.text === stringValue; - const doesNotMatch = (n: Node) => n.text !== stringValue; - textPredicates[index].push((captures) => { - const nodes = []; - for (const c of captures) { - if (c.name === captureName) nodes.push(c.node); - } - const test = isPositive ? matches : doesNotMatch; - return matchAll ? nodes.every(test) : nodes.some(test); - }); - } -} - -/** - * Parses the `match?` and `not-match?` predicates in a query, and updates the text predicates. - */ -function parseMatchPredicate( - steps: PredicateStep[], - index: number, - operator: string, - textPredicates: TextPredicate[][], -) { - if (steps.length !== 3) { - throw new Error( - `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}.`, - ); - } - - if (steps[1].type !== 'capture') { - throw new Error( - `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".`, - ); - } - - if (steps[2].type !== 'string') { - throw new Error( - `Second argument of \`#${operator}\` predicate must be a string. Got @${steps[2].name}.`, - ); - } - - const isPositive = operator === 'match?' || operator === 'any-match?'; - const matchAll = !operator.startsWith('any-'); - const captureName = steps[1].name; - const regex = new RegExp(steps[2].value); - textPredicates[index].push((captures) => { - const nodes = []; - for (const c of captures) { - if (c.name === captureName) nodes.push(c.node.text); - } - const test = (text: string, positive: boolean) => { - return positive ? - regex.test(text) : - !regex.test(text); - }; - if (nodes.length === 0) return !isPositive; - return matchAll ? - nodes.every((text) => test(text, isPositive)) : - nodes.some((text) => test(text, isPositive)); - }); -} - -/** - * Parses the `any-of?` and `not-any-of?` predicates in a query, and updates the text predicates. - */ -function parseAnyOfPredicate( - steps: PredicateStep[], - index: number, - operator: string, - textPredicates: TextPredicate[][], -) { - if (steps.length < 2) { - throw new Error( - `Wrong number of arguments to \`#${operator}\` predicate. Expected at least 1. Got ${steps.length - 1}.`, - ); - } - - if (steps[1].type !== 'capture') { - throw new Error( - `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".`, - ); - } - - const isPositive = operator === 'any-of?'; - const captureName = steps[1].name; - - const stringSteps = steps.slice(2); - if (!stringSteps.every(isStringStep)) { - throw new Error( - `Arguments to \`#${operator}\` predicate must be strings.".`, - ); - } - const values = stringSteps.map((s) => s.value); - - textPredicates[index].push((captures) => { - const nodes = []; - for (const c of captures) { - if (c.name === captureName) nodes.push(c.node.text); - } - if (nodes.length === 0) return !isPositive; - return nodes.every((text) => values.includes(text)) === isPositive; - }); -} - -/** - * Parses the `is?` and `is-not?` predicates in a query, and updates the asserted or refuted properties, - * depending on if the operator is positive or negative. - */ -function parseIsPredicate( - steps: PredicateStep[], - index: number, - operator: string, - assertedProperties: QueryProperties[], - refutedProperties: QueryProperties[], -) { - if (steps.length < 2 || steps.length > 3) { - throw new Error( - `Wrong number of arguments to \`#${operator}\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`, - ); - } - - if (!steps.every(isStringStep)) { - throw new Error( - `Arguments to \`#${operator}\` predicate must be strings.".`, - ); - } - - const properties = operator === 'is?' ? assertedProperties : refutedProperties; - if (!properties[index]) properties[index] = {}; - properties[index][steps[1].value] = steps[2]?.value ?? null; -} - -/** - * Parses the `set!` directive in a query, and updates the set properties. - */ -function parseSetDirective( - steps: PredicateStep[], - index: number, - setProperties: QueryProperties[], -) { - if (steps.length < 2 || steps.length > 3) { - throw new Error(`Wrong number of arguments to \`#set!\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`); - } - if (!steps.every(isStringStep)) { - throw new Error(`Arguments to \`#set!\` predicate must be strings.".`); - } - if (!setProperties[index]) setProperties[index] = {}; - setProperties[index][steps[1].value] = steps[2]?.value ?? null; -} - -/** - * Parses the predicate at a given step in a pattern, and updates the appropriate - * predicates or properties. - */ -function parsePattern( - index: number, - stepType: number, - stepValueId: number, - captureNames: string[], - stringValues: string[], - steps: PredicateStep[], - textPredicates: TextPredicate[][], - predicates: QueryPredicate[][], - setProperties: QueryProperties[], - assertedProperties: QueryProperties[], - refutedProperties: QueryProperties[], -) { - if (stepType === PREDICATE_STEP_TYPE_CAPTURE) { - const name = captureNames[stepValueId]; - steps.push({ type: 'capture', name }); - } else if (stepType === PREDICATE_STEP_TYPE_STRING) { - steps.push({ type: 'string', value: stringValues[stepValueId] }); - } else if (steps.length > 0) { - if (steps[0].type !== 'string') { - throw new Error('Predicates must begin with a literal value'); - } - - const operator = steps[0].value; - switch (operator) { - case 'any-not-eq?': - case 'not-eq?': - case 'any-eq?': - case 'eq?': - parseAnyPredicate(steps, index, operator, textPredicates); - break; - - case 'any-not-match?': - case 'not-match?': - case 'any-match?': - case 'match?': - parseMatchPredicate(steps, index, operator, textPredicates); - break; - - case 'not-any-of?': - case 'any-of?': - parseAnyOfPredicate(steps, index, operator, textPredicates); - break; - - case 'is?': - case 'is-not?': - parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties); - break; - - case 'set!': - parseSetDirective(steps, index, setProperties); - break; - - default: - predicates[index].push({ operator, operands: steps.slice(1) }); - } - - steps.length = 0; - } -} - -const finalizer = newFinalizer((address: number) => { - C._ts_query_delete(address); -}); - -export class Query { - /** @internal */ - private [0] = 0; // Internal handle for Wasm - - /** @internal */ - private exceededMatchLimit: boolean; - - /** @internal */ - private textPredicates: TextPredicate[][]; - - /** The names of the captures used in the query. */ - readonly captureNames: string[]; - - /** The quantifiers of the captures used in the query. */ - readonly captureQuantifiers: CaptureQuantifier[][]; - - /** - * The other user-defined predicates associated with the given index. - * - * This includes predicates with operators other than: - * - `match?` - * - `eq?` and `not-eq?` - * - `any-of?` and `not-any-of?` - * - `is?` and `is-not?` - * - `set!` - */ - readonly predicates: QueryPredicate[][]; - - /** The properties for predicates with the operator `set!`. */ - readonly setProperties: QueryProperties[]; - - /** The properties for predicates with the operator `is?`. */ - readonly assertedProperties: QueryProperties[]; - - /** The properties for predicates with the operator `is-not?`. */ - readonly refutedProperties: QueryProperties[]; - - /** The maximum number of in-progress matches for this cursor. */ - matchLimit?: number; - - /** - * Create a new query from a string containing one or more S-expression - * patterns. - * - * The query is associated with a particular language, and can only be run - * on syntax nodes parsed with that language. References to Queries can be - * shared between multiple threads. - * - * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries} - */ - constructor(language: Language, source: string) { - const sourceLength = C.lengthBytesUTF8(source); - const sourceAddress = C._malloc(sourceLength + 1); - C.stringToUTF8(source, sourceAddress, sourceLength + 1); - const address = C._ts_query_new( - language[0], - sourceAddress, - sourceLength, - TRANSFER_BUFFER, - TRANSFER_BUFFER + SIZE_OF_INT - ); - - if (!address) { - const errorId = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32') as QueryErrorKind; - const errorByte = C.getValue(TRANSFER_BUFFER, 'i32'); - const errorIndex = C.UTF8ToString(sourceAddress, errorByte).length; - const suffix = source.slice(errorIndex, errorIndex + 100).split('\n')[0]; - const word = suffix.match(QUERY_WORD_REGEX)?.[0] ?? ''; - C._free(sourceAddress); - - switch (errorId) { - case QueryErrorKind.Syntax: - throw new QueryError(QueryErrorKind.Syntax, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0); - case QueryErrorKind.NodeName: - throw new QueryError(errorId, { word }, errorIndex, word.length); - case QueryErrorKind.FieldName: - throw new QueryError(errorId, { word }, errorIndex, word.length); - case QueryErrorKind.CaptureName: - throw new QueryError(errorId, { word }, errorIndex, word.length); - case QueryErrorKind.PatternStructure: - throw new QueryError(errorId, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0); - } - } - - const stringCount = C._ts_query_string_count(address); - const captureCount = C._ts_query_capture_count(address); - const patternCount = C._ts_query_pattern_count(address); - const captureNames = new Array(captureCount); - const captureQuantifiers = new Array(patternCount); - const stringValues = new Array(stringCount); - - // Fill in the capture names - for (let i = 0; i < captureCount; i++) { - const nameAddress = C._ts_query_capture_name_for_id( - address, - i, - TRANSFER_BUFFER - ); - const nameLength = C.getValue(TRANSFER_BUFFER, 'i32'); - captureNames[i] = C.UTF8ToString(nameAddress, nameLength); - } - - // Fill in the capture quantifiers - for (let i = 0; i < patternCount; i++) { - const captureQuantifiersArray = new Array(captureCount); - for (let j = 0; j < captureCount; j++) { - const quantifier = C._ts_query_capture_quantifier_for_id(address, i, j); - captureQuantifiersArray[j] = quantifier as CaptureQuantifier; - } - captureQuantifiers[i] = captureQuantifiersArray; - } - - // Fill in the string values - for (let i = 0; i < stringCount; i++) { - const valueAddress = C._ts_query_string_value_for_id( - address, - i, - TRANSFER_BUFFER - ); - const nameLength = C.getValue(TRANSFER_BUFFER, 'i32'); - stringValues[i] = C.UTF8ToString(valueAddress, nameLength); - } - - const setProperties = new Array(patternCount); - const assertedProperties = new Array(patternCount); - const refutedProperties = new Array(patternCount); - const predicates = new Array(patternCount); - const textPredicates = new Array(patternCount); - - // Parse the predicates, and add the appropriate predicates or properties - for (let i = 0; i < patternCount; i++) { - const predicatesAddress = C._ts_query_predicates_for_pattern(address, i, TRANSFER_BUFFER); - const stepCount = C.getValue(TRANSFER_BUFFER, 'i32'); - - predicates[i] = []; - textPredicates[i] = []; - - const steps = new Array(); - - let stepAddress = predicatesAddress; - for (let j = 0; j < stepCount; j++) { - const stepType = C.getValue(stepAddress, 'i32'); - stepAddress += SIZE_OF_INT; - - const stepValueId = C.getValue(stepAddress, 'i32'); - stepAddress += SIZE_OF_INT; - - parsePattern( - i, - stepType, - stepValueId, - captureNames, - stringValues, - steps, - textPredicates, - predicates, - setProperties, - assertedProperties, - refutedProperties, - ); - } - - Object.freeze(textPredicates[i]); - Object.freeze(predicates[i]); - Object.freeze(setProperties[i]); - Object.freeze(assertedProperties[i]); - Object.freeze(refutedProperties[i]); - } - - C._free(sourceAddress); - - - this[0] = address; - this.captureNames = captureNames; - this.captureQuantifiers = captureQuantifiers; - this.textPredicates = textPredicates; - this.predicates = predicates; - this.setProperties = setProperties; - this.assertedProperties = assertedProperties; - this.refutedProperties = refutedProperties; - this.exceededMatchLimit = false; - finalizer?.register(this, address, this); - } - - /** Delete the query, freeing its resources. */ - delete(): void { - finalizer?.unregister(this); - C._ts_query_delete(this[0]); - this[0] = 0; - } - - /** - * Iterate over all of the matches in the order that they were found. - * - * Each match contains the index of the pattern that matched, and a list of - * captures. Because multiple patterns can match the same set of nodes, - * one match may contain captures that appear *before* some of the - * captures from a previous match. - * - * @param {Node} node - The node to execute the query on. - * - * @param {QueryOptions} options - Options for query execution. - */ - matches( - node: Node, - options: QueryOptions = {} - ): QueryMatch[] { - const startPosition = options.startPosition ?? ZERO_POINT; - const endPosition = options.endPosition ?? ZERO_POINT; - const startIndex = options.startIndex ?? 0; - const endIndex = options.endIndex ?? 0; - const startContainingPosition = options.startContainingPosition ?? ZERO_POINT; - const endContainingPosition = options.endContainingPosition ?? ZERO_POINT; - const startContainingIndex = options.startContainingIndex ?? 0; - const endContainingIndex = options.endContainingIndex ?? 0; - const matchLimit = options.matchLimit ?? 0xFFFFFFFF; - const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF; - const progressCallback = options.progressCallback; - - if (typeof matchLimit !== 'number') { - throw new Error('Arguments must be numbers'); - } - this.matchLimit = matchLimit; - - if (endIndex !== 0 && startIndex > endIndex) { - throw new Error('`startIndex` cannot be greater than `endIndex`'); - } - - if (endPosition !== ZERO_POINT && ( - startPosition.row > endPosition.row || - (startPosition.row === endPosition.row && startPosition.column > endPosition.column) - )) { - throw new Error('`startPosition` cannot be greater than `endPosition`'); - } - - if (endContainingIndex !== 0 && startContainingIndex > endContainingIndex) { - throw new Error('`startContainingIndex` cannot be greater than `endContainingIndex`'); - } - - if (endContainingPosition !== ZERO_POINT && ( - startContainingPosition.row > endContainingPosition.row || - (startContainingPosition.row === endContainingPosition.row && - startContainingPosition.column > endContainingPosition.column) - )) { - throw new Error('`startContainingPosition` cannot be greater than `endContainingPosition`'); - } - - if (progressCallback) { - C.currentQueryProgressCallback = progressCallback; - } - - marshalNode(node); - - C._ts_query_matches_wasm( - this[0], - node.tree[0], - startPosition.row, - startPosition.column, - endPosition.row, - endPosition.column, - startIndex, - endIndex, - startContainingPosition.row, - startContainingPosition.column, - endContainingPosition.row, - endContainingPosition.column, - startContainingIndex, - endContainingIndex, - matchLimit, - maxStartDepth, - ); - - const rawCount = C.getValue(TRANSFER_BUFFER, 'i32'); - const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32'); - const result = new Array(rawCount); - this.exceededMatchLimit = Boolean(didExceedMatchLimit); - - let filteredCount = 0; - let address = startAddress; - for (let i = 0; i < rawCount; i++) { - const patternIndex = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const captureCount = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - - const captures = new Array(captureCount); - address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); - - if (this.textPredicates[patternIndex].every((p) => p(captures))) { - result[filteredCount] = { patternIndex, captures }; - const setProperties = this.setProperties[patternIndex]; - result[filteredCount].setProperties = setProperties; - const assertedProperties = this.assertedProperties[patternIndex]; - result[filteredCount].assertedProperties = assertedProperties; - const refutedProperties = this.refutedProperties[patternIndex]; - result[filteredCount].refutedProperties = refutedProperties; - filteredCount++; - } - } - result.length = filteredCount; - - C._free(startAddress); - C.currentQueryProgressCallback = null; - return result; - } - - /** - * Iterate over all of the individual captures in the order that they - * appear. - * - * This is useful if you don't care about which pattern matched, and just - * want a single, ordered sequence of captures. - * - * @param {Node} node - The node to execute the query on. - * - * @param {QueryOptions} options - Options for query execution. - */ - captures( - node: Node, - options: QueryOptions = {} - ): QueryCapture[] { - const startPosition = options.startPosition ?? ZERO_POINT; - const endPosition = options.endPosition ?? ZERO_POINT; - const startIndex = options.startIndex ?? 0; - const endIndex = options.endIndex ?? 0; - const startContainingPosition = options.startContainingPosition ?? ZERO_POINT; - const endContainingPosition = options.endContainingPosition ?? ZERO_POINT; - const startContainingIndex = options.startContainingIndex ?? 0; - const endContainingIndex = options.endContainingIndex ?? 0; - const matchLimit = options.matchLimit ?? 0xFFFFFFFF; - const maxStartDepth = options.maxStartDepth ?? 0xFFFFFFFF; - const progressCallback = options.progressCallback; - - if (typeof matchLimit !== 'number') { - throw new Error('Arguments must be numbers'); - } - this.matchLimit = matchLimit; - - if (endIndex !== 0 && startIndex > endIndex) { - throw new Error('`startIndex` cannot be greater than `endIndex`'); - } - - if (endPosition !== ZERO_POINT && ( - startPosition.row > endPosition.row || - (startPosition.row === endPosition.row && startPosition.column > endPosition.column) - )) { - throw new Error('`startPosition` cannot be greater than `endPosition`'); - } - - if (endContainingIndex !== 0 && startContainingIndex > endContainingIndex) { - throw new Error('`startContainingIndex` cannot be greater than `endContainingIndex`'); - } - - if (endContainingPosition !== ZERO_POINT && ( - startContainingPosition.row > endContainingPosition.row || - (startContainingPosition.row === endContainingPosition.row && - startContainingPosition.column > endContainingPosition.column) - )) { - throw new Error('`startContainingPosition` cannot be greater than `endContainingPosition`'); - } - - if (progressCallback) { - C.currentQueryProgressCallback = progressCallback; - } - - marshalNode(node); - - C._ts_query_captures_wasm( - this[0], - node.tree[0], - startPosition.row, - startPosition.column, - endPosition.row, - endPosition.column, - startIndex, - endIndex, - startContainingPosition.row, - startContainingPosition.column, - endContainingPosition.row, - endContainingPosition.column, - startContainingIndex, - endContainingIndex, - matchLimit, - maxStartDepth, - ); - - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32'); - const result = new Array(); - this.exceededMatchLimit = Boolean(didExceedMatchLimit); - - const captures = new Array(); - let address = startAddress; - for (let i = 0; i < count; i++) { - const patternIndex = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const captureCount = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - const captureIndex = C.getValue(address, 'i32'); - address += SIZE_OF_INT; - - captures.length = captureCount; - address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); - - if (this.textPredicates[patternIndex].every(p => p(captures))) { - const capture = captures[captureIndex]; - const setProperties = this.setProperties[patternIndex]; - capture.setProperties = setProperties; - const assertedProperties = this.assertedProperties[patternIndex]; - capture.assertedProperties = assertedProperties; - const refutedProperties = this.refutedProperties[patternIndex]; - capture.refutedProperties = refutedProperties; - result.push(capture); - } - } - - C._free(startAddress); - C.currentQueryProgressCallback = null; - return result; - } - - /** Get the predicates for a given pattern. */ - predicatesForPattern(patternIndex: number): QueryPredicate[] { - return this.predicates[patternIndex]; - } - - /** - * Disable a certain capture within a query. - * - * This prevents the capture from being returned in matches, and also - * avoids any resource usage associated with recording the capture. - */ - disableCapture(captureName: string): void { - const captureNameLength = C.lengthBytesUTF8(captureName); - const captureNameAddress = C._malloc(captureNameLength + 1); - C.stringToUTF8(captureName, captureNameAddress, captureNameLength + 1); - C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength); - C._free(captureNameAddress); - } - - /** - * Disable a certain pattern within a query. - * - * This prevents the pattern from matching, and also avoids any resource - * usage associated with the pattern. This throws an error if the pattern - * index is out of bounds. - */ - disablePattern(patternIndex: number): void { - if (patternIndex >= this.predicates.length) { - throw new Error( - `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` - ); - } - C._ts_query_disable_pattern(this[0], patternIndex); - } - - /** - * Check if, on its last execution, this cursor exceeded its maximum number - * of in-progress matches. - */ - didExceedMatchLimit(): boolean { - return this.exceededMatchLimit; - } - - /** Get the byte offset where the given pattern starts in the query's source. */ - startIndexForPattern(patternIndex: number): number { - if (patternIndex >= this.predicates.length) { - throw new Error( - `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` - ); - } - return C._ts_query_start_byte_for_pattern(this[0], patternIndex); - } - - /** Get the byte offset where the given pattern ends in the query's source. */ - endIndexForPattern(patternIndex: number): number { - if (patternIndex >= this.predicates.length) { - throw new Error( - `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` - ); - } - return C._ts_query_end_byte_for_pattern(this[0], patternIndex); - } - - /** Get the number of patterns in the query. */ - patternCount(): number { - return C._ts_query_pattern_count(this[0]); - } - - /** Get the index for a given capture name. */ - captureIndexForName(captureName: string): number { - return this.captureNames.indexOf(captureName); - } - - /** Check if a given pattern within a query has a single root node. */ - isPatternRooted(patternIndex: number): boolean { - return C._ts_query_is_pattern_rooted(this[0], patternIndex) === 1; - } - - /** Check if a given pattern within a query has a single root node. */ - isPatternNonLocal(patternIndex: number): boolean { - return C._ts_query_is_pattern_non_local(this[0], patternIndex) === 1; - } - - /** - * Check if a given step in a query is 'definite'. - * - * A query step is 'definite' if its parent pattern will be guaranteed to - * match successfully once it reaches the step. - */ - isPatternGuaranteedAtStep(byteIndex: number): boolean { - return C._ts_query_is_pattern_guaranteed_at_step(this[0], byteIndex) === 1; - } -} diff --git a/lib/binding_web/src/tree.ts b/lib/binding_web/src/tree.ts deleted file mode 100644 index f6a7aaf3..00000000 --- a/lib/binding_web/src/tree.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { INTERNAL, Internal, assertInternal, ParseCallback, Point, Range, SIZE_OF_NODE, SIZE_OF_INT, SIZE_OF_RANGE, C } from './constants'; -import { Language } from './language'; -import { Node } from './node'; -import { TreeCursor } from './tree_cursor'; -import { marshalEdit, marshalPoint, unmarshalNode, unmarshalRange } from './marshal'; -import { TRANSFER_BUFFER } from './parser'; -import { Edit } from './edit'; -import { newFinalizer } from './finalization_registry'; - -/** @internal */ -export function getText(tree: Tree, startIndex: number, endIndex: number, startPosition: Point): string { - const length = endIndex - startIndex; - let result = tree.textCallback(startIndex, startPosition); - if (result) { - startIndex += result.length; - while (startIndex < endIndex) { - const string = tree.textCallback(startIndex, startPosition); - if (string && string.length > 0) { - startIndex += string.length; - result += string; - } else { - break; - } - } - if (startIndex > endIndex) { - result = result.slice(0, length); - } - } - return result ?? ''; -} - -const finalizer = newFinalizer((address: number) => { - C._ts_tree_delete(address); -}); - -/** A tree that represents the syntactic structure of a source code file. */ -export class Tree { - /** @internal */ - private [0] = 0; // Internal handle for Wasm - - /** @internal */ - textCallback: ParseCallback; - - /** The language that was used to parse the syntax tree. */ - language: Language; - - /** @internal */ - constructor(internal: Internal, address: number, language: Language, textCallback: ParseCallback) { - assertInternal(internal); - this[0] = address; - this.language = language; - this.textCallback = textCallback; - finalizer?.register(this, address, this); - } - - /** Create a shallow copy of the syntax tree. This is very fast. */ - copy(): Tree { - const address = C._ts_tree_copy(this[0]); - return new Tree(INTERNAL, address, this.language, this.textCallback); - } - - /** Delete the syntax tree, freeing its resources. */ - delete(): void { - finalizer?.unregister(this); - C._ts_tree_delete(this[0]); - this[0] = 0; - } - - /** Get the root node of the syntax tree. */ - get rootNode(): Node { - C._ts_tree_root_node_wasm(this[0]); - return unmarshalNode(this)!; - } - - /** - * Get the root node of the syntax tree, but with its position shifted - * forward by the given offset. - */ - rootNodeWithOffset(offsetBytes: number, offsetExtent: Point): Node { - const address = TRANSFER_BUFFER + SIZE_OF_NODE; - C.setValue(address, offsetBytes, 'i32'); - marshalPoint(address + SIZE_OF_INT, offsetExtent); - C._ts_tree_root_node_with_offset_wasm(this[0]); - return unmarshalNode(this)!; - } - - /** - * Edit the syntax tree to keep it in sync with source code that has been - * edited. - * - * You must describe the edit both in terms of byte offsets and in terms of - * row/column coordinates. - */ - edit(edit: Edit): void { - marshalEdit(edit); - C._ts_tree_edit_wasm(this[0]); - } - - /** Create a new {@link TreeCursor} starting from the root of the tree. */ - walk(): TreeCursor { - return this.rootNode.walk(); - } - - /** - * Compare this old edited syntax tree to a new syntax tree representing - * the same document, returning a sequence of ranges whose syntactic - * structure has changed. - * - * For this to work correctly, this syntax tree must have been edited such - * that its ranges match up to the new tree. Generally, you'll want to - * call this method right after calling one of the [`Parser::parse`] - * functions. Call it on the old tree that was passed to parse, and - * pass the new tree that was returned from `parse`. - */ - getChangedRanges(other: Tree): Range[] { - if (!(other instanceof Tree)) { - throw new TypeError('Argument must be a Tree'); - } - - C._ts_tree_get_changed_ranges_wasm(this[0], other[0]); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(count); - - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - result[i] = unmarshalRange(address); - address += SIZE_OF_RANGE; - } - C._free(buffer); - } - return result; - } - - /** Get the included ranges that were used to parse the syntax tree. */ - getIncludedRanges(): Range[] { - C._ts_tree_included_ranges_wasm(this[0]); - const count = C.getValue(TRANSFER_BUFFER, 'i32'); - const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, 'i32'); - const result = new Array(count); - - if (count > 0) { - let address = buffer; - for (let i = 0; i < count; i++) { - result[i] = unmarshalRange(address); - address += SIZE_OF_RANGE; - } - C._free(buffer); - } - return result; - } -} diff --git a/lib/binding_web/src/tree_cursor.ts b/lib/binding_web/src/tree_cursor.ts deleted file mode 100644 index 978a86dc..00000000 --- a/lib/binding_web/src/tree_cursor.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { INTERNAL, Internal, assertInternal, Point, SIZE_OF_NODE, SIZE_OF_CURSOR, C } from './constants'; -import { marshalNode, marshalPoint, marshalTreeCursor, unmarshalNode, unmarshalPoint, unmarshalTreeCursor } from './marshal'; -import { Node } from './node'; -import { TRANSFER_BUFFER } from './parser'; -import { getText, Tree } from './tree'; -import { newFinalizer } from './finalization_registry'; - -const finalizer = newFinalizer((address: number) => { - C._ts_tree_cursor_delete_wasm(address); -}); - -/** A stateful object for walking a syntax {@link Tree} efficiently. */ -export class TreeCursor { - /** @internal */ - // @ts-expect-error: never read - private [0] = 0; // Internal handle for Wasm - - /** @internal */ - // @ts-expect-error: never read - private [1] = 0; // Internal handle for Wasm - - /** @internal */ - // @ts-expect-error: never read - private [2] = 0; // Internal handle for Wasm - - /** @internal */ - // @ts-expect-error: never read - private [3] = 0; // Internal handle for Wasm - - /** @internal */ - private tree: Tree; - - /** @internal */ - constructor(internal: Internal, tree: Tree) { - assertInternal(internal); - this.tree = tree; - unmarshalTreeCursor(this); - finalizer?.register(this, this.tree[0], this); - } - - /** Creates a deep copy of the tree cursor. This allocates new memory. */ - copy(): TreeCursor { - const copy = new TreeCursor(INTERNAL, this.tree); - C._ts_tree_cursor_copy_wasm(this.tree[0]); - unmarshalTreeCursor(copy); - return copy; - } - - /** Delete the tree cursor, freeing its resources. */ - delete(): void { - finalizer?.unregister(this); - marshalTreeCursor(this); - C._ts_tree_cursor_delete_wasm(this.tree[0]); - this[0] = this[1] = this[2] = 0; - } - - /** Get the tree cursor's current {@link Node}. */ - get currentNode(): Node { - marshalTreeCursor(this); - C._ts_tree_cursor_current_node_wasm(this.tree[0]); - return unmarshalNode(this.tree)!; - } - - /** - * Get the numerical field id of this tree cursor's current node. - * - * See also {@link TreeCursor#currentFieldName}. - */ - get currentFieldId(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]); - } - - /** Get the field name of this tree cursor's current node. */ - get currentFieldName(): string | null { - return this.tree.language.fields[this.currentFieldId]; - } - - /** - * Get the depth of the cursor's current node relative to the original - * node that the cursor was constructed with. - */ - get currentDepth(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_depth_wasm(this.tree[0]); - } - - /** - * Get the index of the cursor's current node out of all of the - * descendants of the original node that the cursor was constructed with. - */ - get currentDescendantIndex(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]); - } - - /** Get the type of the cursor's current node. */ - get nodeType(): string { - return this.tree.language.types[this.nodeTypeId] || 'ERROR'; - } - - /** Get the type id of the cursor's current node. */ - get nodeTypeId(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]); - } - - /** Get the state id of the cursor's current node. */ - get nodeStateId(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]); - } - - /** Get the id of the cursor's current node. */ - get nodeId(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]); - } - - /** - * Check if the cursor's current node is *named*. - * - * Named nodes correspond to named rules in the grammar, whereas - * *anonymous* nodes correspond to string literals in the grammar. - */ - get nodeIsNamed(): boolean { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1; - } - - /** - * Check if the cursor's current node is *missing*. - * - * Missing nodes are inserted by the parser in order to recover from - * certain kinds of syntax errors. - */ - get nodeIsMissing(): boolean { - marshalTreeCursor(this); - return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1; - } - - /** Get the string content of the cursor's current node. */ - get nodeText(): string { - marshalTreeCursor(this); - const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]); - const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]); - C._ts_tree_cursor_start_position_wasm(this.tree[0]); - const startPosition = unmarshalPoint(TRANSFER_BUFFER); - return getText(this.tree, startIndex, endIndex, startPosition); - } - - /** Get the start position of the cursor's current node. */ - get startPosition(): Point { - marshalTreeCursor(this); - C._ts_tree_cursor_start_position_wasm(this.tree[0]); - return unmarshalPoint(TRANSFER_BUFFER); - } - - /** Get the end position of the cursor's current node. */ - get endPosition(): Point { - marshalTreeCursor(this); - C._ts_tree_cursor_end_position_wasm(this.tree[0]); - return unmarshalPoint(TRANSFER_BUFFER); - } - - /** Get the start index of the cursor's current node. */ - get startIndex(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_start_index_wasm(this.tree[0]); - } - - /** Get the end index of the cursor's current node. */ - get endIndex(): number { - marshalTreeCursor(this); - return C._ts_tree_cursor_end_index_wasm(this.tree[0]); - } - - /** - * Move this cursor to the first child of its current node. - * - * This returns `true` if the cursor successfully moved, and returns - * `false` if there were no children. - */ - gotoFirstChild(): boolean { - marshalTreeCursor(this); - const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Move this cursor to the last child of its current node. - * - * This returns `true` if the cursor successfully moved, and returns - * `false` if there were no children. - * - * Note that this function may be slower than - * {@link TreeCursor#gotoFirstChild} because it needs to - * iterate through all the children to compute the child's position. - */ - gotoLastChild(): boolean { - marshalTreeCursor(this); - const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Move this cursor to the parent of its current node. - * - * This returns `true` if the cursor successfully moved, and returns - * `false` if there was no parent node (the cursor was already on the - * root node). - * - * Note that the node the cursor was constructed with is considered the root - * of the cursor, and the cursor cannot walk outside this node. - */ - gotoParent(): boolean { - marshalTreeCursor(this); - const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Move this cursor to the next sibling of its current node. - * - * This returns `true` if the cursor successfully moved, and returns - * `false` if there was no next sibling node. - * - * Note that the node the cursor was constructed with is considered the root - * of the cursor, and the cursor cannot walk outside this node. - */ - gotoNextSibling(): boolean { - marshalTreeCursor(this); - const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Move this cursor to the previous sibling of its current node. - * - * This returns `true` if the cursor successfully moved, and returns - * `false` if there was no previous sibling node. - * - * Note that this function may be slower than - * {@link TreeCursor#gotoNextSibling} due to how node - * positions are stored. In the worst case, this will need to iterate - * through all the children up to the previous sibling node to recalculate - * its position. Also note that the node the cursor was constructed with is - * considered the root of the cursor, and the cursor cannot walk outside this node. - */ - gotoPreviousSibling(): boolean { - marshalTreeCursor(this); - const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Move the cursor to the node that is the nth descendant of - * the original node that the cursor was constructed with, where - * zero represents the original node itself. - */ - gotoDescendant(goalDescendantIndex: number): void { - marshalTreeCursor(this); - C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantIndex); - unmarshalTreeCursor(this); - } - - /** - * Move this cursor to the first child of its current node that contains or - * starts after the given byte offset. - * - * This returns `true` if the cursor successfully moved to a child node, and returns - * `false` if no such child was found. - */ - gotoFirstChildForIndex(goalIndex: number): boolean { - marshalTreeCursor(this); - C.setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, 'i32'); - const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Move this cursor to the first child of its current node that contains or - * starts after the given byte offset. - * - * This returns the index of the child node if one was found, and returns - * `null` if no such child was found. - */ - gotoFirstChildForPosition(goalPosition: Point): boolean { - marshalTreeCursor(this); - marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition); - const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]); - unmarshalTreeCursor(this); - return result === 1; - } - - /** - * Re-initialize this tree cursor to start at the original node that the - * cursor was constructed with. - */ - reset(node: Node): void { - marshalNode(node); - marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE); - C._ts_tree_cursor_reset_wasm(this.tree[0]); - unmarshalTreeCursor(this); - } - - /** - * Re-initialize a tree cursor to the same position as another cursor. - * - * Unlike {@link TreeCursor#reset}, this will not lose parent - * information and allows reusing already created cursors. - */ - resetTo(cursor: TreeCursor): void { - marshalTreeCursor(this, TRANSFER_BUFFER); - marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR); - C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]); - unmarshalTreeCursor(this); - } -} diff --git a/lib/binding_web/suffix.js b/lib/binding_web/suffix.js new file mode 100644 index 00000000..8e096f61 --- /dev/null +++ b/lib/binding_web/suffix.js @@ -0,0 +1,23 @@ + for (const name of Object.getOwnPropertyNames(ParserImpl.prototype)) { + Object.defineProperty(Parser.prototype, name, { + value: ParserImpl.prototype[name], + enumerable: false, + writable: false, + }) + } + + Parser.Language = Language; + Module.onRuntimeInitialized = () => { + ParserImpl.init(); + resolveInitPromise(); + }; + }); + } + } + + return Parser; +}(); + +if (typeof exports === 'object') { + module.exports = TreeSitter; +} diff --git a/lib/binding_web/test/edit.test.ts b/lib/binding_web/test/edit.test.ts deleted file mode 100644 index bd4cb194..00000000 --- a/lib/binding_web/test/edit.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { Edit } from '../src'; - -describe('Edit', () => { - it('edits a point after the edit', () => { - const edit = new Edit({ - startIndex: 5, - oldEndIndex: 5, - newEndIndex: 10, - startPosition: { row: 0, column: 5 }, - oldEndPosition: { row: 0, column: 5 }, - newEndPosition: { row: 0, column: 10 }, - }); - - const point = { row: 0, column: 8 }; - const index = 8; - const result = edit.editPoint(point, index); - expect(result.point).toEqual({ row: 0, column: 13 }); - expect(result.index).toBe(13); - }); - - it('edits a point before the edit', () => { - const edit = new Edit({ - startIndex: 5, - oldEndIndex: 5, - newEndIndex: 10, - startPosition: { row: 0, column: 5 }, - oldEndPosition: { row: 0, column: 5 }, - newEndPosition: { row: 0, column: 10 }, - }); - - const point = { row: 0, column: 2 }; - const index = 2; - const result = edit.editPoint(point, index); - expect(result.point).toEqual({ row: 0, column: 2 }); - expect(result.index).toBe(2); - }); - - it('edits a point at the start of the edit', () => { - const edit = new Edit({ - startIndex: 5, - oldEndIndex: 5, - newEndIndex: 10, - startPosition: { row: 0, column: 5 }, - oldEndPosition: { row: 0, column: 5 }, - newEndPosition: { row: 0, column: 10 }, - }); - - const point = { row: 0, column: 5 }; - const index = 5; - const result = edit.editPoint(point, index); - expect(result.point).toEqual({ row: 0, column: 10 }); - expect(result.index).toBe(10); - }); - - it('edits a range after the edit', () => { - const edit = new Edit({ - startIndex: 10, - oldEndIndex: 15, - newEndIndex: 20, - startPosition: { row: 1, column: 0 }, - oldEndPosition: { row: 1, column: 5 }, - newEndPosition: { row: 2, column: 0 }, - }); - - const range = { - startPosition: { row: 2, column: 0 }, - endPosition: { row: 2, column: 5 }, - startIndex: 20, - endIndex: 25, - }; - const result = edit.editRange(range); - expect(result.startIndex).toBe(25); - expect(result.endIndex).toBe(30); - expect(result.startPosition).toEqual({ row: 3, column: 0 }); - expect(result.endPosition).toEqual({ row: 3, column: 5 }); - }); - - it('edits a range before the edit', () => { - const edit = new Edit({ - startIndex: 10, - oldEndIndex: 15, - newEndIndex: 20, - startPosition: { row: 1, column: 0 }, - oldEndPosition: { row: 1, column: 5 }, - newEndPosition: { row: 2, column: 0 }, - }); - - const range = { - startPosition: { row: 0, column: 5 }, - endPosition: { row: 0, column: 8 }, - startIndex: 5, - endIndex: 8, - }; - const result = edit.editRange(range); - expect(result.startIndex).toBe(5); - expect(result.endIndex).toBe(8); - expect(result.startPosition).toEqual({ row: 0, column: 5 }); - expect(result.endPosition).toEqual({ row: 0, column: 8 }); - }); - - it('edits a range overlapping the edit', () => { - const edit = new Edit({ - startIndex: 10, - oldEndIndex: 15, - newEndIndex: 20, - startPosition: { row: 1, column: 0 }, - oldEndPosition: { row: 1, column: 5 }, - newEndPosition: { row: 2, column: 0 } - }); - - const range = { - startPosition: { row: 0, column: 8 }, - endPosition: { row: 1, column: 2 }, - startIndex: 8, - endIndex: 12, - }; - const result = edit.editRange(range); - expect(result.startIndex).toBe(8); - expect(result.endIndex).toBe(10); - expect(result.startPosition).toEqual({ row: 0, column: 8 }); - expect(result.endPosition).toEqual({ row: 1, column: 0 }); - }); -}); diff --git a/lib/binding_web/test/helper.js b/lib/binding_web/test/helper.js new file mode 100644 index 00000000..2847f5ab --- /dev/null +++ b/lib/binding_web/test/helper.js @@ -0,0 +1,15 @@ +const Parser = require(`..`); + +function languageURL(name) { + return require.resolve(`../../../target/release/tree-sitter-${name}.wasm`); +} + +module.exports = Parser.init().then(async () => ({ + Parser, + languageURL, + EmbeddedTemplate: await Parser.Language.load(languageURL('embedded-template')), + HTML: await Parser.Language.load(languageURL('html')), + JavaScript: await Parser.Language.load(languageURL('javascript')), + JSON: await Parser.Language.load(languageURL('json')), + Python: await Parser.Language.load(languageURL('python')), +})); diff --git a/lib/binding_web/test/helper.ts b/lib/binding_web/test/helper.ts deleted file mode 100644 index 15a4d02c..00000000 --- a/lib/binding_web/test/helper.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Parser, Language } from '../src'; -import path from 'path'; - -// https://github.com/tree-sitter/tree-sitter/blob/master/xtask/src/fetch.rs#L15 -export type LanguageName = 'bash' | 'c' | 'cpp' | 'embedded-template' | 'go' | 'html' | 'java' | 'javascript' | 'jsdoc' | 'json' | 'php' | 'python' | 'ruby' | 'rust' | 'typescript' | 'tsx'; - -function languageURL(name: LanguageName): string { - const basePath = process.cwd(); - return path.join(basePath, `../../target/release/tree-sitter-${name}.wasm`); -} - -export default Parser.init().then(async () => ({ - languageURL, - C: await Language.load(languageURL('c')), - EmbeddedTemplate: await Language.load(languageURL('embedded-template')), - HTML: await Language.load(languageURL('html')), - JavaScript: await Language.load(languageURL('javascript')), - JSON: await Language.load(languageURL('json')), - Python: await Language.load(languageURL('python')), - Rust: await Language.load(languageURL('rust')), -})); diff --git a/lib/binding_web/test/language-test.js b/lib/binding_web/test/language-test.js new file mode 100644 index 00000000..d3591fca --- /dev/null +++ b/lib/binding_web/test/language-test.js @@ -0,0 +1,87 @@ +const {assert} = require('chai'); +let JavaScript; + +describe('Language', () => { + before(async () => ({JavaScript} = await require('./helper'))); + + describe('.fieldIdForName, .fieldNameForId', () => { + it('converts between the string and integer representations of fields', () => { + const nameId = JavaScript.fieldIdForName('name'); + const bodyId = JavaScript.fieldIdForName('body'); + + assert.isBelow(nameId, JavaScript.fieldCount); + assert.isBelow(bodyId, JavaScript.fieldCount); + assert.equal('name', JavaScript.fieldNameForId(nameId)); + assert.equal('body', JavaScript.fieldNameForId(bodyId)); + }); + + it('handles invalid inputs', () => { + assert.equal(null, JavaScript.fieldIdForName('namezzz')); + assert.equal(null, JavaScript.fieldNameForId(-1)); + assert.equal(null, JavaScript.fieldNameForId(10000)); + }); + }); + + describe('.idForNodeType, .nodeTypeForId, .nodeTypeIsNamed', () => { + it('converts between the string and integer representations of a node type', () => { + const exportStatementId = JavaScript.idForNodeType('export_statement', true); + const starId = JavaScript.idForNodeType('*', false); + + assert.isBelow(exportStatementId, JavaScript.nodeTypeCount); + assert.isBelow(starId, JavaScript.nodeTypeCount); + assert.equal(true, JavaScript.nodeTypeIsNamed(exportStatementId)); + assert.equal('export_statement', JavaScript.nodeTypeForId(exportStatementId)); + assert.equal(false, JavaScript.nodeTypeIsNamed(starId)); + assert.equal('*', JavaScript.nodeTypeForId(starId)); + }); + + it('handles invalid inputs', () => { + assert.equal(null, JavaScript.nodeTypeForId(-1)); + assert.equal(null, JavaScript.nodeTypeForId(10000)); + assert.equal(null, JavaScript.idForNodeType('export_statement', false)); + }); + }); +}); + +describe('Lookahead iterator', () => { + let lookahead; + let state; + before(async () => { + let Parser; + ({JavaScript, Parser} = await require('./helper')); + const parser = new Parser().setLanguage(JavaScript); + const tree = parser.parse('function fn() {}'); + parser.delete(); + const cursor = tree.walk(); + assert(cursor.gotoFirstChild()); + assert(cursor.gotoFirstChild()); + state = cursor.currentNode.nextParseState; + lookahead = JavaScript.lookaheadIterator(state); + assert.exists(lookahead); + }); + + after(() => { + lookahead.delete(); + }); + + const expected = ['(', 'identifier', '*', 'formal_parameters', 'html_comment', 'comment']; + it('should iterate over valid symbols in the state', () => { + const symbols = Array.from(lookahead); + assert.includeMembers(symbols, expected); + assert.lengthOf(symbols, expected.length); + }); + + it('should reset to the initial state', () => { + assert(lookahead.resetState(state)); + const symbols = Array.from(lookahead); + assert.includeMembers(symbols, expected); + assert.lengthOf(symbols, expected.length); + }); + + it('should reset', () => { + assert(lookahead.reset(JavaScript, state)); + const symbols = Array.from(lookahead); + assert.includeMembers(symbols, expected); + assert.lengthOf(symbols, expected.length); + }); +}); diff --git a/lib/binding_web/test/language.test.ts b/lib/binding_web/test/language.test.ts deleted file mode 100644 index bda09a29..00000000 --- a/lib/binding_web/test/language.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { describe, it, expect, beforeAll, afterAll } from 'vitest'; -import helper from './helper'; -import type { LookaheadIterator, Language } from '../src'; -import { Parser } from '../src'; - -let JavaScript: Language; -let Rust: Language; - -describe('Language', () => { - beforeAll(async () => ({ JavaScript, Rust } = await helper)); - - describe('.name, .version', () => { - it('returns the name and version of the language', () => { - expect(JavaScript.name).toBe('javascript'); - expect(JavaScript.abiVersion).toBe(15); - }); - }); - - describe('.fieldIdForName, .fieldNameForId', () => { - it('converts between the string and integer representations of fields', () => { - const nameId = JavaScript.fieldIdForName('name'); - const bodyId = JavaScript.fieldIdForName('body'); - - expect(nameId).toBeLessThan(JavaScript.fieldCount); - expect(bodyId).toBeLessThan(JavaScript.fieldCount); - expect(JavaScript.fieldNameForId(nameId!)).toBe('name'); - expect(JavaScript.fieldNameForId(bodyId!)).toBe('body'); - }); - - it('handles invalid inputs', () => { - expect(JavaScript.fieldIdForName('namezzz')).toBeNull(); - expect(JavaScript.fieldNameForId(-3)).toBeNull(); - expect(JavaScript.fieldNameForId(10000)).toBeNull(); - }); - }); - - describe('.idForNodeType, .nodeTypeForId, .nodeTypeIsNamed', () => { - it('converts between the string and integer representations of a node type', () => { - const exportStatementId = JavaScript.idForNodeType('export_statement', true)!; - const starId = JavaScript.idForNodeType('*', false)!; - - expect(exportStatementId).toBeLessThan(JavaScript.nodeTypeCount); - expect(starId).toBeLessThan(JavaScript.nodeTypeCount); - expect(JavaScript.nodeTypeIsNamed(exportStatementId)).toBe(true); - expect(JavaScript.nodeTypeForId(exportStatementId)).toBe('export_statement'); - expect(JavaScript.nodeTypeIsNamed(starId)).toBe(false); - expect(JavaScript.nodeTypeForId(starId)).toBe('*'); - }); - - it('handles invalid inputs', () => { - expect(JavaScript.nodeTypeForId(-3)).toBeNull(); - expect(JavaScript.nodeTypeForId(10000)).toBeNull(); - expect(JavaScript.idForNodeType('export_statement', false)).toBeNull(); - }); - }); - - describe('Supertypes', () => { - it('gets the supertypes and subtypes of a parser', () => { - const supertypes = Rust.supertypes; - const names = supertypes.map((id) => Rust.nodeTypeForId(id)); - expect(names).toEqual([ - '_expression', - '_literal', - '_literal_pattern', - '_pattern', - '_type' - ]); - - for (const id of supertypes) { - const name = Rust.nodeTypeForId(id); - const subtypes = Rust.subtypes(id); - let subtypeNames = subtypes.map((id) => Rust.nodeTypeForId(id)); - subtypeNames = [...new Set(subtypeNames)].sort(); // Remove duplicates & sort - - switch (name) { - case '_literal': - expect(subtypeNames).toEqual([ - 'boolean_literal', - 'char_literal', - 'float_literal', - 'integer_literal', - 'raw_string_literal', - 'string_literal', - ]); - break; - case '_pattern': - expect(subtypeNames).toEqual([ - '_', - '_literal_pattern', - 'captured_pattern', - 'const_block', - 'generic_pattern', - 'identifier', - 'macro_invocation', - 'mut_pattern', - 'or_pattern', - 'range_pattern', - 'ref_pattern', - 'reference_pattern', - 'remaining_field_pattern', - 'scoped_identifier', - 'slice_pattern', - 'struct_pattern', - 'tuple_pattern', - 'tuple_struct_pattern', - ]); - break; - case '_type': - expect(subtypeNames).toEqual([ - 'abstract_type', - 'array_type', - 'bounded_type', - 'dynamic_type', - 'function_type', - 'generic_type', - 'macro_invocation', - 'metavariable', - 'never_type', - 'pointer_type', - 'primitive_type', - 'reference_type', - 'removed_trait_bound', - 'scoped_type_identifier', - 'tuple_type', - 'type_identifier', - 'unit_type', - ]); - break; - } - } - }); - }); -}); - -describe('Lookahead iterator', () => { - let lookahead: LookaheadIterator; - let state: number; - - beforeAll(async () => { - ({ JavaScript } = await helper); - const parser = new Parser(); - parser.setLanguage(JavaScript); - const tree = parser.parse('function fn() {}')!; - parser.delete(); - const cursor = tree.walk(); - expect(cursor.gotoFirstChild()).toBe(true); - expect(cursor.gotoFirstChild()).toBe(true); - state = cursor.currentNode.nextParseState; - lookahead = JavaScript.lookaheadIterator(state)!; - expect(lookahead).toBeDefined(); - }); - - afterAll(() => { lookahead.delete() }); - - const expected = ['(', 'identifier', '*', 'formal_parameters', 'html_comment', 'comment']; - - it('should iterate over valid symbols in the state', () => { - const symbols = Array.from(lookahead); - expect(symbols).toEqual(expect.arrayContaining(expected)); - expect(symbols).toHaveLength(expected.length); - }); - - it('should reset to the initial state', () => { - expect(lookahead.resetState(state)).toBe(true); - const symbols = Array.from(lookahead); - expect(symbols).toEqual(expect.arrayContaining(expected)); - expect(symbols).toHaveLength(expected.length); - }); - - it('should reset', () => { - expect(lookahead.reset(JavaScript, state)).toBe(true); - const symbols = Array.from(lookahead); - expect(symbols).toEqual(expect.arrayContaining(expected)); - expect(symbols).toHaveLength(expected.length); - }); -}); diff --git a/lib/binding_web/test/memory.test.ts b/lib/binding_web/test/memory.test.ts deleted file mode 100644 index 46238934..00000000 --- a/lib/binding_web/test/memory.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { gc, event, Finalizer } from './memory'; - -// hijack finalization registry before import web-tree-sitter -globalThis.FinalizationRegistry = Finalizer; - -describe('Memory Management', () => { - describe('call .delete()', () => { - it('test free memory manually', async () => { - const timer = setInterval(() => { - gc(); - }, 100); - let done = 0; - event.on('gc', () => { - done++; - }); - await (async () => { - const { JavaScript } = await (await import('./helper')).default; - const { Parser, Query } = await import('../src'); - const parser = new Parser(); - parser.setLanguage(JavaScript); - const tree = parser.parse('1+1')!; - const copyTree = tree.copy(); - const cursor = tree.walk(); - const copyCursor = cursor.copy(); - const lookaheadIterator = JavaScript.lookaheadIterator(cursor.currentNode.nextParseState)!; - const query = new Query(JavaScript, '(identifier) @element'); - parser.delete(); - tree.delete(); - copyTree.delete(); - cursor.delete(); - copyCursor.delete(); - lookaheadIterator.delete(); - query.delete(); - })(); - // wait for gc - await new Promise((resolve) => setTimeout(resolve, 1000)); - clearInterval(timer); - // expect no gc event fired - expect(done).toBe(0); - }); - }); - - describe('do not call .delete()', () => { - it('test free memory automatically', async () => { - const timer = setInterval(() => { - gc(); - }, 100); - let done = 0; - const promise = new Promise((resolve) => { - event.on('gc', () => { - if (++done === 7) { - resolve(undefined); - clearInterval(timer); - } - console.log('free memory times: ', done); - }); - }); - await (async () => { - const { JavaScript } = await (await import('./helper')).default; - const { Parser, Query } = await import('../src'); - const parser = new Parser(); // 1 - parser.setLanguage(JavaScript); - const tree = parser.parse('1+1')!; // 2 - tree.copy(); // 3 - const cursor = tree.walk(); // 4 - cursor.copy(); // 5 - JavaScript.lookaheadIterator(cursor.currentNode.nextParseState)!; // 6 - new Query(JavaScript, '(identifier) @element'); // 7 - })(); - await promise; - }); - }); -}); diff --git a/lib/binding_web/test/memory.ts b/lib/binding_web/test/memory.ts deleted file mode 100644 index 62cb8b7d..00000000 --- a/lib/binding_web/test/memory.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { EventEmitter } from 'events'; -import { Session } from 'inspector'; - -const session = new Session(); -session.connect(); - -export function gc() { - session.post('HeapProfiler.collectGarbage'); -} - -export const event = new EventEmitter(); - -export class Finalizer extends FinalizationRegistry { - constructor(handler: (value: T) => void) { - super((value) => { - handler(value); - event.emit('gc'); - }); - } -} diff --git a/lib/binding_web/test/memory_unsupported.test.ts b/lib/binding_web/test/memory_unsupported.test.ts deleted file mode 100644 index cc1f69bf..00000000 --- a/lib/binding_web/test/memory_unsupported.test.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { describe, it } from 'vitest'; - -describe('FinalizationRegistry is unsupported', () => { - it('test FinalizationRegistry is unsupported', async () => { - // @ts-expect-error: test FinalizationRegistry is not supported - globalThis.FinalizationRegistry = undefined; - const { JavaScript } = await (await import('./helper')).default; - const { Parser, Query } = await import('../src'); - const parser = new Parser(); - parser.setLanguage(JavaScript); - const tree = parser.parse('1+1')!; - const copyTree = tree.copy(); - const cursor = tree.walk(); - const copyCursor = cursor.copy(); - const lookaheadIterator = JavaScript.lookaheadIterator(cursor.currentNode.nextParseState)!; - const query = new Query(JavaScript, '(identifier) @element'); - parser.delete(); - tree.delete(); - copyTree.delete(); - cursor.delete(); - copyCursor.delete(); - lookaheadIterator.delete(); - query.delete(); - }); -}); diff --git a/lib/binding_web/test/node-test.js b/lib/binding_web/test/node-test.js new file mode 100644 index 00000000..7c3e8f7b --- /dev/null +++ b/lib/binding_web/test/node-test.js @@ -0,0 +1,636 @@ +const {assert} = require('chai'); +let Parser; let JavaScript; let JSON; let EmbeddedTemplate; let Python; + +const JSON_EXAMPLE = ` + +[ + 123, + false, + { + "x": null + } +] +`; + +function getAllNodes(tree) { + const result = []; + let visitedChildren = false; + const cursor = tree.walk(); + while (true) { + if (!visitedChildren) { + result.push(cursor.currentNode); + if (!cursor.gotoFirstChild()) { + visitedChildren = true; + } + } else if (cursor.gotoNextSibling()) { + visitedChildren = false; + } else if (!cursor.gotoParent()) { + break; + } + } + return result; +} + +describe('Node', () => { + let parser; let tree; + + before(async () => + ({Parser, EmbeddedTemplate, JavaScript, JSON, Python} = await require('./helper')), + ); + + beforeEach(() => { + tree = null; + parser = new Parser().setLanguage(JavaScript); + }); + + afterEach(() => { + parser.delete(); + tree.delete(); + }); + + describe('.children', () => { + it('returns an array of child nodes', () => { + tree = parser.parse('x10 + 1000'); + assert.equal(1, tree.rootNode.children.length); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.deepEqual( + sumNode.children.map((child) => child.type), + ['identifier', '+', 'number'], + ); + }); + }); + + describe('.namedChildren', () => { + it('returns an array of named child nodes', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.equal(1, tree.rootNode.namedChildren.length); + assert.deepEqual( + ['identifier', 'number'], + sumNode.namedChildren.map((child) => child.type), + ); + }); + }); + + describe('.childrenForFieldName', () => { + it('returns an array of child nodes for the given field name', () => { + parser.setLanguage(Python); + const source = ` + if one: + a() + elif two: + b() + elif three: + c() + elif four: + d()`; + + tree = parser.parse(source); + const node = tree.rootNode.firstChild; + assert.equal(node.type, 'if_statement'); + const alternatives = node.childrenForFieldName('alternative'); + const alternativeTexts = alternatives.map((n) => { + const condition = n.childForFieldName('condition'); + return source.slice(condition.startIndex, condition.endIndex); + }); + assert.deepEqual(alternativeTexts, ['two', 'three', 'four']); + }); + }); + + describe('.startIndex and .endIndex', () => { + it('returns the character index where the node starts/ends in the text', () => { + tree = parser.parse('a👍👎1 / b👎c👎'); + const quotientNode = tree.rootNode.firstChild.firstChild; + + assert.equal(0, quotientNode.startIndex); + assert.equal(15, quotientNode.endIndex); + assert.deepEqual( + [0, 7, 9], + quotientNode.children.map((child) => child.startIndex), + ); + assert.deepEqual( + [6, 8, 15], + quotientNode.children.map((child) => child.endIndex), + ); + }); + }); + + describe('.startPosition and .endPosition', () => { + it('returns the row and column where the node starts/ends in the text', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.equal('binary_expression', sumNode.type); + + assert.deepEqual({row: 0, column: 0}, sumNode.startPosition); + assert.deepEqual({row: 0, column: 10}, sumNode.endPosition); + assert.deepEqual( + [{row: 0, column: 0}, {row: 0, column: 4}, {row: 0, column: 6}], + sumNode.children.map((child) => child.startPosition), + ); + assert.deepEqual( + [{row: 0, column: 3}, {row: 0, column: 5}, {row: 0, column: 10}], + sumNode.children.map((child) => child.endPosition), + ); + }); + + it('handles characters that occupy two UTF16 code units', () => { + tree = parser.parse('a👍👎1 /\n b👎c👎'); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.deepEqual( + [ + [{row: 0, column: 0}, {row: 0, column: 6}], + [{row: 0, column: 7}, {row: 0, column: 8}], + [{row: 1, column: 1}, {row: 1, column: 7}], + ], + sumNode.children.map((child) => [child.startPosition, child.endPosition]), + ); + }); + }); + + describe('.parent', () => { + it('returns the node\'s parent', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild; + const variableNode = sumNode.firstChild; + assert.notEqual(sumNode.id, variableNode.id); + assert.equal(sumNode.id, variableNode.parent.id); + assert.equal(tree.rootNode.id, sumNode.parent.id); + }); + }); + + describe('.child(), .firstChild, .lastChild', () => { + it('returns null when the node has no children', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + const variableNode = sumNode.firstChild; + assert.equal(variableNode.firstChild, null); + assert.equal(variableNode.lastChild, null); + assert.equal(variableNode.firstNamedChild, null); + assert.equal(variableNode.lastNamedChild, null); + assert.equal(variableNode.child(1), null); + }); + }); + + describe('.childForFieldName()', () => { + it('returns null when the node has no children', () => { + tree = parser.parse('class A { b() {} }'); + + const classNode = tree.rootNode.firstChild; + assert.equal(classNode.type, 'class_declaration'); + + const classNameNode = classNode.childForFieldName('name'); + assert.equal(classNameNode.type, 'identifier'); + assert.equal(classNameNode.text, 'A'); + + const bodyNode = classNode.childForFieldName('body'); + assert.equal(bodyNode.type, 'class_body'); + assert.equal(bodyNode.text, '{ b() {} }'); + + const methodNode = bodyNode.firstNamedChild; + assert.equal(methodNode.type, 'method_definition'); + assert.equal(methodNode.text, 'b() {}'); + + const methodNameNode = methodNode.childForFieldName('name'); + assert.equal(methodNameNode.type, 'property_identifier'); + assert.equal(methodNameNode.text, 'b'); + + const paramsNode = methodNode.childForFieldName('parameters'); + assert.equal(paramsNode.type, 'formal_parameters'); + assert.equal(paramsNode.text, '()'); + }); + }); + + describe('.nextSibling and .previousSibling', () => { + it('returns the node\'s next and previous sibling', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.equal(sumNode.children[1].id, sumNode.children[0].nextSibling.id); + assert.equal(sumNode.children[2].id, sumNode.children[1].nextSibling.id); + assert.equal( + sumNode.children[0].id, + sumNode.children[1].previousSibling.id, + ); + assert.equal( + sumNode.children[1].id, + sumNode.children[2].previousSibling.id, + ); + }); + }); + + describe('.nextNamedSibling and .previousNamedSibling', () => { + it('returns the node\'s next and previous named sibling', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.equal( + sumNode.namedChildren[1].id, + sumNode.namedChildren[0].nextNamedSibling.id, + ); + assert.equal( + sumNode.namedChildren[0].id, + sumNode.namedChildren[1].previousNamedSibling.id, + ); + }); + }); + + describe('.descendantForIndex(min, max)', () => { + it('returns the smallest node that spans the given range', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + assert.equal('identifier', sumNode.descendantForIndex(1, 2).type); + assert.equal('+', sumNode.descendantForIndex(4, 4).type); + + assert.throws(() => { + sumNode.descendantForIndex(1, {}); + }, 'Arguments must be numbers'); + + assert.throws(() => { + sumNode.descendantForIndex(); + }, 'Arguments must be numbers'); + }); + }); + + describe('.namedDescendantForIndex', () => { + it('returns the smallest node that spans the given range', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild; + assert.equal('identifier', sumNode.descendantForIndex(1, 2).type); + assert.equal('+', sumNode.descendantForIndex(4, 4).type); + }); + }); + + describe('.descendantForPosition(min, max)', () => { + it('returns the smallest node that spans the given range', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild; + + assert.equal( + 'identifier', + sumNode.descendantForPosition( + {row: 0, column: 1}, + {row: 0, column: 2}, + ).type, + ); + + assert.equal( + '+', + sumNode.descendantForPosition({row: 0, column: 4}).type, + ); + + assert.throws(() => { + sumNode.descendantForPosition(1, {}); + }, 'Arguments must be {row, column} objects'); + + assert.throws(() => { + sumNode.descendantForPosition(); + }, 'Arguments must be {row, column} objects'); + }); + }); + + describe('.namedDescendantForPosition(min, max)', () => { + it('returns the smallest named node that spans the given range', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild; + + assert.equal( + sumNode.namedDescendantForPosition( + {row: 0, column: 1}, + {row: 0, column: 2}, + ).type, + 'identifier', + ); + + assert.equal( + sumNode.namedDescendantForPosition({row: 0, column: 4}).type, + 'binary_expression', + ); + }); + }); + + describe('.hasError', () => { + it('returns true if the node contains an error', () => { + tree = parser.parse('1 + 2 * * 3'); + const node = tree.rootNode; + assert.equal( + node.toString(), + '(program (expression_statement (binary_expression left: (number) right: (binary_expression left: (number) (ERROR) right: (number)))))', + ); + + const sum = node.firstChild.firstChild; + assert(sum.hasError); + assert(!sum.children[0].hasError); + assert(!sum.children[1].hasError); + assert(sum.children[2].hasError); + }); + }); + + describe('.isError', () => { + it('returns true if the node is an error', () => { + tree = parser.parse('2 * * 3'); + const node = tree.rootNode; + assert.equal( + node.toString(), + '(program (expression_statement (binary_expression left: (number) (ERROR) right: (number))))', + ); + + const multi = node.firstChild.firstChild; + assert(multi.hasError); + assert(!multi.children[0].isError); + assert(!multi.children[1].isError); + assert(multi.children[2].isError); + assert(!multi.children[3].isError); + }); + }); + + describe('.isMissing', () => { + it('returns true if the node is missing from the source and was inserted via error recovery', () => { + tree = parser.parse('(2 ||)'); + const node = tree.rootNode; + assert.equal( + node.toString(), + '(program (expression_statement (parenthesized_expression (binary_expression left: (number) right: (MISSING identifier)))))', + ); + + const sum = node.firstChild.firstChild.firstNamedChild; + assert.equal(sum.type, 'binary_expression'); + assert(sum.hasError); + assert(!sum.children[0].isMissing); + assert(!sum.children[1].isMissing); + assert(sum.children[2].isMissing); + }); + }); + + describe('.isExtra', () => { + it('returns true if the node is an extra node like comments', () => { + tree = parser.parse('foo(/* hi */);'); + const node = tree.rootNode; + const commentNode = node.descendantForIndex(7, 7); + + assert.equal(node.type, 'program'); + assert.equal(commentNode.type, 'comment'); + assert(!node.isExtra); + assert(commentNode.isExtra); + }); + }); + + describe('.text', () => { + const text = 'α0 / b👎c👎'; + + Object.entries({ + '.parse(String)': text, + '.parse(Function)': (offset) => text.slice(offset, 4), + }).forEach(([method, _parse]) => + it(`returns the text of a node generated by ${method}`, async () => { + const [numeratorSrc, denominatorSrc] = text.split(/\s*\/\s+/); + tree = await parser.parse(text); + const quotientNode = tree.rootNode.firstChild.firstChild; + const [numerator, slash, denominator] = quotientNode.children; + + assert.equal(text, tree.rootNode.text, 'root node text'); + assert.equal(denominatorSrc, denominator.text, 'denominator text'); + assert.equal(text, quotientNode.text, 'quotient text'); + assert.equal(numeratorSrc, numerator.text, 'numerator text'); + assert.equal('/', slash.text, '"/" text'); + }), + ); + }); + + describe('.descendantCount', () => { + it('returns the number of descendants', () => { + parser.setLanguage(JSON); + tree = parser.parse(JSON_EXAMPLE); + const valueNode = tree.rootNode; + const allNodes = getAllNodes(tree); + + assert.equal(valueNode.descendantCount, allNodes.length); + + const cursor = tree.walk(); + for (let i = 0; i < allNodes.length; i++) { + const node = allNodes[i]; + cursor.gotoDescendant(i); + assert.equal(cursor.currentNode.id, node.id, `index ${i}`); + } + + for (let i = allNodes.length - 1; i >= 0; i--) { + const node = allNodes[i]; + cursor.gotoDescendant(i); + assert.equal(cursor.currentNode.id, node.id, `rev index ${i}`); + } + }); + + it('tests a single node tree', () => { + parser.setLanguage(EmbeddedTemplate); + tree = parser.parse('hello'); + + const nodes = getAllNodes(tree); + assert.equal(nodes.length, 2); + assert.equal(tree.rootNode.descendantCount, 2); + + const cursor = tree.walk(); + + cursor.gotoDescendant(0); + assert.equal(cursor.currentDepth, 0); + assert.equal(cursor.currentNode.id, nodes[0].id); + + cursor.gotoDescendant(1); + assert.equal(cursor.currentDepth, 1); + assert.equal(cursor.currentNode.id, nodes[1].id); + }); + }); + + describe('.rootNodeWithOffset', () => { + it('returns the root node of the tree, offset by the given byte offset', () => { + tree = parser.parse(' if (a) b'); + const node = tree.rootNodeWithOffset(6, {row: 2, column: 2}); + assert.equal(node.startIndex, 8); + assert.equal(node.endIndex, 16); + assert.deepEqual(node.startPosition, {row: 2, column: 4}); + assert.deepEqual(node.endPosition, {row: 2, column: 12}); + + let child = node.firstChild.child(2); + assert.equal(child.type, 'expression_statement'); + assert.equal(child.startIndex, 15); + assert.equal(child.endIndex, 16); + assert.deepEqual(child.startPosition, {row: 2, column: 11}); + assert.deepEqual(child.endPosition, {row: 2, column: 12}); + + const cursor = node.walk(); + cursor.gotoFirstChild(); + cursor.gotoFirstChild(); + cursor.gotoNextSibling(); + child = cursor.currentNode; + assert.equal(child.type, 'parenthesized_expression'); + assert.equal(child.startIndex, 11); + assert.equal(child.endIndex, 14); + assert.deepEqual(child.startPosition, {row: 2, column: 7}); + assert.deepEqual(child.endPosition, {row: 2, column: 10}); + }); + }); + + describe('.parseState, .nextParseState', () => { + const text = '10 / 5'; + + it('returns node parse state ids', async () => { + tree = await parser.parse(text); + const quotientNode = tree.rootNode.firstChild.firstChild; + const [numerator, slash, denominator] = quotientNode.children; + + assert.equal(tree.rootNode.parseState, 0); + // parse states will change on any change to the grammar so test that it + // returns something instead + assert.isAbove(numerator.parseState, 0); + assert.isAbove(slash.parseState, 0); + assert.isAbove(denominator.parseState, 0); + }); + + it('returns next parse state equal to the language', async () => { + tree = await parser.parse(text); + const quotientNode = tree.rootNode.firstChild.firstChild; + quotientNode.children.forEach((node) => { + assert.equal( + node.nextParseState, + JavaScript.nextState(node.parseState, node.grammarId), + ); + }); + }); + }); + + describe('.descendantsOfType(type, min, max)', () => { + it('finds all of the descendants of the given type in the given range', () => { + tree = parser.parse('a + 1 * b * 2 + c + 3'); + const outerSum = tree.rootNode.firstChild.firstChild; + let descendants = outerSum.descendantsOfType('number', {row: 0, column: 2}, {row: 0, column: 15}); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [4, 12], + ); + assert.deepEqual( + descendants.map((node) => node.endPosition), + [{row: 0, column: 5}, {row: 0, column: 13}], + ); + + descendants = outerSum.descendantsOfType('identifier', {row: 0, column: 2}, {row: 0, column: 15}); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [8], + ); + + descendants = outerSum.descendantsOfType('identifier', {row: 0, column: 0}, {row: 0, column: 30}); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [0, 8, 16], + ); + + descendants = outerSum.descendantsOfType('number', {row: 0, column: 0}, {row: 0, column: 30}); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [4, 12, 20], + ); + + descendants = outerSum.descendantsOfType( + ['identifier', 'number'], + {row: 0, column: 0}, + {row: 0, column: 30}, + ); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [0, 4, 8, 12, 16, 20], + ); + + descendants = outerSum.descendantsOfType('number'); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [4, 12, 20], + ); + + descendants = outerSum.firstChild.descendantsOfType('number', {row: 0, column: 0}, {row: 0, column: 30}); + assert.deepEqual( + descendants.map((node) => node.startIndex), + [4, 12], + ); + }); + }); + + describe.skip('.closest(type)', () => { + it('returns the closest ancestor of the given type', () => { + tree = parser.parse('a(b + -d.e)'); + const property = tree.rootNode.descendantForIndex('a(b + -d.'.length); + assert.equal(property.type, 'property_identifier'); + + const unary = property.closest('unary_expression'); + assert.equal(unary.type, 'unary_expression'); + assert.equal(unary.startIndex, 'a(b + '.length); + assert.equal(unary.endIndex, 'a(b + -d.e'.length); + + const sum = property.closest(['binary_expression', 'call_expression']); + assert.equal(sum.type, 'binary_expression'); + assert.equal(sum.startIndex, 2); + assert.equal(sum.endIndex, 'a(b + -d.e'.length); + }); + + it('throws an exception when an invalid argument is given', () => { + tree = parser.parse('a + 1 * b * 2 + c + 3'); + const number = tree.rootNode.descendantForIndex(4); + + assert.throws(() => number.closest({a: 1}), /Argument must be a string or array of strings/); + }); + }); + + describe('.firstChildForIndex(index)', () => { + it('returns the first child that extends beyond the given index', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + + assert.equal('identifier', sumNode.firstChildForIndex(0).type); + assert.equal('identifier', sumNode.firstChildForIndex(1).type); + assert.equal('+', sumNode.firstChildForIndex(3).type); + assert.equal('number', sumNode.firstChildForIndex(5).type); + }); + }); + + describe('.firstNamedChildForIndex(index)', () => { + it('returns the first child that extends beyond the given index', () => { + tree = parser.parse('x10 + 1000'); + const sumNode = tree.rootNode.firstChild.firstChild; + + assert.equal('identifier', sumNode.firstNamedChildForIndex(0).type); + assert.equal('identifier', sumNode.firstNamedChildForIndex(1).type); + assert.equal('number', sumNode.firstNamedChildForIndex(3).type); + }); + }); + + describe('.equals(other)', () => { + it('returns true if the nodes are the same', () => { + tree = parser.parse('1 + 2'); + + const sumNode = tree.rootNode.firstChild.firstChild; + const node1 = sumNode.firstChild; + const node2 = sumNode.firstChild; + assert(node1.equals(node2)); + }); + + it('returns false if the nodes are not the same', () => { + tree = parser.parse('1 + 2'); + + const sumNode = tree.rootNode.firstChild.firstChild; + const node1 = sumNode.firstChild; + const node2 = node1.nextSibling; + assert(!node1.equals(node2)); + }); + }); + + describe('.fieldNameForChild(index)', () => { + it('returns the field of a child or null', () => { + tree = parser.parse('let a = 5'); + + const noField = tree.rootNode.fieldNameForChild(0); + const name = tree.rootNode.firstChild.children[1].fieldNameForChild(0); + const value = tree.rootNode.firstChild.children[1].fieldNameForChild(2); + const overflow = tree.rootNode.firstChild.children[1].fieldNameForChild(3); + + assert.equal(noField, null); + assert.equal(name, 'name'); + assert.equal(value, 'value'); + assert.equal(overflow, null); + }); + }); +}); diff --git a/lib/binding_web/test/node.test.ts b/lib/binding_web/test/node.test.ts deleted file mode 100644 index d89dc7e4..00000000 --- a/lib/binding_web/test/node.test.ts +++ /dev/null @@ -1,596 +0,0 @@ -import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest'; -import type { Language, Tree, Node } from '../src'; -import { Parser } from '../src'; -import helper from './helper'; - -let C: Language; -let JavaScript: Language; -let JSON: Language; -let EmbeddedTemplate: Language; -let Python: Language; - -const JSON_EXAMPLE = ` -[ - 123, - false, - { - "x": null - } -] -`; - -function getAllNodes(tree: Tree): Node[] { - const result: Node[] = []; - let visitedChildren = false; - const cursor = tree.walk(); - - while (true) { - if (!visitedChildren) { - result.push(cursor.currentNode); - if (!cursor.gotoFirstChild()) { - visitedChildren = true; - } - } else if (cursor.gotoNextSibling()) { - visitedChildren = false; - } else if (!cursor.gotoParent()) { - break; - } - } - return result; -} - -describe('Node', () => { - let parser: Parser; - let tree: Tree | null; - - beforeAll(async () => { - ({ C, EmbeddedTemplate, JavaScript, JSON, Python } = await helper); - }); - - beforeEach(() => { - tree = null; - parser = new Parser(); - parser.setLanguage(JavaScript); - }); - - afterEach(() => { - parser.delete(); - tree!.delete(); - }); - - describe('.children', () => { - it('returns an array of child nodes', () => { - tree = parser.parse('x10 + 1000')!; - expect(tree.rootNode.children).toHaveLength(1); - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(sumNode.children.map(child => child.type)).toEqual(['identifier', '+', 'number']); - }); - }); - - describe('.namedChildren', () => { - it('returns an array of named child nodes', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(tree.rootNode.namedChildren).toHaveLength(1); - expect(sumNode.namedChildren.map(child => child.type)).toEqual(['identifier', 'number']); - }); - }); - - describe('.childrenForFieldName', () => { - it('returns an array of child nodes for the given field name', () => { - parser.setLanguage(Python); - const source = ` - if one: - a() - elif two: - b() - elif three: - c() - elif four: - d()`; - - tree = parser.parse(source)!; - const node = tree.rootNode.firstChild!; - expect(node.type).toBe('if_statement'); - const alternatives = node.childrenForFieldName('alternative'); - const alternativeTexts = alternatives.map(n => { - const condition = n.childForFieldName('condition')!; - return source.slice(condition.startIndex, condition.endIndex); - }); - expect(alternativeTexts).toEqual(['two', 'three', 'four']); - }); - }); - - describe('.startIndex and .endIndex', () => { - it('returns the character index where the node starts/ends in the text', () => { - tree = parser.parse('a👍👎1 / b👎c👎')!; - const quotientNode = tree.rootNode.firstChild!.firstChild!; - - expect(quotientNode.startIndex).toBe(0); - expect(quotientNode.endIndex).toBe(15); - expect(quotientNode.children.map(child => child.startIndex)).toEqual([0, 7, 9]); - expect(quotientNode.children.map(child => child.endIndex)).toEqual([6, 8, 15]); - }); - }); - - describe('.startPosition and .endPosition', () => { - it('returns the row and column where the node starts/ends in the text', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(sumNode.type).toBe('binary_expression'); - - expect(sumNode.startPosition).toEqual({ row: 0, column: 0 }); - expect(sumNode.endPosition).toEqual({ row: 0, column: 10 }); - expect(sumNode.children.map((child) => child.startPosition)).toEqual([ - { row: 0, column: 0 }, - { row: 0, column: 4 }, - { row: 0, column: 6 }, - ]); - expect(sumNode.children.map((child) => child.endPosition)).toEqual([ - { row: 0, column: 3 }, - { row: 0, column: 5 }, - { row: 0, column: 10 }, - ]); - }); - - it('handles characters that occupy two UTF16 code units', () => { - tree = parser.parse('a👍👎1 /\n b👎c👎')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(sumNode.children.map(child => [child.startPosition, child.endPosition])).toEqual([ - [{ row: 0, column: 0 }, { row: 0, column: 6 }], - [{ row: 0, column: 7 }, { row: 0, column: 8 }], - [{ row: 1, column: 1 }, { row: 1, column: 7 }] - ]); - }); - }); - - describe('.parent', () => { - it('returns the node\'s parent', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!; - const variableNode = sumNode.firstChild!; - expect(sumNode.id).not.toBe(variableNode.id); - expect(sumNode.id).toBe(variableNode.parent!.id); - expect(tree.rootNode.id).toBe(sumNode.parent!.id); - }); - }); - - describe('.child(), .firstChild, .lastChild', () => { - it('returns null when the node has no children', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - const variableNode = sumNode.firstChild!; - expect(variableNode.firstChild).toBeNull(); - expect(variableNode.lastChild).toBeNull(); - expect(variableNode.firstNamedChild).toBeNull(); - expect(variableNode.lastNamedChild).toBeNull(); - expect(variableNode.child(1)).toBeNull(); - }); - }); - - describe('.childForFieldName()', () => { - it('returns node for the given field name', () => { - tree = parser.parse('class A { b() {} }')!; - - const classNode = tree.rootNode.firstChild!; - expect(classNode.type).toBe('class_declaration'); - - const classNameNode = classNode.childForFieldName('name')!; - expect(classNameNode.type).toBe('identifier'); - expect(classNameNode.text).toBe('A'); - - const bodyNode = classNode.childForFieldName('body')!; - expect(bodyNode.type).toBe('class_body'); - expect(bodyNode.text).toBe('{ b() {} }'); - - const methodNode = bodyNode.firstNamedChild!; - expect(methodNode.type).toBe('method_definition'); - expect(methodNode.text).toBe('b() {}'); - }); - }); - - describe('.childWithDescendant()', () => { - it('correctly retrieves immediate children', () => { - const sourceCode = 'let x = 1; console.log(x);'; - tree = parser.parse(sourceCode)!; - const root = tree.rootNode - const child = root.children[0].children[0] - const a = root.childWithDescendant(child) - expect(a!.startIndex).toBe(0) - const b = a!.childWithDescendant(child) - expect(b).toEqual(child) - const c = b!.childWithDescendant(child) - expect(c).toBeNull() - }); - }); - - describe('.nextSibling and .previousSibling', () => { - it('returns the node\'s next and previous sibling', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(sumNode.children[1].id).toBe(sumNode.children[0].nextSibling!.id); - expect(sumNode.children[2].id).toBe(sumNode.children[1].nextSibling!.id); - expect(sumNode.children[0].id).toBe(sumNode.children[1].previousSibling!.id); - expect(sumNode.children[1].id).toBe(sumNode.children[2].previousSibling!.id); - }); - }); - - describe('.nextNamedSibling and .previousNamedSibling', () => { - it('returns the node\'s next and previous named sibling', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(sumNode.namedChildren[1].id).toBe(sumNode.namedChildren[0].nextNamedSibling!.id); - expect(sumNode.namedChildren[0].id).toBe(sumNode.namedChildren[1].previousNamedSibling!.id); - }); - }); - - describe('.descendantForIndex(min, max)', () => { - it('returns the smallest node that spans the given range', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - expect(sumNode.descendantForIndex(1, 2)!.type).toBe('identifier'); - expect(sumNode.descendantForIndex(4, 4)!.type).toBe('+'); - - expect(() => { - // @ts-expect-error Testing invalid arguments - sumNode.descendantForIndex(1, {}); - }).toThrow('Arguments must be numbers'); - - expect(() => { - // @ts-expect-error Testing invalid arguments - sumNode.descendantForIndex(undefined); - }).toThrow('Arguments must be numbers'); - }); - }); - - describe('.namedDescendantForIndex', () => { - it('returns the smallest named node that spans the given range', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!; - expect(sumNode.descendantForIndex(1, 2)!.type).toBe('identifier'); - expect(sumNode.descendantForIndex(4, 4)!.type).toBe('+'); - }); - }); - - describe('.descendantForPosition', () => { - it('returns the smallest node that spans the given range', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!; - - expect(sumNode.descendantForPosition({ row: 0, column: 1 }, { row: 0, column: 2 })!.type).toBe('identifier'); - expect(sumNode.descendantForPosition({ row: 0, column: 4 })!.type).toBe('+'); - - expect(() => { - // @ts-expect-error Testing invalid arguments - sumNode.descendantForPosition(1, {}); - }).toThrow('Arguments must be {row, column} objects'); - - expect(() => { - // @ts-expect-error Testing invalid arguments - sumNode.descendantForPosition(undefined); - }).toThrow('Arguments must be {row, column} objects'); - }); - }); - - describe('.namedDescendantForPosition(min, max)', () => { - it('returns the smallest named node that spans the given range', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!; - - expect(sumNode.namedDescendantForPosition({ row: 0, column: 1 }, { row: 0, column: 2 })!.type).toBe('identifier') - expect(sumNode.namedDescendantForPosition({ row: 0, column: 4 })!.type).toBe('binary_expression'); - }); - }); - - describe('.hasError', () => { - it('returns true if the node contains an error', () => { - tree = parser.parse('1 + 2 * * 3')!; - const node = tree.rootNode; - expect(node.toString()).toBe( - '(program (expression_statement (binary_expression left: (number) right: (binary_expression left: (number) (ERROR) right: (number)))))' - ); - - const sum = node.firstChild!.firstChild!; - expect(sum.hasError).toBe(true); - expect(sum.children[0].hasError).toBe(false); - expect(sum.children[1].hasError).toBe(false); - expect(sum.children[2].hasError).toBe(true); - }); - }); - - describe('.isError', () => { - it('returns true if the node is an error', () => { - tree = parser.parse('2 * * 3')!; - const node = tree.rootNode; - expect(node.toString()).toBe( - '(program (expression_statement (binary_expression left: (number) (ERROR) right: (number))))' - ); - - const multi = node.firstChild!.firstChild!; - expect(multi.hasError).toBe(true); - expect(multi.children[0].isError).toBe(false); - expect(multi.children[1].isError).toBe(false); - expect(multi.children[2].isError).toBe(true); - expect(multi.children[3].isError).toBe(false); - }); - }); - - describe('.isMissing', () => { - it('returns true if the node was inserted via error recovery', () => { - tree = parser.parse('(2 ||)')!; - const node = tree.rootNode; - expect(node.toString()).toBe( - '(program (expression_statement (parenthesized_expression (binary_expression left: (number) right: (MISSING identifier)))))' - ); - - const sum = node.firstChild!.firstChild!.firstNamedChild!; - expect(sum.type).toBe('binary_expression'); - expect(sum.hasError).toBe(true); - expect(sum.children[0].isMissing).toBe(false); - expect(sum.children[1].isMissing).toBe(false); - expect(sum.children[2].isMissing).toBe(true); - }); - }); - - describe('.isExtra', () => { - it('returns true if the node is an extra node like comments', () => { - tree = parser.parse('foo(/* hi */);')!; - const node = tree.rootNode; - const commentNode = node.descendantForIndex(7, 7)!; - - expect(node.type).toBe('program'); - expect(commentNode.type).toBe('comment'); - expect(node.isExtra).toBe(false); - expect(commentNode.isExtra).toBe(true); - }); - }); - - describe('.text', () => { - const text = 'α0 / b👎c👎'; - - Object.entries({ - '.parse(String)': text, - '.parse(Function)': (offset: number) => text.slice(offset, offset + 4), - }).forEach(([method, _parse]) => { - it(`returns the text of a node generated by ${method}`, () => { - const [numeratorSrc, denominatorSrc] = text.split(/\s*\/\s+/); - tree = parser.parse(_parse)!; - const quotientNode = tree.rootNode.firstChild!.firstChild!; - const [numerator, slash, denominator] = quotientNode.children; - - expect(tree.rootNode.text).toBe(text); - expect(denominator.text).toBe(denominatorSrc); - expect(quotientNode.text).toBe(text); - expect(numerator.text).toBe(numeratorSrc); - expect(slash.text).toBe('/'); - }); - }); - }); - - describe('.descendantCount', () => { - it('returns the number of descendants', () => { - parser.setLanguage(JSON); - tree = parser.parse(JSON_EXAMPLE)!; - const valueNode = tree.rootNode; - const allNodes = getAllNodes(tree); - - expect(valueNode.descendantCount).toBe(allNodes.length); - - const cursor = tree.walk(); - for (let i = 0; i < allNodes.length; i++) { - const node = allNodes[i]; - cursor.gotoDescendant(i); - expect(cursor.currentNode.id).toBe(node.id); - } - - for (let i = allNodes.length - 1; i >= 0; i--) { - const node = allNodes[i]; - cursor.gotoDescendant(i); - expect(cursor.currentNode.id).toBe(node.id); - } - }); - - it('tests a single node tree', () => { - parser.setLanguage(EmbeddedTemplate); - tree = parser.parse('hello')!; - - const nodes = getAllNodes(tree); - expect(nodes).toHaveLength(2); - expect(tree.rootNode.descendantCount).toBe(2); - - const cursor = tree.walk(); - - cursor.gotoDescendant(0); - expect(cursor.currentDepth).toBe(0); - expect(cursor.currentNode.id).toBe(nodes[0].id); - - cursor.gotoDescendant(1); - expect(cursor.currentDepth).toBe(1); - expect(cursor.currentNode.id).toBe(nodes[1].id); - }); - }); - - describe('.rootNodeWithOffset', () => { - it('returns the root node of the tree, offset by the given byte offset', () => { - tree = parser.parse(' if (a) b')!; - const node = tree.rootNodeWithOffset(6, { row: 2, column: 2 }); - expect(node.startIndex).toBe(8); - expect(node.endIndex).toBe(16); - expect(node.startPosition).toEqual({ row: 2, column: 4 }); - expect(node.endPosition).toEqual({ row: 2, column: 12 }); - - let child = node.firstChild!.child(2)!; - expect(child.type).toBe('expression_statement'); - expect(child.startIndex).toBe(15); - expect(child.endIndex).toBe(16); - expect(child.startPosition).toEqual({ row: 2, column: 11 }); - expect(child.endPosition).toEqual({ row: 2, column: 12 }); - - const cursor = node.walk(); - cursor.gotoFirstChild(); - cursor.gotoFirstChild(); - cursor.gotoNextSibling(); - child = cursor.currentNode; - expect(child.type).toBe('parenthesized_expression'); - expect(child.startIndex).toBe(11); - expect(child.endIndex).toBe(14); - expect(child.startPosition).toEqual({ row: 2, column: 7 }); - expect(child.endPosition).toEqual({ row: 2, column: 10 }); - }); - }); - - describe('.parseState, .nextParseState', () => { - const text = '10 / 5'; - - it('returns node parse state ids', () => { - tree = parser.parse(text)!; - const quotientNode = tree.rootNode.firstChild!.firstChild!; - const [numerator, slash, denominator] = quotientNode.children; - - expect(tree.rootNode.parseState).toBe(0); - // parse states will change on any change to the grammar so test that it - // returns something instead - expect(numerator.parseState).toBeGreaterThan(0); - expect(slash.parseState).toBeGreaterThan(0); - expect(denominator.parseState).toBeGreaterThan(0); - }); - - it('returns next parse state equal to the language', () => { - tree = parser.parse(text)!; - const quotientNode = tree.rootNode.firstChild!.firstChild!; - quotientNode.children.forEach((node) => { - expect(node.nextParseState).toBe(JavaScript.nextState(node.parseState, node.grammarId)); - }); - }); - }); - - describe('.descendantsOfType("ERROR")', () => { - it('finds all of the descendants of an ERROR node', () => { - tree = parser.parse( - `if ({a: 'b'} {c: 'd'}) { - // ^ ERROR - x = function(a) { b; } function(c) { d; } - }` - )!; - const errorNode = tree.rootNode; - const descendants = errorNode.descendantsOfType('ERROR'); - expect( - descendants.map((node) => node.startIndex) - ).toEqual( - [4] - ); - }); - }); - - describe('.descendantsOfType', () => { - it('finds all descendants of a given type in the given range', () => { - tree = parser.parse('a + 1 * b * 2 + c + 3')!; - const outerSum = tree.rootNode.firstChild!.firstChild!; - - const descendants = outerSum.descendantsOfType('number', { row: 0, column: 2 }, { row: 0, column: 15 }); - expect(descendants.map(node => node.startIndex)).toEqual([4, 12]); - expect(descendants.map(node => node.endPosition)).toEqual([{ row: 0, column: 5 }, { row: 0, column: 13 }]); - }); - }); - - - - describe('.firstChildForIndex(index)', () => { - it('returns the first child that contains or starts after the given index', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - - expect(sumNode.firstChildForIndex(0)!.type).toBe('identifier'); - expect(sumNode.firstChildForIndex(1)!.type).toBe('identifier'); - expect(sumNode.firstChildForIndex(3)!.type).toBe('+'); - expect(sumNode.firstChildForIndex(5)!.type).toBe('number'); - }); - }); - - describe('.firstNamedChildForIndex(index)', () => { - it('returns the first child that contains or starts after the given index', () => { - tree = parser.parse('x10 + 1000')!; - const sumNode = tree.rootNode.firstChild!.firstChild!; - - expect(sumNode.firstNamedChildForIndex(0)!.type).toBe('identifier'); - expect(sumNode.firstNamedChildForIndex(1)!.type).toBe('identifier'); - expect(sumNode.firstNamedChildForIndex(3)!.type).toBe('number'); - }); - }); - - describe('.equals(other)', () => { - it('returns true if the nodes are the same', () => { - tree = parser.parse('1 + 2')!; - - const sumNode = tree.rootNode.firstChild!.firstChild!; - const node1 = sumNode.firstChild!; - const node2 = sumNode.firstChild!; - expect(node1.equals(node2)).toBe(true); - }); - - it('returns false if the nodes are not the same', () => { - tree = parser.parse('1 + 2')!; - - const sumNode = tree.rootNode.firstChild!.firstChild!; - const node1 = sumNode.firstChild!; - const node2 = node1.nextSibling!; - expect(node1.equals(node2)).toBe(false); - }); - }); - - describe('.fieldNameForChild(index)', () => { - it('returns the field of a child or null', () => { - parser.setLanguage(C); - tree = parser.parse('int w = x + /* y is special! */ y;')!; - - const translationUnitNode = tree.rootNode; - const declarationNode = translationUnitNode.firstChild; - const binaryExpressionNode = declarationNode! - .childForFieldName('declarator')! - .childForFieldName('value')!; - - // ------------------- - // left: (identifier) 0 - // operator: "+" 1 <--- (not a named child) - // (comment) 2 <--- (is an extra) - // right: (identifier) 3 - // ------------------- - - expect(binaryExpressionNode.fieldNameForChild(0)).toBe('left'); - expect(binaryExpressionNode.fieldNameForChild(1)).toBe('operator'); - // The comment should not have a field name, as it's just an extra - expect(binaryExpressionNode.fieldNameForChild(2)).toBeNull(); - expect(binaryExpressionNode.fieldNameForChild(3)).toBe('right'); - // Negative test - Not a valid child index - expect(binaryExpressionNode.fieldNameForChild(4)).toBeNull(); - }); - }); - - describe('.fieldNameForNamedChild(index)', () => { - it('returns the field of a named child or null', () => { - parser.setLanguage(C); - tree = parser.parse('int w = x + /* y is special! */ y;')!; - - const translationUnitNode = tree.rootNode; - const declarationNode = translationUnitNode.firstNamedChild; - const binaryExpressionNode = declarationNode! - .childForFieldName('declarator')! - .childForFieldName('value')!; - - // ------------------- - // left: (identifier) 0 - // operator: "+" _ <--- (not a named child) - // (comment) 1 <--- (is an extra) - // right: (identifier) 2 - // ------------------- - - expect(binaryExpressionNode.fieldNameForNamedChild(0)).toBe('left'); - // The comment should not have a field name, as it's just an extra - expect(binaryExpressionNode.fieldNameForNamedChild(1)).toBeNull(); - // The operator is not a named child, so the named child at index 2 is the right child - expect(binaryExpressionNode.fieldNameForNamedChild(2)).toBe('right'); - // Negative test - Not a valid child index - expect(binaryExpressionNode.fieldNameForNamedChild(3)).toBeNull(); - }); - }); -}); diff --git a/lib/binding_web/test/parser-test.js b/lib/binding_web/test/parser-test.js new file mode 100644 index 00000000..4c58d020 --- /dev/null +++ b/lib/binding_web/test/parser-test.js @@ -0,0 +1,392 @@ +const {assert} = require('chai'); +let Parser; let JavaScript; let HTML; let languageURL; + +describe('Parser', () => { + let parser; + + before(async () => + ({Parser, JavaScript, HTML, languageURL} = await require('./helper')), + ); + + beforeEach(() => { + parser = new Parser(); + }); + + afterEach(() => { + parser.delete(); + }); + + describe('.setLanguage', () => { + it('allows setting the language to null', () => { + assert.equal(parser.getLanguage(), null); + parser.setLanguage(JavaScript); + assert.equal(parser.getLanguage(), JavaScript); + parser.setLanguage(null); + assert.equal(parser.getLanguage(), null); + }); + + it('throws an exception when the given object is not a tree-sitter language', () => { + assert.throws(() => parser.setLanguage({}), /Argument must be a Language/); + assert.throws(() => parser.setLanguage(1), /Argument must be a Language/); + }); + }); + + describe('.setLogger', () => { + beforeEach(() => { + parser.setLanguage(JavaScript); + }); + + it('calls the given callback for each parse event', () => { + const debugMessages = []; + parser.setLogger((message) => debugMessages.push(message)); + parser.parse('a + b + c'); + assert.includeMembers(debugMessages, [ + 'skip character:\' \'', + 'consume character:\'b\'', + 'reduce sym:program, child_count:1', + 'accept', + ]); + }); + + it('allows the callback to be retrieved later', () => { + const callback = () => {}; + parser.setLogger(callback); + assert.equal(parser.getLogger(), callback); + parser.setLogger(false); + assert.equal(parser.getLogger(), null); + }); + + it('disables debugging when given a falsy value', () => { + const debugMessages = []; + parser.setLogger((message) => debugMessages.push(message)); + parser.setLogger(false); + parser.parse('a + b * c'); + assert.equal(debugMessages.length, 0); + }); + + it('throws an error when given a truthy value that isn\'t a function ', () => { + assert.throws( + () => parser.setLogger('5'), + 'Logger callback must be a function', + ); + }); + + it('rethrows errors thrown by the logging callback', () => { + const error = new Error('The error message'); + parser.setLogger((_msg, _params) => { + throw error; + }); + assert.throws( + () => parser.parse('ok;'), + 'The error message', + ); + }); + }); + + describe('one included range', () => { + it('parses the text within a range', () => { + parser.setLanguage(HTML); + const sourceCode = 'hi'; + const htmlTree = parser.parse(sourceCode); + const scriptContentNode = htmlTree.rootNode.child(1).child(1); + assert.equal(scriptContentNode.type, 'raw_text'); + + parser.setLanguage(JavaScript); + assert.deepEqual(parser.getIncludedRanges(), [{ + startIndex: 0, + endIndex: 2147483647, + startPosition: {row: 0, column: 0}, + endPosition: {row: 4294967295, column: 2147483647}, + }]); + const ranges = [{ + startIndex: scriptContentNode.startIndex, + endIndex: scriptContentNode.endIndex, + startPosition: scriptContentNode.startPosition, + endPosition: scriptContentNode.endPosition, + }]; + const jsTree = parser.parse( + sourceCode, + null, + {includedRanges: ranges}, + ); + assert.deepEqual(parser.getIncludedRanges(), ranges); + + assert.equal( + jsTree.rootNode.toString(), + '(program (expression_statement (call_expression ' + + 'function: (member_expression object: (identifier) property: (property_identifier)) ' + + 'arguments: (arguments (string (string_fragment))))))', + ); + assert.deepEqual(jsTree.rootNode.startPosition, {row: 0, column: sourceCode.indexOf('console')}); + }); + }); + + describe('multiple included ranges', () => { + it('parses the text within multiple ranges', () => { + parser.setLanguage(JavaScript); + const sourceCode = 'html `
Hello, ${name.toUpperCase()}, it\'s ${now()}.
`'; + const jsTree = parser.parse(sourceCode); + const templateStringNode = jsTree.rootNode.descendantForIndex(sourceCode.indexOf('`<'), sourceCode.indexOf('>`')); + assert.equal(templateStringNode.type, 'template_string'); + + const openQuoteNode = templateStringNode.child(0); + const interpolationNode1 = templateStringNode.child(2); + const interpolationNode2 = templateStringNode.child(4); + const closeQuoteNode = templateStringNode.child(6); + + parser.setLanguage(HTML); + const htmlRanges = [ + { + startIndex: openQuoteNode.endIndex, + startPosition: openQuoteNode.endPosition, + endIndex: interpolationNode1.startIndex, + endPosition: interpolationNode1.startPosition, + }, + { + startIndex: interpolationNode1.endIndex, + startPosition: interpolationNode1.endPosition, + endIndex: interpolationNode2.startIndex, + endPosition: interpolationNode2.startPosition, + }, + { + startIndex: interpolationNode2.endIndex, + startPosition: interpolationNode2.endPosition, + endIndex: closeQuoteNode.startIndex, + endPosition: closeQuoteNode.startPosition, + }, + ]; + const htmlTree = parser.parse(sourceCode, null, {includedRanges: htmlRanges}); + + assert.equal( + htmlTree.rootNode.toString(), + '(document (element' + + ' (start_tag (tag_name))' + + ' (text)' + + ' (element (start_tag (tag_name)) (end_tag (tag_name)))' + + ' (text)' + + ' (end_tag (tag_name))))', + ); + assert.deepEqual(htmlTree.getIncludedRanges(), htmlRanges); + + const divElementNode = htmlTree.rootNode.child(0); + const helloTextNode = divElementNode.child(1); + const bElementNode = divElementNode.child(2); + const bStartTagNode = bElementNode.child(0); + const bEndTagNode = bElementNode.child(1); + + assert.equal(helloTextNode.type, 'text'); + assert.equal(helloTextNode.startIndex, sourceCode.indexOf('Hello')); + assert.equal(helloTextNode.endIndex, sourceCode.indexOf(' ')); + + assert.equal(bStartTagNode.type, 'start_tag'); + assert.equal(bStartTagNode.startIndex, sourceCode.indexOf('')); + assert.equal(bStartTagNode.endIndex, sourceCode.indexOf('${now()}')); + + assert.equal(bEndTagNode.type, 'end_tag'); + assert.equal(bEndTagNode.startIndex, sourceCode.indexOf('')); + assert.equal(bEndTagNode.endIndex, sourceCode.indexOf('.')); + }); + }); + + describe('an included range containing mismatched positions', () => { + it('parses the text within the range', () => { + const sourceCode = '
test
{_ignore_this_part_}'; + + parser.setLanguage(HTML); + + const endIndex = sourceCode.indexOf('{_ignore_this_part_'); + + const rangeToParse = { + startIndex: 0, + startPosition: {row: 10, column: 12}, + endIndex, + endPosition: {row: 10, column: 12 + endIndex}, + }; + + const htmlTree = parser.parse(sourceCode, null, {includedRanges: [rangeToParse]}); + + assert.deepEqual(htmlTree.getIncludedRanges()[0], rangeToParse); + + assert.equal( + htmlTree.rootNode.toString(), + '(document (element (start_tag (tag_name)) (text) (end_tag (tag_name))))', + ); + }); + }); + + describe('.parse', () => { + let tree; + + beforeEach(() => { + tree = null; + parser.setLanguage(JavaScript); + }); + + afterEach(() => { + if (tree) tree.delete(); + }); + + it('reads from the given input', () => { + const parts = ['first', '_', 'second', '_', 'third']; + tree = parser.parse(() => parts.shift()); + assert.equal(tree.rootNode.toString(), '(program (expression_statement (identifier)))'); + }); + + it('stops reading when the input callback return something that\'s not a string', () => { + const parts = ['abc', 'def', 'ghi', {}, {}, {}, 'second-word', ' ']; + tree = parser.parse(() => parts.shift()); + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (identifier)))', + ); + assert.equal(tree.rootNode.endIndex, 9); + assert.equal(parts.length, 2); + }); + + it('throws an exception when the given input is not a function', () => { + assert.throws(() => parser.parse(null), 'Argument must be a string or a function'); + assert.throws(() => parser.parse(5), 'Argument must be a string or a function'); + assert.throws(() => parser.parse({}), 'Argument must be a string or a function'); + }); + + it('handles long input strings', () => { + const repeatCount = 10000; + const inputString = `[${Array(repeatCount).fill('0').join(',')}]`; + + tree = parser.parse(inputString); + assert.equal(tree.rootNode.type, 'program'); + assert.equal(tree.rootNode.firstChild.firstChild.namedChildCount, repeatCount); + }).timeout(5000); + + it('can use the bash parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('bash'))); + tree = parser.parse('FOO=bar echo < err.txt > hello.txt \nhello${FOO}\nEOF'); + assert.equal( + tree.rootNode.toString(), + '(program ' + + '(redirected_statement ' + + 'body: (command ' + + '(variable_assignment name: (variable_name) value: (word)) ' + + 'name: (command_name (word))) ' + + 'redirect: (heredoc_redirect (heredoc_start) ' + + 'redirect: (file_redirect descriptor: (file_descriptor) destination: (word)) ' + + 'redirect: (file_redirect destination: (word)) ' + + '(heredoc_body ' + + '(expansion (variable_name)) (heredoc_content)) (heredoc_end))))', + ); + }).timeout(5000); + + it('can use the c++ parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('cpp'))); + tree = parser.parse('const char *s = R"EOF(HELLO WORLD)EOF";'); + assert.equal( + tree.rootNode.toString(), + '(translation_unit (declaration ' + + '(type_qualifier) ' + + 'type: (primitive_type) ' + + 'declarator: (init_declarator ' + + 'declarator: (pointer_declarator declarator: (identifier)) ' + + 'value: (raw_string_literal delimiter: (raw_string_delimiter) (raw_string_content) (raw_string_delimiter)))))', + ); + }).timeout(5000); + + it('can use the HTML parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('html'))); + tree = parser.parse('
'); + assert.equal( + tree.rootNode.toString(), + '(document (element (start_tag (tag_name)) (element (start_tag (tag_name)) (element (start_tag (tag_name)) (end_tag (tag_name))) (end_tag (tag_name))) (end_tag (tag_name))))', + ); + }).timeout(5000); + + it('can use the python parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('python'))); + tree = parser.parse('class A:\n def b():\n c()'); + assert.equal( + tree.rootNode.toString(), + '(module (class_definition ' + + 'name: (identifier) ' + + 'body: (block ' + + '(function_definition ' + + 'name: (identifier) ' + + 'parameters: (parameters) ' + + 'body: (block (expression_statement (call ' + + 'function: (identifier) ' + + 'arguments: (argument_list))))))))', + ); + }).timeout(5000); + + it('can use the rust parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('rust'))); + tree = parser.parse('const x: &\'static str = r###"hello"###;'); + assert.equal( + tree.rootNode.toString(), + '(source_file (const_item ' + + 'name: (identifier) ' + + 'type: (reference_type (lifetime (identifier)) type: (primitive_type)) ' + + 'value: (raw_string_literal (string_content))))', + ); + }).timeout(5000); + + it('can use the typescript parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('typescript'))); + tree = parser.parse('a()\nb()\n[c]'); + assert.equal( + tree.rootNode.toString(), + '(program ' + + '(expression_statement (call_expression function: (identifier) arguments: (arguments))) ' + + '(expression_statement (subscript_expression ' + + 'object: (call_expression ' + + 'function: (identifier) ' + + 'arguments: (arguments)) ' + + 'index: (identifier))))', + ); + }).timeout(5000); + + it('can use the tsx parser', async () => { + parser.setLanguage(await Parser.Language.load(languageURL('tsx'))); + tree = parser.parse('a()\nb()\n[c]'); + assert.equal( + tree.rootNode.toString(), + '(program ' + + '(expression_statement (call_expression function: (identifier) arguments: (arguments))) ' + + '(expression_statement (subscript_expression ' + + 'object: (call_expression ' + + 'function: (identifier) ' + + 'arguments: (arguments)) ' + + 'index: (identifier))))', + ); + }).timeout(5000); + + it('parses only the text within the `includedRanges` if they are specified', () => { + const sourceCode = '<% foo() %> <% bar %>'; + + const start1 = sourceCode.indexOf('foo'); + const end1 = start1 + 5; + const start2 = sourceCode.indexOf('bar'); + const end2 = start2 + 3; + + const tree = parser.parse(sourceCode, null, { + includedRanges: [ + { + startIndex: start1, + endIndex: end1, + startPosition: {row: 0, column: start1}, + endPosition: {row: 0, column: end1}, + }, + { + startIndex: start2, + endIndex: end2, + startPosition: {row: 0, column: start2}, + endPosition: {row: 0, column: end2}, + }, + ], + }); + + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (call_expression function: (identifier) arguments: (arguments))) (expression_statement (identifier)))', + ); + }); + }); +}); diff --git a/lib/binding_web/test/parser.test.ts b/lib/binding_web/test/parser.test.ts deleted file mode 100644 index 7d859827..00000000 --- a/lib/binding_web/test/parser.test.ts +++ /dev/null @@ -1,446 +0,0 @@ -import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest'; -import helper, { type LanguageName } from './helper'; -import type { ParseState, Tree } from '../src'; -import { Parser, Language } from '../src'; - -let JavaScript: Language; -let HTML: Language; -let JSON: Language; -let languageURL: (name: LanguageName) => string; - -describe('Parser', () => { - let parser: Parser; - - beforeAll(async () => { - ({ JavaScript, HTML, JSON, languageURL } = await helper); - }); - - beforeEach(() => { - parser = new Parser(); - }); - - afterEach(() => { - parser.delete(); - }); - - describe('.setLanguage', () => { - it('allows setting the language to null', () => { - expect(parser.language).toBeNull(); - parser.setLanguage(JavaScript); - expect(parser.language).toBe(JavaScript); - parser.setLanguage(null); - expect(parser.language).toBeNull(); - }); - - it('throws an exception when the given object is not a tree-sitter language', () => { - // @ts-expect-error Testing invalid arguments - expect(() => { parser.setLanguage({}); }).toThrow(/Argument must be a Language/); - // @ts-expect-error Testing invalid arguments - expect(() => { parser.setLanguage(1); }).toThrow(/Argument must be a Language/); - }); - }); - - describe('.setLogger', () => { - beforeEach(() => { - parser.setLanguage(JavaScript); - }); - - it('calls the given callback for each parse event', () => { - const debugMessages: string[] = []; - parser.setLogger((message) => debugMessages.push(message)); - parser.parse('a + b + c')!; - expect(debugMessages).toEqual(expect.arrayContaining([ - 'skip character:\' \'', - 'consume character:\'b\'', - 'reduce sym:program, child_count:1', - 'accept' - ])); - }); - - it('allows the callback to be retrieved later', () => { - const callback = () => { return; }; - parser.setLogger(callback); - expect(parser.getLogger()).toBe(callback); - parser.setLogger(false); - expect(parser.getLogger()).toBeNull(); - }); - - it('disables debugging when given a falsy value', () => { - const debugMessages: string[] = []; - parser.setLogger((message) => debugMessages.push(message)); - parser.setLogger(false); - parser.parse('a + b * c')!; - expect(debugMessages).toHaveLength(0); - }); - - it('throws an error when given a truthy value that isn\'t a function', () => { - // @ts-expect-error Testing invalid arguments - expect(() => { parser.setLogger('5'); }).toThrow('Logger callback must be a function'); - }); - - it('rethrows errors thrown by the logging callback', () => { - const error = new Error('The error message'); - parser.setLogger(() => { - throw error; - }); - expect(() => parser.parse('ok;')).toThrow('The error message'); - }); - }); - - describe('one included range', () => { - it('parses the text within a range', () => { - parser.setLanguage(HTML); - const sourceCode = 'hi'; - const htmlTree = parser.parse(sourceCode)!; - const scriptContentNode = htmlTree.rootNode.child(1)!.child(1)!; - expect(scriptContentNode.type).toBe('raw_text'); - - parser.setLanguage(JavaScript); - expect(parser.getIncludedRanges()).toEqual([{ - startIndex: 0, - endIndex: 2147483647, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 4294967295, column: 2147483647 } - }]); - - const ranges = [{ - startIndex: scriptContentNode.startIndex, - endIndex: scriptContentNode.endIndex, - startPosition: scriptContentNode.startPosition, - endPosition: scriptContentNode.endPosition, - }]; - - const jsTree = parser.parse( - sourceCode, - null, - { includedRanges: ranges } - )!; - expect(parser.getIncludedRanges()).toEqual(ranges); - - expect(jsTree.rootNode.toString()).toBe( - '(program (expression_statement (call_expression ' + - 'function: (member_expression object: (identifier) property: (property_identifier)) ' + - 'arguments: (arguments (string (string_fragment))))))' - ); - expect(jsTree.rootNode.startPosition).toEqual({ row: 0, column: sourceCode.indexOf('console') }); - }); - }); - - describe('multiple included ranges', () => { - it('parses the text within multiple ranges', () => { - parser.setLanguage(JavaScript); - const sourceCode = 'html `
Hello, ${name.toUpperCase()}, it\'s ${now()}.
`'; - const jsTree = parser.parse(sourceCode)!; - const templateStringNode = jsTree.rootNode.descendantForIndex( - sourceCode.indexOf('`<'), - sourceCode.indexOf('>`') - )!; - expect(templateStringNode.type).toBe('template_string'); - - const openQuoteNode = templateStringNode.child(0)!; - const interpolationNode1 = templateStringNode.child(2)!; - const interpolationNode2 = templateStringNode.child(4)!; - const closeQuoteNode = templateStringNode.child(6)!; - - parser.setLanguage(HTML); - const htmlRanges = [ - { - startIndex: openQuoteNode.endIndex, - startPosition: openQuoteNode.endPosition, - endIndex: interpolationNode1.startIndex, - endPosition: interpolationNode1.startPosition, - }, - { - startIndex: interpolationNode1.endIndex, - startPosition: interpolationNode1.endPosition, - endIndex: interpolationNode2.startIndex, - endPosition: interpolationNode2.startPosition, - }, - { - startIndex: interpolationNode2.endIndex, - startPosition: interpolationNode2.endPosition, - endIndex: closeQuoteNode.startIndex, - endPosition: closeQuoteNode.startPosition, - }, - ]; - - const htmlTree = parser.parse(sourceCode, null, { includedRanges: htmlRanges })!; - - expect(htmlTree.rootNode.toString()).toBe( - '(document (element' + - ' (start_tag (tag_name))' + - ' (text)' + - ' (element (start_tag (tag_name)) (end_tag (tag_name)))' + - ' (text)' + - ' (end_tag (tag_name))))' - ); - expect(htmlTree.getIncludedRanges()).toEqual(htmlRanges); - - const divElementNode = htmlTree.rootNode.child(0)!; - const helloTextNode = divElementNode.child(1)!; - const bElementNode = divElementNode.child(2)!; - const bStartTagNode = bElementNode.child(0)!; - const bEndTagNode = bElementNode.child(1)!; - - expect(helloTextNode.type).toBe('text'); - expect(helloTextNode.startIndex).toBe(sourceCode.indexOf('Hello')); - expect(helloTextNode.endIndex).toBe(sourceCode.indexOf(' ')); - - expect(bStartTagNode.type).toBe('start_tag'); - expect(bStartTagNode.startIndex).toBe(sourceCode.indexOf('')); - expect(bStartTagNode.endIndex).toBe(sourceCode.indexOf('${now()}')); - - expect(bEndTagNode.type).toBe('end_tag'); - expect(bEndTagNode.startIndex).toBe(sourceCode.indexOf('')); - expect(bEndTagNode.endIndex).toBe(sourceCode.indexOf('.')); - }); - }); - - describe('an included range containing mismatched positions', () => { - it('parses the text within the range', () => { - const sourceCode = '
test
{_ignore_this_part_}'; - - parser.setLanguage(HTML); - - const endIndex = sourceCode.indexOf('{_ignore_this_part_'); - - const rangeToParse = { - startIndex: 0, - startPosition: { row: 10, column: 12 }, - endIndex, - endPosition: { row: 10, column: 12 + endIndex }, - }; - - const htmlTree = parser.parse(sourceCode, null, { includedRanges: [rangeToParse] })!; - - expect(htmlTree.getIncludedRanges()[0]).toEqual(rangeToParse); - - expect(htmlTree.rootNode.toString()).toBe( - '(document (element (start_tag (tag_name)) (text) (end_tag (tag_name))))' - ); - }); - }); - - describe('.parse', () => { - let tree: Tree | null; - - beforeEach(() => { - tree = null; - parser.setLanguage(JavaScript); - }); - - afterEach(() => { - if (tree) tree.delete(); - }); - - it('reads from the given input', () => { - const parts = ['first', '_', 'second', '_', 'third']; - tree = parser.parse(() => parts.shift())!; - expect(tree.rootNode.toString()).toBe('(program (expression_statement (identifier)))'); - }); - - it('stops reading when the input callback returns something that\'s not a string', () => { - const parts = ['abc', 'def', 'ghi', {}, {}, {}, 'second-word', ' ']; - tree = parser.parse(() => parts.shift() as string)!; - expect(tree.rootNode.toString()).toBe('(program (expression_statement (identifier)))'); - expect(tree.rootNode.endIndex).toBe(9); - expect(parts).toHaveLength(2); - }); - - it('throws an exception when the given input is not a function', () => { - // @ts-expect-error Testing invalid arguments - expect(() => parser.parse(null)).toThrow('Argument must be a string or a function'); - // @ts-expect-error Testing invalid arguments - expect(() => parser.parse(5)).toThrow('Argument must be a string or a function'); - // @ts-expect-error Testing invalid arguments - expect(() => parser.parse({})).toThrow('Argument must be a string or a function'); - }); - - it('handles long input strings', { timeout: 10000 }, () => { - const repeatCount = 10000; - const inputString = `[${Array(repeatCount).fill('0').join(',')}]`; - - tree = parser.parse(inputString)!; - expect(tree.rootNode.type).toBe('program'); - expect(tree.rootNode.firstChild!.firstChild!.namedChildCount).toBe(repeatCount); - }); - - it('can use the bash parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('bash'))); - tree = parser.parse('FOO=bar echo < err.txt > hello.txt \nhello${FOO}\nEOF')!; - expect(tree.rootNode.toString()).toBe( - '(program ' + - '(redirected_statement ' + - 'body: (command ' + - '(variable_assignment name: (variable_name) value: (word)) ' + - 'name: (command_name (word))) ' + - 'redirect: (heredoc_redirect (heredoc_start) ' + - 'redirect: (file_redirect descriptor: (file_descriptor) destination: (word)) ' + - 'redirect: (file_redirect destination: (word)) ' + - '(heredoc_body ' + - '(expansion (variable_name)) (heredoc_content)) (heredoc_end))))' - ); - }); - - it('can use the c++ parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('cpp'))); - tree = parser.parse('const char *s = R"EOF(HELLO WORLD)EOF";')!; - expect(tree.rootNode.toString()).toBe( - '(translation_unit (declaration ' + - '(type_qualifier) ' + - 'type: (primitive_type) ' + - 'declarator: (init_declarator ' + - 'declarator: (pointer_declarator declarator: (identifier)) ' + - 'value: (raw_string_literal delimiter: (raw_string_delimiter) (raw_string_content) (raw_string_delimiter)))))' - ); - }); - - it('can use the HTML parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('html'))); - tree = parser.parse('
')!; - expect(tree.rootNode.toString()).toBe( - '(document (element (start_tag (tag_name)) (element (start_tag (tag_name)) ' + - '(element (start_tag (tag_name)) (end_tag (tag_name))) (end_tag (tag_name))) (end_tag (tag_name))))' - ); - }); - - it('can use the python parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('python'))); - tree = parser.parse('class A:\n def b():\n c()')!; - expect(tree.rootNode.toString()).toBe( - '(module (class_definition ' + - 'name: (identifier) ' + - 'body: (block ' + - '(function_definition ' + - 'name: (identifier) ' + - 'parameters: (parameters) ' + - 'body: (block (expression_statement (call ' + - 'function: (identifier) ' + - 'arguments: (argument_list))))))))' - ); - }); - - it('can use the rust parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('rust'))); - tree = parser.parse('const x: &\'static str = r###"hello"###;')!; - expect(tree.rootNode.toString()).toBe( - '(source_file (const_item ' + - 'name: (identifier) ' + - 'type: (reference_type (lifetime (identifier)) type: (primitive_type)) ' + - 'value: (raw_string_literal (string_content))))' - ); - }); - - it('can use the typescript parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('typescript'))); - tree = parser.parse('a()\nb()\n[c]')!; - expect(tree.rootNode.toString()).toBe( - '(program ' + - '(expression_statement (call_expression function: (identifier) arguments: (arguments))) ' + - '(expression_statement (subscript_expression ' + - 'object: (call_expression ' + - 'function: (identifier) ' + - 'arguments: (arguments)) ' + - 'index: (identifier))))' - ); - }); - - it('can use the tsx parser', { timeout: 5000 }, async () => { - parser.setLanguage(await Language.load(languageURL('tsx'))); - tree = parser.parse('a()\nb()\n[c]')!; - expect(tree.rootNode.toString()).toBe( - '(program ' + - '(expression_statement (call_expression function: (identifier) arguments: (arguments))) ' + - '(expression_statement (subscript_expression ' + - 'object: (call_expression ' + - 'function: (identifier) ' + - 'arguments: (arguments)) ' + - 'index: (identifier))))', - - ); - }); - - it('parses only the text within the `includedRanges` if they are specified', () => { - const sourceCode = '<% foo() %> <% bar %>'; - - const start1 = sourceCode.indexOf('foo'); - const end1 = start1 + 5; - const start2 = sourceCode.indexOf('bar'); - const end2 = start2 + 3; - - const tree = parser.parse(sourceCode, null, { - includedRanges: [ - { - startIndex: start1, - endIndex: end1, - startPosition: { row: 0, column: start1 }, - endPosition: { row: 0, column: end1 }, - }, - { - startIndex: start2, - endIndex: end2, - startPosition: { row: 0, column: start2 }, - endPosition: { row: 0, column: end2 }, - }, - ], - })!; - - expect(tree.rootNode.toString()).toBe( - '(program ' + - '(expression_statement (call_expression function: (identifier) arguments: (arguments))) ' + - '(expression_statement (identifier)))' - ); - }); - - it('parses with a timeout', { timeout: 5000 }, () => { - parser.setLanguage(JSON); - - const startTime = performance.now(); - let currentByteOffset = 0; - const progressCallback = (state: ParseState) => { - expect(state.currentOffset).toBeGreaterThanOrEqual(currentByteOffset); - currentByteOffset = state.currentOffset; - - if (performance.now() - startTime > 1) { - return true; - } - return false; - }; - - expect(parser.parse( - (offset) => offset === 0 ? '[' : ',0', - null, - { progressCallback }, - )).toBeNull(); - }); - - it('times out when an error is detected', { timeout: 5000 }, () => { - parser.setLanguage(JSON); - - let offset = 0; - const erroneousCode = '!,'; - const progressCallback = (state: ParseState) => { - offset = state.currentOffset; - return state.hasError; - }; - - const tree = parser.parse( - (offset) => { - if (offset === 0) return '['; - if (offset >= 1 && offset < 1000) return '0,'; - return erroneousCode; - }, - null, - { progressCallback }, - ); - - // The callback is called at the end of parsing, however, what we're asserting here is that - // parsing ends immediately as the error is detected. This is verified by checking the offset - // of the last byte processed is the length of the erroneous code we inserted, aka, 1002, or - // 1000 + the length of the erroneous code. Note that in this Wasm test, we multiply the offset - // by 2 because JavaScript strings are UTF-16 encoded. - expect(offset).toBe((1000 + erroneousCode.length) * 2); - expect(tree).toBeNull(); - }); - }); -}); diff --git a/lib/binding_web/test/query-test.js b/lib/binding_web/test/query-test.js new file mode 100644 index 00000000..db4c10f8 --- /dev/null +++ b/lib/binding_web/test/query-test.js @@ -0,0 +1,481 @@ +const {assert} = require('chai'); +let Parser; let JavaScript; + +describe('Query', () => { + let parser; let tree; let query; + + before(async () => ({Parser, JavaScript} = await require('./helper'))); + + beforeEach(() => { + parser = new Parser().setLanguage(JavaScript); + }); + + afterEach(() => { + parser.delete(); + if (tree) tree.delete(); + if (query) query.delete(); + }); + + describe('construction', () => { + it('throws an error on invalid patterns', () => { + assert.throws(() => { + JavaScript.query('(function_declaration wat)'); + }, 'Bad syntax at offset 22: \'wat)\'...'); + assert.throws(() => { + JavaScript.query('(non_existent)'); + }, 'Bad node name \'non_existent\''); + assert.throws(() => { + JavaScript.query('(a)'); + }, 'Bad node name \'a\''); + assert.throws(() => { + JavaScript.query('(function_declaration non_existent:(identifier))'); + }, 'Bad field name \'non_existent\''); + assert.throws(() => { + JavaScript.query('(function_declaration name:(statement_block))'); + }, 'Bad pattern structure at offset 22: \'name:(statement_block))\''); + }); + + it('throws an error on invalid predicates', () => { + assert.throws(() => { + JavaScript.query('((identifier) @abc (#eq? @ab hi))'); + }, 'Bad capture name @ab'); + assert.throws(() => { + JavaScript.query('((identifier) @abc (#eq? @ab hi))'); + }, 'Bad capture name @ab'); + assert.throws(() => { + JavaScript.query('((identifier) @abc (#eq?))'); + }, 'Wrong number of arguments to `#eq?` predicate. Expected 2, got 0'); + assert.throws(() => { + JavaScript.query('((identifier) @a (#eq? @a @a @a))'); + }, 'Wrong number of arguments to `#eq?` predicate. Expected 2, got 3'); + }); + }); + + describe('.matches', () => { + it('returns all of the matches for the given query', () => { + tree = parser.parse('function one() { two(); function three() {} }'); + query = JavaScript.query(` + (function_declaration name: (identifier) @fn-def) + (call_expression function: (identifier) @fn-ref) + `); + const matches = query.matches(tree.rootNode); + assert.deepEqual(formatMatches(matches), [ + {pattern: 0, captures: [{name: 'fn-def', text: 'one'}]}, + {pattern: 1, captures: [{name: 'fn-ref', text: 'two'}]}, + {pattern: 0, captures: [{name: 'fn-def', text: 'three'}]}, + ]); + }); + + it('can search in a specified ranges', () => { + tree = parser.parse('[a, b,\nc, d,\ne, f,\ng, h]'); + query = JavaScript.query('(identifier) @element'); + const matches = query.matches( + tree.rootNode, + { + startPosition: {row: 1, column: 1}, + endPosition: {row: 3, column: 1}, + }, + ); + assert.deepEqual(formatMatches(matches), [ + {pattern: 0, captures: [{name: 'element', text: 'd'}]}, + {pattern: 0, captures: [{name: 'element', text: 'e'}]}, + {pattern: 0, captures: [{name: 'element', text: 'f'}]}, + {pattern: 0, captures: [{name: 'element', text: 'g'}]}, + ]); + }); + + it('handles predicates that compare the text of capture to literal strings', () => { + tree = parser.parse(` + giraffe(1, 2, []); + helment([false]); + goat(false); + gross(3, []); + hiccup([]); + gaff(5); + `); + + // Find all calls to functions beginning with 'g', where one argument + // is an array literal. + query = JavaScript.query(` + (call_expression + function: (identifier) @name + arguments: (arguments (array)) + (#match? @name "^g")) + `); + + const matches = query.matches(tree.rootNode); + assert.deepEqual(formatMatches(matches), [ + {pattern: 0, captures: [{name: 'name', text: 'giraffe'}]}, + {pattern: 0, captures: [{name: 'name', text: 'gross'}]}, + ]); + }); + + it('handles multiple matches where the first one is filtered', () => { + tree = parser.parse(` + const a = window.b; + `); + + query = JavaScript.query(` + ((identifier) @variable.builtin + (#match? @variable.builtin "^(arguments|module|console|window|document)$") + (#is-not? local)) + `); + + const matches = query.matches(tree.rootNode); + assert.deepEqual(formatMatches(matches), [ + {pattern: 0, captures: [{name: 'variable.builtin', text: 'window'}]}, + ]); + }); + }); + + describe('.captures', () => { + it('returns all of the captures for the given query, in order', () => { + tree = parser.parse(` + a({ + bc: function de() { + const fg = function hi() {} + }, + jk: function lm() { + const no = function pq() {} + }, + }); + `); + query = JavaScript.query(` + (pair + key: _ @method.def + (function_expression + name: (identifier) @method.alias)) + + (variable_declarator + name: _ @function.def + value: (function_expression + name: (identifier) @function.alias)) + + ":" @delimiter + "=" @operator + `); + + const captures = query.captures(tree.rootNode); + assert.deepEqual(formatCaptures(captures), [ + {name: 'method.def', text: 'bc'}, + {name: 'delimiter', text: ':'}, + {name: 'method.alias', text: 'de'}, + {name: 'function.def', text: 'fg'}, + {name: 'operator', text: '='}, + {name: 'function.alias', text: 'hi'}, + {name: 'method.def', text: 'jk'}, + {name: 'delimiter', text: ':'}, + {name: 'method.alias', text: 'lm'}, + {name: 'function.def', text: 'no'}, + {name: 'operator', text: '='}, + {name: 'function.alias', text: 'pq'}, + ]); + }); + + it('handles conditions that compare the text of capture to literal strings', () => { + tree = parser.parse(` + lambda + panda + load + toad + const ab = require('./ab'); + new Cd(EF); + `); + + query = JavaScript.query(` + ((identifier) @variable + (#not-match? @variable "^(lambda|load)$")) + + ((identifier) @function.builtin + (#eq? @function.builtin "require")) + + ((identifier) @constructor + (#match? @constructor "^[A-Z]")) + + ((identifier) @constant + (#match? @constant "^[A-Z]{2,}$")) + `); + + const captures = query.captures(tree.rootNode); + assert.deepEqual(formatCaptures(captures), [ + {name: 'variable', text: 'panda'}, + {name: 'variable', text: 'toad'}, + {name: 'variable', text: 'ab'}, + {name: 'variable', text: 'require'}, + {name: 'function.builtin', text: 'require'}, + {name: 'variable', text: 'Cd'}, + {name: 'constructor', text: 'Cd'}, + {name: 'variable', text: 'EF'}, + {name: 'constructor', text: 'EF'}, + {name: 'constant', text: 'EF'}, + ]); + }); + + it('handles conditions that compare the text of capture to each other', () => { + tree = parser.parse(` + ab = abc + 1; + def = de + 1; + ghi = ghi + 1; + `); + + query = JavaScript.query(` + ( + (assignment_expression + left: (identifier) @id1 + right: (binary_expression + left: (identifier) @id2)) + (#eq? @id1 @id2) + ) + `); + + const captures = query.captures(tree.rootNode); + assert.deepEqual(formatCaptures(captures), [ + {name: 'id1', text: 'ghi'}, + {name: 'id2', text: 'ghi'}, + ]); + }); + + it('handles patterns with properties', () => { + tree = parser.parse(`a(b.c);`); + query = JavaScript.query(` + ((call_expression (identifier) @func) + (#set! foo) + (#set! bar baz)) + + ((property_identifier) @prop + (#is? foo) + (#is-not? bar baz)) + `); + + const captures = query.captures(tree.rootNode); + assert.deepEqual(formatCaptures(captures), [ + {name: 'func', text: 'a', setProperties: {foo: null, bar: 'baz'}}, + { + name: 'prop', + text: 'c', + assertedProperties: {foo: null}, + refutedProperties: {bar: 'baz'}, + }, + ]); + assert.ok(!query.didExceedMatchLimit()); + }); + + it('detects queries with too many permutations to track', () => { + tree = parser.parse(` + [ + hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, + hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, + hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, + hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, + hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, + ]; + `); + + query = JavaScript.query(` + (array (identifier) @pre (identifier) @post) + `); + + query.captures(tree.rootNode, {matchLimit: 32}); + assert.ok(query.didExceedMatchLimit()); + }); + + it('handles quantified captures properly', () => { + let captures; + + tree = parser.parse(` + /// foo + /// bar + /// baz + `); + + query = JavaScript.query(` + ( + (comment)+ @foo + (#any-eq? @foo "/// foo") + ) + `); + + const expectCount = (tree, queryText, expectedCount) => { + query = JavaScript.query(queryText); + captures = query.captures(tree.rootNode); + assert.equal(captures.length, expectedCount); + }; + + expectCount( + tree, + `((comment)+ @foo (#any-eq? @foo "/// foo"))`, + 3, + ); + + expectCount( + tree, + `((comment)+ @foo (#eq? @foo "/// foo"))`, + 0, + ); + + expectCount( + tree, + `((comment)+ @foo (#any-not-eq? @foo "/// foo"))`, + 3, + ); + + expectCount( + tree, + `((comment)+ @foo (#not-eq? @foo "/// foo"))`, + 0, + ); + + expectCount( + tree, + `((comment)+ @foo (#match? @foo "^/// foo"))`, + 0, + ); + + expectCount( + tree, + `((comment)+ @foo (#any-match? @foo "^/// foo"))`, + 3, + ); + + expectCount( + tree, + `((comment)+ @foo (#not-match? @foo "^/// foo"))`, + 0, + ); + + expectCount( + tree, + `((comment)+ @foo (#not-match? @foo "fsdfsdafdfs"))`, + 3, + ); + + expectCount( + tree, + `((comment)+ @foo (#any-not-match? @foo "^///"))`, + 0, + ); + + expectCount( + tree, + `((comment)+ @foo (#any-not-match? @foo "^/// foo"))`, + 3, + ); + }); + }); + + describe('.predicatesForPattern(index)', () => { + it('returns all of the predicates as objects', () => { + query = JavaScript.query(` + ( + (binary_expression + left: (identifier) @a + right: (identifier) @b) + (#something? @a @b) + (#match? @a "c") + (#something-else? @a "A" @b "B") + ) + + ((identifier) @c + (#hello! @c)) + + "if" @d + `); + + assert.deepEqual(query.predicatesForPattern(0), [ + { + operator: 'something?', + operands: [ + {type: 'capture', name: 'a'}, + {type: 'capture', name: 'b'}, + ], + }, + { + operator: 'something-else?', + operands: [ + {type: 'capture', name: 'a'}, + {type: 'string', value: 'A'}, + {type: 'capture', name: 'b'}, + {type: 'string', value: 'B'}, + ], + }, + ]); + assert.deepEqual(query.predicatesForPattern(1), [ + { + operator: 'hello!', + operands: [{type: 'capture', name: 'c'}], + }, + ]); + assert.deepEqual(query.predicatesForPattern(2), []); + }); + }); + + describe('.disableCapture', () => { + it('disables a capture', () => { + const query = JavaScript.query(` + (function_declaration + (identifier) @name1 @name2 @name3 + (statement_block) @body1 @body2) + `); + + const source = 'function foo() { return 1; }'; + const tree = parser.parse(source); + + let matches = query.matches(tree.rootNode); + assert.deepEqual(formatMatches(matches), [ + { + pattern: 0, + captures: [ + {name: 'name1', text: 'foo'}, + {name: 'name2', text: 'foo'}, + {name: 'name3', text: 'foo'}, + {name: 'body1', text: '{ return 1; }'}, + {name: 'body2', text: '{ return 1; }'}, + ], + }, + ]); + + // disabling captures still works when there are multiple captures on a + // single node. + query.disableCapture('name2'); + matches = query.matches(tree.rootNode); + assert.deepEqual(formatMatches(matches), [ + { + pattern: 0, + captures: [ + {name: 'name1', text: 'foo'}, + {name: 'name3', text: 'foo'}, + {name: 'body1', text: '{ return 1; }'}, + {name: 'body2', text: '{ return 1; }'}, + ], + }, + ]); + }); + }); + + describe('Set a timeout', () => + it('returns less than the expected matches', () => { + tree = parser.parse('function foo() while (true) { } }\n'.repeat(1000)); + query = JavaScript.query('(function_declaration name: (identifier) @function)'); + const matches = query.matches(tree.rootNode, { timeoutMicros: 1000 }); + assert.isBelow(matches.length, 1000); + const matches2 = query.matches(tree.rootNode, { timeoutMicros: 0 }); + assert.equal(matches2.length, 1000); + }) + ); +}); + +function formatMatches(matches) { + return matches.map(({pattern, captures}) => ({ + pattern, + captures: formatCaptures(captures), + })); +} + +function formatCaptures(captures) { + return captures.map((c) => { + const node = c.node; + delete c.node; + c.text = node.text; + return c; + }); +} diff --git a/lib/binding_web/test/query.test.ts b/lib/binding_web/test/query.test.ts deleted file mode 100644 index f90e9464..00000000 --- a/lib/binding_web/test/query.test.ts +++ /dev/null @@ -1,629 +0,0 @@ -import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest'; -import type { Language, Tree, QueryMatch, QueryCapture } from '../src'; -import { Parser, Query } from '../src'; -import helper from './helper'; - -let JavaScript: Language; - -describe('Query', () => { - let parser: Parser; - let tree: Tree | null; - let query: Query | null; - - beforeAll(async () => { - ({ JavaScript } = await helper); - }); - - beforeEach(() => { - parser = new Parser(); - parser.setLanguage(JavaScript); - }); - - afterEach(() => { - parser.delete(); - if (tree) tree.delete(); - if (query) query.delete(); - }); - - describe('construction', () => { - it('throws an error on invalid patterns', () => { - expect(() => { - new Query(JavaScript, '(function_declaration wat)'); - }).toThrow('Bad syntax at offset 22: \'wat)\'...'); - - expect(() => { - new Query(JavaScript, '(non_existent)'); - }).toThrow('Bad node name \'non_existent\''); - - expect(() => { - new Query(JavaScript, '(a)'); - }).toThrow('Bad node name \'a\''); - - expect(() => { - new Query(JavaScript, '(function_declaration non_existent:(identifier))'); - }).toThrow('Bad field name \'non_existent\''); - - expect(() => { - new Query(JavaScript, '(function_declaration name:(statement_block))'); - }).toThrow('Bad pattern structure at offset 22: \'name:(statement_block))\''); - }); - - it('throws an error on invalid predicates', () => { - expect(() => { - new Query(JavaScript, '((identifier) @abc (#eq? @ab hi))'); - }).toThrow('Bad capture name @ab'); - - expect(() => { - new Query(JavaScript, '((identifier) @abc (#eq?))'); - }).toThrow('Wrong number of arguments to `#eq?` predicate. Expected 2, got 0'); - - expect(() => { - new Query(JavaScript, '((identifier) @a (#eq? @a @a @a))'); - }).toThrow('Wrong number of arguments to `#eq?` predicate. Expected 2, got 3'); - }); - }); - - describe('.matches', () => { - it('returns all of the matches for the given query', { timeout: 10000 }, () => { - tree = parser.parse('function one() { two(); function three() {} }')!; - query = new Query(JavaScript, ` - (function_declaration name: (identifier) @fn-def) - (call_expression function: (identifier) @fn-ref) - `); - const matches = query.matches(tree.rootNode); - expect(formatMatches(matches)).toEqual([ - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'fn-def', text: 'one' }] }, - { patternIndex: 1, captures: [{ patternIndex: 1, name: 'fn-ref', text: 'two' }] }, - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'fn-def', text: 'three' }] }, - ]); - }); - - it('can search in specified ranges', () => { - tree = parser.parse('[a, b,\nc, d,\ne, f,\ng, h]')!; - query = new Query(JavaScript, '(identifier) @element'); - const matches = query.matches( - tree.rootNode, - { - startPosition: { row: 1, column: 1 }, - endPosition: { row: 3, column: 1 }, - } - ); - expect(formatMatches(matches)).toEqual([ - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'element', text: 'd' }] }, - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'element', text: 'e' }] }, - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'element', text: 'f' }] }, - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'element', text: 'g' }] }, - ]); - }); - - it('can search in contained within point ranges', () => { - tree = parser.parse(`[ - {"key1": "value1"}, - {"key2": "value2"}, - {"key3": "value3"}, - {"key4": "value4"}, - {"key5": "value5"}, - {"key6": "value6"}, - {"key7": "value7"}, - {"key8": "value8"}, - {"key9": "value9"}, - {"key10": "value10"}, - {"key11": "value11"}, - {"key12": "value12"}, -]`)!; - query = new Query(JavaScript, '("[" @l_bracket "]" @r_bracket) ("{" @l_brace "}" @r_brace)'); - const matches = query.matches( - tree.rootNode, - { - startContainingPosition: { row: 5, column: 0 }, - endContainingPosition: { row: 7, column: 0 }, - } - ); - expect(formatMatches(matches)).toEqual([ - { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, - { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, - ]); - }); - - it('can search in contained within byte ranges', () => { - tree = parser.parse(`[ - {"key1": "value1"}, - {"key2": "value2"}, - {"key3": "value3"}, - {"key4": "value4"}, - {"key5": "value5"}, - {"key6": "value6"}, - {"key7": "value7"}, - {"key8": "value8"}, - {"key9": "value9"}, - {"key10": "value10"}, - {"key11": "value11"}, - {"key12": "value12"}, -]`)!; - query = new Query(JavaScript, '("[" @l_bracket "]" @r_bracket) ("{" @l_brace "}" @r_brace)'); - const matches = query.matches( - tree.rootNode, - { - startContainingIndex: 290, - endContainingIndex: 432, - } - ); - expect(formatMatches(matches)).toEqual([ - { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, - { patternIndex: 1, captures: [{ patternIndex: 1, name: 'l_brace', text: '{' }, { patternIndex: 1, name: 'r_brace', text: '}' },] }, - ]); - }); - - it('handles predicates that compare the text of capture to literal strings', () => { - tree = parser.parse(` - giraffe(1, 2, []); - helment([false]); - goat(false); - gross(3, []); - hiccup([]); - gaff(5); - `)!; - - // Find all calls to functions beginning with 'g', where one argument - // is an array literal. - query = new Query(JavaScript, ` - (call_expression - function: (identifier) @name - arguments: (arguments (array)) - (#match? @name "^g")) - `); - - const matches = query.matches(tree.rootNode); - expect(formatMatches(matches)).toEqual([ - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'name', text: 'giraffe' }] }, - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'name', text: 'gross' }] }, - ]); - }); - - it('handles multiple matches where the first one is filtered', () => { - tree = parser.parse(` - const a = window.b; - `)!; - - query = new Query(JavaScript, ` - ((identifier) @variable.builtin - (#match? @variable.builtin "^(arguments|module|console|window|document)$") - (#is-not? local)) - `); - - const matches = query.matches(tree.rootNode); - expect(formatMatches(matches)).toEqual([ - { patternIndex: 0, captures: [{ patternIndex: 0, name: 'variable.builtin', text: 'window' }] }, - ]); - }); - }); - - describe('.captures', () => { - it('returns all of the captures for the given query, in order', () => { - tree = parser.parse(` - a({ - bc: function de() { - const fg = function hi() {} - }, - jk: function lm() { - const no = function pq() {} - }, - }); - `)!; - query = new Query(JavaScript, ` - (pair - key: _ @method.def - (function_expression - name: (identifier) @method.alias)) - - (variable_declarator - name: _ @function.def - value: (function_expression - name: (identifier) @function.alias)) - - ":" @delimiter - "=" @operator - `); - - const captures = query.captures(tree.rootNode); - expect(formatCaptures(captures)).toEqual([ - { patternIndex: 0, name: 'method.def', text: 'bc' }, - { patternIndex: 2, name: 'delimiter', text: ':' }, - { patternIndex: 0, name: 'method.alias', text: 'de' }, - { patternIndex: 1, name: 'function.def', text: 'fg' }, - { patternIndex: 3, name: 'operator', text: '=' }, - { patternIndex: 1, name: 'function.alias', text: 'hi' }, - { patternIndex: 0, name: 'method.def', text: 'jk' }, - { patternIndex: 2, name: 'delimiter', text: ':' }, - { patternIndex: 0, name: 'method.alias', text: 'lm' }, - { patternIndex: 1, name: 'function.def', text: 'no' }, - { patternIndex: 3, name: 'operator', text: '=' }, - { patternIndex: 1, name: 'function.alias', text: 'pq' }, - ]); - }); - - it('handles conditions that compare the text of capture to literal strings', () => { - tree = parser.parse(` - lambda - panda - load - toad - const ab = require('./ab'); - new Cd(EF); - `)!; - - query = new Query(JavaScript, ` - ((identifier) @variable - (#not-match? @variable "^(lambda|load)$")) - - ((identifier) @function.builtin - (#eq? @function.builtin "require")) - - ((identifier) @constructor - (#match? @constructor "^[A-Z]")) - - ((identifier) @constant - (#match? @constant "^[A-Z]{2,}$")) - `); - - const captures = query.captures(tree.rootNode); - expect(formatCaptures(captures)).toEqual([ - { patternIndex: 0, name: 'variable', text: 'panda' }, - { patternIndex: 0, name: 'variable', text: 'toad' }, - { patternIndex: 0, name: 'variable', text: 'ab' }, - { patternIndex: 0, name: 'variable', text: 'require' }, - { patternIndex: 1, name: 'function.builtin', text: 'require' }, - { patternIndex: 0, name: 'variable', text: 'Cd' }, - { patternIndex: 2, name: 'constructor', text: 'Cd' }, - { patternIndex: 0, name: 'variable', text: 'EF' }, - { patternIndex: 2, name: 'constructor', text: 'EF' }, - { patternIndex: 3, name: 'constant', text: 'EF' }, - ]); - }); - - it('handles conditions that compare the text of captures to each other', () => { - tree = parser.parse(` - ab = abc + 1; - def = de + 1; - ghi = ghi + 1; - `)!; - - query = new Query(JavaScript, ` - ( - (assignment_expression - left: (identifier) @id1 - right: (binary_expression - left: (identifier) @id2)) - (#eq? @id1 @id2) - ) - `); - - const captures = query.captures(tree.rootNode); - expect(formatCaptures(captures)).toEqual([ - { patternIndex: 0, name: 'id1', text: 'ghi' }, - { patternIndex: 0, name: 'id2', text: 'ghi' }, - ]); - }); - - it('handles patterns with properties', () => { - tree = parser.parse(`a(b.c);`)!; - query = new Query(JavaScript, ` - ((call_expression (identifier) @func) - (#set! foo) - (#set! bar baz)) - - ((property_identifier) @prop - (#is? foo) - (#is-not? bar baz)) - `); - - const captures = query.captures(tree.rootNode); - expect(formatCaptures(captures)).toEqual([ - { - patternIndex: 0, - name: 'func', - text: 'a', - setProperties: { foo: null, bar: 'baz' } - }, - { - patternIndex: 1, - name: 'prop', - text: 'c', - assertedProperties: { foo: null }, - refutedProperties: { bar: 'baz' }, - }, - ]); - expect(query.didExceedMatchLimit()).toBe(false); - }); - - it('detects queries with too many permutations to track', () => { - tree = parser.parse(` - [ - hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, - hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, - hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, - hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, - hello, hello, hello, hello, hello, hello, hello, hello, hello, hello, - ]; - `)!; - - query = new Query(JavaScript, `(array (identifier) @pre (identifier) @post)`); - - query.captures(tree.rootNode, { matchLimit: 32 }); - expect(query.didExceedMatchLimit()).toBe(true); - }); - - it('handles quantified captures properly', () => { - tree = parser.parse(` - /// foo - /// bar - /// baz - `)!; - - const expectCount = (tree: Tree, queryText: string, expectedCount: number) => { - query = new Query(JavaScript, queryText); - const captures = query.captures(tree.rootNode); - expect(captures).toHaveLength(expectedCount); - }; - - expectCount( - tree, - `((comment)+ @foo (#any-eq? @foo "/// foo"))`, - 3 - ); - - expectCount( - tree, - `((comment)+ @foo (#eq? @foo "/// foo"))`, - 0 - ); - - expectCount( - tree, - `((comment)+ @foo (#any-not-eq? @foo "/// foo"))`, - 3 - ); - - expectCount( - tree, - `((comment)+ @foo (#not-eq? @foo "/// foo"))`, - 0 - ); - - expectCount( - tree, - `((comment)+ @foo (#match? @foo "^/// foo"))`, - 0 - ); - - expectCount( - tree, - `((comment)+ @foo (#any-match? @foo "^/// foo"))`, - 3 - ); - - expectCount( - tree, - `((comment)+ @foo (#not-match? @foo "^/// foo"))`, - 0 - ); - - expectCount( - tree, - `((comment)+ @foo (#not-match? @foo "fsdfsdafdfs"))`, - 3 - ); - - expectCount( - tree, - `((comment)+ @foo (#any-not-match? @foo "^///"))`, - 0 - ); - - expectCount( - tree, - `((comment)+ @foo (#any-not-match? @foo "^/// foo"))`, - 3 - ); - }); - }); - - describe('.predicatesForPattern(index)', () => { - it('returns all of the predicates as objects', () => { - query = new Query(JavaScript, ` - ( - (binary_expression - left: (identifier) @a - right: (identifier) @b) - (#something? @a @b) - (#match? @a "c") - (#something-else? @a "A" @b "B") - ) - - ((identifier) @c - (#hello! @c)) - - "if" @d - `); - - expect(query.predicatesForPattern(0)).toStrictEqual([ - { - operator: 'something?', - operands: [ - { type: 'capture', name: 'a' }, - { type: 'capture', name: 'b' }, - ], - }, - { - operator: 'something-else?', - operands: [ - { type: 'capture', name: 'a' }, - { type: 'string', value: 'A' }, - { type: 'capture', name: 'b' }, - { type: 'string', value: 'B' }, - ], - }, - ]); - - expect(query.predicatesForPattern(1)).toStrictEqual([ - { - operator: 'hello!', - operands: [{ type: 'capture', name: 'c' }], - }, - ]); - - expect(query.predicatesForPattern(2)).toEqual([]); - }); - }); - - describe('.disableCapture', () => { - it('disables a capture', () => { - query = new Query(JavaScript, ` - (function_declaration - (identifier) @name1 @name2 @name3 - (statement_block) @body1 @body2) - `); - - const source = 'function foo() { return 1; }'; - const tree = parser.parse(source)!; - - let matches = query.matches(tree.rootNode); - expect(formatMatches(matches)).toEqual([ - { - patternIndex: 0, - captures: [ - { patternIndex: 0, name: 'name1', text: 'foo' }, - { patternIndex: 0, name: 'name2', text: 'foo' }, - { patternIndex: 0, name: 'name3', text: 'foo' }, - { patternIndex: 0, name: 'body1', text: '{ return 1; }' }, - { patternIndex: 0, name: 'body2', text: '{ return 1; }' }, - ], - }, - ]); - - // disabling captures still works when there are multiple captures on a - // single node. - query.disableCapture('name2'); - matches = query.matches(tree.rootNode); - expect(formatMatches(matches)).toEqual([ - { - patternIndex: 0, - captures: [ - { patternIndex: 0, name: 'name1', text: 'foo' }, - { patternIndex: 0, name: 'name3', text: 'foo' }, - { patternIndex: 0, name: 'body1', text: '{ return 1; }' }, - { patternIndex: 0, name: 'body2', text: '{ return 1; }' }, - ], - }, - ]); - }); - }); - - describe('Start and end indices for patterns', () => { - it('Returns the start and end indices for a pattern', () => { - const patterns1 = ` -"+" @operator -"-" @operator -"*" @operator -"=" @operator -"=>" @operator - `.trim(); - - const patterns2 = ` -(identifier) @a -(string) @b -`.trim(); - - const patterns3 = ` -((identifier) @b (#match? @b i)) -(function_declaration name: (identifier) @c) -(method_definition name: (property_identifier) @d) -`.trim(); - - const source = patterns1 + patterns2 + patterns3; - - const query = new Query(JavaScript, source); - - expect(query.startIndexForPattern(0)).toBe(0); - expect(query.endIndexForPattern(0)).toBe('"+" @operator\n'.length); - expect(query.startIndexForPattern(5)).toBe(patterns1.length); - expect(query.endIndexForPattern(5)).toBe( - patterns1.length + '(identifier) @a\n'.length - ); - expect(query.startIndexForPattern(7)).toBe(patterns1.length + patterns2.length); - expect(query.endIndexForPattern(7)).toBe( - patterns1.length + - patterns2.length + - '((identifier) @b (#match? @b i))\n'.length - ); - }); - }); - - describe('Disable pattern', () => { - it('Disables patterns in the query', () => { - const query = new Query(JavaScript, ` - (function_declaration name: (identifier) @name) - (function_declaration body: (statement_block) @body) - (class_declaration name: (identifier) @name) - (class_declaration body: (class_body) @body) - `); - - // disable the patterns that match names - query.disablePattern(0); - query.disablePattern(2); - - const source = 'class A { constructor() {} } function b() { return 1; }'; - tree = parser.parse(source)!; - const matches = query.matches(tree.rootNode); - expect(formatMatches(matches)).toEqual([ - { - patternIndex: 3, - captures: [{ patternIndex: 3, name: 'body', text: '{ constructor() {} }' }], - }, - { patternIndex: 1, captures: [{ patternIndex: 1, name: 'body', text: '{ return 1; }' }] }, - ]); - }); - }); - - describe('Executes with a timeout', { timeout: 10000 }, () => { - it('Returns less than the expected matches', () => { - tree = parser.parse('function foo() while (true) { } }\n'.repeat(1000))!; - query = new Query(JavaScript, '(function_declaration) @function'); - - const startTime = performance.now(); - - const matches = query.matches( - tree.rootNode, - { - progressCallback: () => { - if (performance.now() - startTime > 1) { - return true; - } - return false; - }, - } - ); - expect(matches.length).toBeLessThan(1000); - - const matches2 = query.matches(tree.rootNode); - expect(matches2).toHaveLength(1000); - }); - }); -}); - -// Helper functions -function formatMatches(matches: QueryMatch[]): Omit[] { - return matches.map(({ patternIndex, captures }) => ({ - patternIndex, - captures: formatCaptures(captures), - })); -} - -function formatCaptures(captures: QueryCapture[]): (QueryCapture & { text: string })[] { - return captures.map((c) => { - const node = c.node; - // @ts-expect-error We're not interested in the node object for these tests - delete c.node; - return { ...c, text: node.text }; - }); -} diff --git a/lib/binding_web/test/tree-test.js b/lib/binding_web/test/tree-test.js new file mode 100644 index 00000000..c9216eb1 --- /dev/null +++ b/lib/binding_web/test/tree-test.js @@ -0,0 +1,424 @@ +const {assert} = require('chai'); +let Parser; let JavaScript; + +describe('Tree', () => { + let parser; let tree; + + before(async () => + ({Parser, JavaScript} = await require('./helper')), + ); + + beforeEach(() => { + parser = new Parser().setLanguage(JavaScript); + }); + + afterEach(() => { + parser.delete(); + tree.delete(); + }); + + describe('.edit', () => { + let input; let edit; + + it('updates the positions of nodes', () => { + input = 'abc + cde'; + tree = parser.parse(input); + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))', + ); + + let sumNode = tree.rootNode.firstChild.firstChild; + let variableNode1 = sumNode.firstChild; + let variableNode2 = sumNode.lastChild; + assert.equal(variableNode1.startIndex, 0); + assert.equal(variableNode1.endIndex, 3); + assert.equal(variableNode2.startIndex, 6); + assert.equal(variableNode2.endIndex, 9); + + ([input, edit] = spliceInput(input, input.indexOf('bc'), 0, ' * ')); + assert.equal(input, 'a * bc + cde'); + tree.edit(edit); + + sumNode = tree.rootNode.firstChild.firstChild; + variableNode1 = sumNode.firstChild; + variableNode2 = sumNode.lastChild; + assert.equal(variableNode1.startIndex, 0); + assert.equal(variableNode1.endIndex, 6); + assert.equal(variableNode2.startIndex, 9); + assert.equal(variableNode2.endIndex, 12); + + tree = parser.parse(input, tree); + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (identifier))))', + ); + }); + + it('handles non-ascii characters', () => { + input = 'αβδ + cde'; + + tree = parser.parse(input); + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))', + ); + + let variableNode = tree.rootNode.firstChild.firstChild.lastChild; + + ([input, edit] = spliceInput(input, input.indexOf('δ'), 0, '👍 * ')); + assert.equal(input, 'αβ👍 * δ + cde'); + tree.edit(edit); + + variableNode = tree.rootNode.firstChild.firstChild.lastChild; + assert.equal(variableNode.startIndex, input.indexOf('cde')); + + tree = parser.parse(input, tree); + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (identifier))))', + ); + }); + }); + + describe('.getChangedRanges(previous)', () => { + it('reports the ranges of text whose syntactic meaning has changed', () => { + let sourceCode = 'abcdefg + hij'; + tree = parser.parse(sourceCode); + + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))', + ); + + sourceCode = 'abc + defg + hij'; + tree.edit({ + startIndex: 2, + oldEndIndex: 2, + newEndIndex: 5, + startPosition: {row: 0, column: 2}, + oldEndPosition: {row: 0, column: 2}, + newEndPosition: {row: 0, column: 5}, + }); + + const tree2 = parser.parse(sourceCode, tree); + assert.equal( + tree2.rootNode.toString(), + '(program (expression_statement (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (identifier))))', + ); + + const ranges = tree.getChangedRanges(tree2); + assert.deepEqual(ranges, [ + { + startIndex: 0, + endIndex: 'abc + defg'.length, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 'abc + defg'.length}, + }, + ]); + + tree2.delete(); + }); + + it('throws an exception if the argument is not a tree', () => { + tree = parser.parse('abcdefg + hij'); + + assert.throws(() => { + tree.getChangedRanges({}); + }, /Argument must be a Tree/); + }); + }); + + describe('.walk()', () => { + let cursor; + + afterEach(() => { + cursor.delete(); + }); + + it('returns a cursor that can be used to walk the tree', () => { + tree = parser.parse('a * b + c / d'); + cursor = tree.walk(); + + assertCursorState(cursor, { + nodeType: 'program', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 13}, + startIndex: 0, + endIndex: 13, + }); + + assert(cursor.gotoFirstChild()); + assertCursorState(cursor, { + nodeType: 'expression_statement', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 13}, + startIndex: 0, + endIndex: 13, + }); + + assert(cursor.gotoFirstChild()); + assertCursorState(cursor, { + nodeType: 'binary_expression', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 13}, + startIndex: 0, + endIndex: 13, + }); + + assert(cursor.gotoFirstChild()); + assertCursorState(cursor, { + nodeType: 'binary_expression', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 5}, + startIndex: 0, + endIndex: 5, + }); + + assert(cursor.gotoFirstChild()); + assert.equal(cursor.nodeText, 'a'); + assertCursorState(cursor, { + nodeType: 'identifier', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 1}, + startIndex: 0, + endIndex: 1, + }); + + assert(!cursor.gotoFirstChild()); + assert(cursor.gotoNextSibling()); + assert.equal(cursor.nodeText, '*'); + assertCursorState(cursor, { + nodeType: '*', + nodeIsNamed: false, + startPosition: {row: 0, column: 2}, + endPosition: {row: 0, column: 3}, + startIndex: 2, + endIndex: 3, + }); + + assert(cursor.gotoNextSibling()); + assert.equal(cursor.nodeText, 'b'); + assertCursorState(cursor, { + nodeType: 'identifier', + nodeIsNamed: true, + startPosition: {row: 0, column: 4}, + endPosition: {row: 0, column: 5}, + startIndex: 4, + endIndex: 5, + }); + + assert(!cursor.gotoNextSibling()); + assert(cursor.gotoParent()); + assertCursorState(cursor, { + nodeType: 'binary_expression', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 5}, + startIndex: 0, + endIndex: 5, + }); + + assert(cursor.gotoNextSibling()); + assertCursorState(cursor, { + nodeType: '+', + nodeIsNamed: false, + startPosition: {row: 0, column: 6}, + endPosition: {row: 0, column: 7}, + startIndex: 6, + endIndex: 7, + }); + + assert(cursor.gotoNextSibling()); + assertCursorState(cursor, { + nodeType: 'binary_expression', + nodeIsNamed: true, + startPosition: {row: 0, column: 8}, + endPosition: {row: 0, column: 13}, + startIndex: 8, + endIndex: 13, + }); + + const copy = tree.walk(); + copy.resetTo(cursor); + + assert(copy.gotoPreviousSibling()); + assertCursorState(copy, { + nodeType: '+', + nodeIsNamed: false, + startPosition: {row: 0, column: 6}, + endPosition: {row: 0, column: 7}, + startIndex: 6, + endIndex: 7, + }); + + assert(copy.gotoPreviousSibling()); + assertCursorState(copy, { + nodeType: 'binary_expression', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 5}, + startIndex: 0, + endIndex: 5, + }); + + assert(copy.gotoLastChild()); + assertCursorState(copy, { + nodeType: 'identifier', + nodeIsNamed: true, + startPosition: {row: 0, column: 4}, + endPosition: {row: 0, column: 5}, + startIndex: 4, + endIndex: 5, + }); + + assert(copy.gotoParent()); + assert(copy.gotoParent()); + assert.equal(copy.nodeType, 'binary_expression'); + assert(copy.gotoParent()); + assert.equal(copy.nodeType, 'expression_statement'); + assert(copy.gotoParent()); + assert.equal(copy.nodeType, 'program'); + assert(!copy.gotoParent()); + + assert(cursor.gotoParent()); + assert.equal(cursor.nodeType, 'binary_expression'); + assert(cursor.gotoParent()); + assert.equal(cursor.nodeType, 'expression_statement'); + assert(cursor.gotoParent()); + assert.equal(cursor.nodeType, 'program'); + assert(!cursor.gotoParent()); + }); + + it('keeps track of the field name associated with each node', () => { + tree = parser.parse('a.b();'); + cursor = tree.walk(); + cursor.gotoFirstChild(); + cursor.gotoFirstChild(); + + assert.equal(cursor.currentNode.type, 'call_expression'); + assert.equal(cursor.currentFieldName, null); + + cursor.gotoFirstChild(); + assert.equal(cursor.currentNode.type, 'member_expression'); + assert.equal(cursor.currentFieldName, 'function'); + + cursor.gotoFirstChild(); + assert.equal(cursor.currentNode.type, 'identifier'); + assert.equal(cursor.currentFieldName, 'object'); + + cursor.gotoNextSibling(); + cursor.gotoNextSibling(); + assert.equal(cursor.currentNode.type, 'property_identifier'); + assert.equal(cursor.currentFieldName, 'property'); + + cursor.gotoParent(); + cursor.gotoNextSibling(); + assert.equal(cursor.currentNode.type, 'arguments'); + assert.equal(cursor.currentFieldName, 'arguments'); + }); + + it('returns a cursor that can be reset anywhere in the tree', () => { + tree = parser.parse('a * b + c / d'); + cursor = tree.walk(); + const root = tree.rootNode.firstChild; + + cursor.reset(root.firstChild.firstChild); + assertCursorState(cursor, { + nodeType: 'binary_expression', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 5}, + startIndex: 0, + endIndex: 5, + }); + + cursor.gotoFirstChild(); + assertCursorState(cursor, { + nodeType: 'identifier', + nodeIsNamed: true, + startPosition: {row: 0, column: 0}, + endPosition: {row: 0, column: 1}, + startIndex: 0, + endIndex: 1, + }); + + assert(cursor.gotoParent()); + assert(!cursor.gotoParent()); + }); + }); + + describe('.copy', () => { + it('creates another tree that remains stable if the original tree is edited', () => { + input = 'abc + cde'; + tree = parser.parse(input); + assert.equal( + tree.rootNode.toString(), + '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))', + ); + + const tree2 = tree.copy(); + ([input, edit] = spliceInput(input, 3, 0, '123')); + assert.equal(input, 'abc123 + cde'); + tree.edit(edit); + + const leftNode = tree.rootNode.firstChild.firstChild.firstChild; + const leftNode2 = tree2.rootNode.firstChild.firstChild.firstChild; + const rightNode = tree.rootNode.firstChild.firstChild.lastChild; + const rightNode2 = tree2.rootNode.firstChild.firstChild.lastChild; + assert.equal(leftNode.endIndex, 6); + assert.equal(leftNode2.endIndex, 3); + assert.equal(rightNode.startIndex, 9); + assert.equal(rightNode2.startIndex, 6); + }); + }); +}); + +function spliceInput(input, startIndex, lengthRemoved, newText) { + const oldEndIndex = startIndex + lengthRemoved; + const newEndIndex = startIndex + newText.length; + const startPosition = getExtent(input.slice(0, startIndex)); + const oldEndPosition = getExtent(input.slice(0, oldEndIndex)); + input = input.slice(0, startIndex) + newText + input.slice(oldEndIndex); + const newEndPosition = getExtent(input.slice(0, newEndIndex)); + return [ + input, + { + startIndex, startPosition, + oldEndIndex, oldEndPosition, + newEndIndex, newEndPosition, + }, + ]; +} + +function getExtent(text) { + let row = 0; + let index; + for (index = 0; index !== -1; index = text.indexOf('\n', index)) { + index++; + row++; + } + return {row, column: text.length - index}; +} + +function assertCursorState(cursor, params) { + assert.equal(cursor.nodeType, params.nodeType); + assert.equal(cursor.nodeIsNamed, params.nodeIsNamed); + assert.deepEqual(cursor.startPosition, params.startPosition); + assert.deepEqual(cursor.endPosition, params.endPosition); + assert.deepEqual(cursor.startIndex, params.startIndex); + assert.deepEqual(cursor.endIndex, params.endIndex); + + const node = cursor.currentNode; + assert.equal(node.type, params.nodeType); + assert.equal(node.isNamed, params.nodeIsNamed); + assert.deepEqual(node.startPosition, params.startPosition); + assert.deepEqual(node.endPosition, params.endPosition); + assert.deepEqual(node.startIndex, params.startIndex); + assert.deepEqual(node.endIndex, params.endIndex); +} diff --git a/lib/binding_web/test/tree.test.ts b/lib/binding_web/test/tree.test.ts deleted file mode 100644 index 85f895a7..00000000 --- a/lib/binding_web/test/tree.test.ts +++ /dev/null @@ -1,443 +0,0 @@ -import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest'; -import type { Point, Language, Tree, TreeCursor } from '../src'; -import { Parser, Edit } from '../src'; -import helper from './helper'; - -let JavaScript: Language; - -interface CursorState { - nodeType: string; - nodeIsNamed: boolean; - startPosition: Point; - endPosition: Point; - startIndex: number; - endIndex: number; -} - -describe('Tree', () => { - let parser: Parser; - let tree: Tree; - - beforeAll(async () => { - ({ JavaScript } = await helper); - }); - - beforeEach(() => { - parser = new Parser(); - parser.setLanguage(JavaScript); - }); - - afterEach(() => { - parser.delete(); - tree.delete(); - }); - - describe('.edit', () => { - let input: string; - let edit: Edit; - - it('updates the positions of nodes', () => { - input = 'abc + cde'; - tree = parser.parse(input)!; - expect(tree.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))' - ); - - let sumNode = tree.rootNode.firstChild!.firstChild; - let variableNode1 = sumNode!.firstChild; - let variableNode2 = sumNode!.lastChild; - expect(variableNode1!.startIndex).toBe(0); - expect(variableNode1!.endIndex).toBe(3); - expect(variableNode2!.startIndex).toBe(6); - expect(variableNode2!.endIndex).toBe(9); - - [input, edit] = spliceInput(input, input.indexOf('bc'), 0, ' * '); - expect(input).toBe('a * bc + cde'); - tree.edit(edit); - - sumNode = tree.rootNode.firstChild!.firstChild; - variableNode1 = sumNode!.firstChild; - variableNode2 = sumNode!.lastChild; - expect(variableNode1!.startIndex).toBe(0); - expect(variableNode1!.endIndex).toBe(6); - expect(variableNode2!.startIndex).toBe(9); - expect(variableNode2!.endIndex).toBe(12); - - tree = parser.parse(input, tree)!; - expect(tree.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (identifier))))' - ); - }); - - it('handles non-ascii characters', () => { - input = 'αβδ + cde'; - - tree = parser.parse(input)!; - expect(tree.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))' - ); - - let variableNode = tree.rootNode.firstChild!.firstChild!.lastChild; - - [input, edit] = spliceInput(input, input.indexOf('δ'), 0, '👍 * '); - expect(input).toBe('αβ👍 * δ + cde'); - tree.edit(edit); - - variableNode = tree.rootNode.firstChild!.firstChild!.lastChild; - expect(variableNode!.startIndex).toBe(input.indexOf('cde')); - - tree = parser.parse(input, tree)!; - expect(tree.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (identifier))))' - ); - }); - }); - - describe('.getChangedRanges(previous)', () => { - it('reports the ranges of text whose syntactic meaning has changed', () => { - let sourceCode = 'abcdefg + hij'; - tree = parser.parse(sourceCode)!; - - expect(tree.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))' - ); - - sourceCode = 'abc + defg + hij'; - tree.edit(new Edit({ - startIndex: 2, - oldEndIndex: 2, - newEndIndex: 5, - startPosition: { row: 0, column: 2 }, - oldEndPosition: { row: 0, column: 2 }, - newEndPosition: { row: 0, column: 5 }, - })); - - const tree2 = parser.parse(sourceCode, tree)!; - expect(tree2.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (identifier))))' - ); - - const ranges = tree.getChangedRanges(tree2); - expect(ranges).toEqual([ - { - startIndex: 0, - endIndex: 'abc + defg'.length, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 'abc + defg'.length }, - }, - ]); - - tree2.delete(); - }); - - it('throws an exception if the argument is not a tree', () => { - tree = parser.parse('abcdefg + hij')!; - - expect(() => { - tree.getChangedRanges({} as Tree); - }).toThrow(/Argument must be a Tree/); - }); - }); - - describe('.walk()', () => { - let cursor: TreeCursor; - - afterEach(() => { - cursor.delete(); - }); - - it('returns a cursor that can be used to walk the tree', () => { - tree = parser.parse('a * b + c / d')!; - cursor = tree.walk(); - - assertCursorState(cursor, { - nodeType: 'program', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 13 }, - startIndex: 0, - endIndex: 13, - }); - - expect(cursor.gotoFirstChild()).toBe(true); - assertCursorState(cursor, { - nodeType: 'expression_statement', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 13 }, - startIndex: 0, - endIndex: 13, - }); - - expect(cursor.gotoFirstChild()).toBe(true); - assertCursorState(cursor, { - nodeType: 'binary_expression', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 13 }, - startIndex: 0, - endIndex: 13, - }); - - expect(cursor.gotoFirstChild()).toBe(true); - assertCursorState(cursor, { - nodeType: 'binary_expression', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 5 }, - startIndex: 0, - endIndex: 5, - }); - - expect(cursor.gotoFirstChild()).toBe(true); - expect(cursor.nodeText).toBe('a'); - assertCursorState(cursor, { - nodeType: 'identifier', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 1 }, - startIndex: 0, - endIndex: 1, - }); - - expect(cursor.gotoFirstChild()).toBe(false); - expect(cursor.gotoNextSibling()).toBe(true); - expect(cursor.nodeText).toBe('*'); - assertCursorState(cursor, { - nodeType: '*', - nodeIsNamed: false, - startPosition: { row: 0, column: 2 }, - endPosition: { row: 0, column: 3 }, - startIndex: 2, - endIndex: 3, - }); - - expect(cursor.gotoNextSibling()).toBe(true); - expect(cursor.nodeText).toBe('b'); - assertCursorState(cursor, { - nodeType: 'identifier', - nodeIsNamed: true, - startPosition: { row: 0, column: 4 }, - endPosition: { row: 0, column: 5 }, - startIndex: 4, - endIndex: 5, - }); - - expect(cursor.gotoNextSibling()).toBe(false); - expect(cursor.gotoParent()).toBe(true); - assertCursorState(cursor, { - nodeType: 'binary_expression', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 5 }, - startIndex: 0, - endIndex: 5, - }); - - expect(cursor.gotoNextSibling()).toBe(true); - assertCursorState(cursor, { - nodeType: '+', - nodeIsNamed: false, - startPosition: { row: 0, column: 6 }, - endPosition: { row: 0, column: 7 }, - startIndex: 6, - endIndex: 7, - }); - - expect(cursor.gotoNextSibling()).toBe(true); - assertCursorState(cursor, { - nodeType: 'binary_expression', - nodeIsNamed: true, - startPosition: { row: 0, column: 8 }, - endPosition: { row: 0, column: 13 }, - startIndex: 8, - endIndex: 13, - }); - - const copy = tree.walk(); - copy.resetTo(cursor); - - expect(copy.gotoPreviousSibling()).toBe(true); - assertCursorState(copy, { - nodeType: '+', - nodeIsNamed: false, - startPosition: { row: 0, column: 6 }, - endPosition: { row: 0, column: 7 }, - startIndex: 6, - endIndex: 7, - }); - - expect(copy.gotoPreviousSibling()).toBe(true); - assertCursorState(copy, { - nodeType: 'binary_expression', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 5 }, - startIndex: 0, - endIndex: 5, - }); - - expect(copy.gotoLastChild()).toBe(true); - assertCursorState(copy, { - nodeType: 'identifier', - nodeIsNamed: true, - startPosition: { row: 0, column: 4 }, - endPosition: { row: 0, column: 5 }, - startIndex: 4, - endIndex: 5, - }); - - expect(copy.gotoParent()).toBe(true); - expect(copy.gotoParent()).toBe(true); - expect(copy.nodeType).toBe('binary_expression'); - expect(copy.gotoParent()).toBe(true); - expect(copy.nodeType).toBe('expression_statement'); - expect(copy.gotoParent()).toBe(true); - expect(copy.nodeType).toBe('program'); - expect(copy.gotoParent()).toBe(false); - copy.delete(); - - expect(cursor.gotoParent()).toBe(true); - expect(cursor.nodeType).toBe('binary_expression'); - expect(cursor.gotoParent()).toBe(true); - expect(cursor.nodeType).toBe('expression_statement'); - expect(cursor.gotoParent()).toBe(true); - expect(cursor.nodeType).toBe('program'); - }); - - it('keeps track of the field name associated with each node', () => { - tree = parser.parse('a.b();')!; - cursor = tree.walk(); - cursor.gotoFirstChild(); - cursor.gotoFirstChild(); - - expect(cursor.currentNode.type).toBe('call_expression'); - expect(cursor.currentFieldName).toBeNull(); - - cursor.gotoFirstChild(); - expect(cursor.currentNode.type).toBe('member_expression'); - expect(cursor.currentFieldName).toBe('function'); - - cursor.gotoFirstChild(); - expect(cursor.currentNode.type).toBe('identifier'); - expect(cursor.currentFieldName).toBe('object'); - - cursor.gotoNextSibling(); - cursor.gotoNextSibling(); - expect(cursor.currentNode.type).toBe('property_identifier'); - expect(cursor.currentFieldName).toBe('property'); - - cursor.gotoParent(); - cursor.gotoNextSibling(); - expect(cursor.currentNode.type).toBe('arguments'); - expect(cursor.currentFieldName).toBe('arguments'); - }); - - it('returns a cursor that can be reset anywhere in the tree', () => { - tree = parser.parse('a * b + c / d')!; - cursor = tree.walk(); - const root = tree.rootNode.firstChild; - - cursor.reset(root!.firstChild!.firstChild!); - assertCursorState(cursor, { - nodeType: 'binary_expression', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 5 }, - startIndex: 0, - endIndex: 5, - }); - - cursor.gotoFirstChild(); - assertCursorState(cursor, { - nodeType: 'identifier', - nodeIsNamed: true, - startPosition: { row: 0, column: 0 }, - endPosition: { row: 0, column: 1 }, - startIndex: 0, - endIndex: 1, - }); - - expect(cursor.gotoParent()).toBe(true); - expect(cursor.gotoParent()).toBe(false); - }); - }); - - describe('.copy', () => { - let input: string; - let edit: Edit; - - it('creates another tree that remains stable if the original tree is edited', () => { - input = 'abc + cde'; - tree = parser.parse(input)!; - expect(tree.rootNode.toString()).toBe( - '(program (expression_statement (binary_expression left: (identifier) right: (identifier))))' - ); - - const tree2 = tree.copy(); - [input, edit] = spliceInput(input, 3, 0, '123'); - expect(input).toBe('abc123 + cde'); - tree.edit(edit); - - const leftNode = tree.rootNode.firstChild!.firstChild!.firstChild; - const leftNode2 = tree2.rootNode.firstChild!.firstChild!.firstChild; - const rightNode = tree.rootNode.firstChild!.firstChild!.lastChild; - const rightNode2 = tree2.rootNode.firstChild!.firstChild!.lastChild; - expect(leftNode!.endIndex).toBe(6); - expect(leftNode2!.endIndex).toBe(3); - expect(rightNode!.startIndex).toBe(9); - expect(rightNode2!.startIndex).toBe(6); - - tree2.delete(); - }); - }); -}); - -function spliceInput(input: string, startIndex: number, lengthRemoved: number, newText: string): [string, Edit] { - const oldEndIndex = startIndex + lengthRemoved; - const newEndIndex = startIndex + newText.length; - const startPosition = getExtent(input.slice(0, startIndex)); - const oldEndPosition = getExtent(input.slice(0, oldEndIndex)); - input = input.slice(0, startIndex) + newText + input.slice(oldEndIndex); - const newEndPosition = getExtent(input.slice(0, newEndIndex)); - return [ - input, - new Edit({ - startIndex, - startPosition, - oldEndIndex, - oldEndPosition, - newEndIndex, - newEndPosition, - }), - ]; -} - -// Gets the extent of the text in terms of zero-based row and column numbers. -function getExtent(text: string): Point { - let row = 0; - let index = -1; - let lastIndex = 0; - while ((index = text.indexOf('\n', index + 1)) !== -1) { - row++; - lastIndex = index + 1; - } - return { row, column: text.length - lastIndex }; -} - -function assertCursorState(cursor: TreeCursor, params: CursorState): void { - expect(cursor.nodeType).toBe(params.nodeType); - expect(cursor.nodeIsNamed).toBe(params.nodeIsNamed); - expect(cursor.startPosition).toEqual(params.startPosition); - expect(cursor.endPosition).toEqual(params.endPosition); - expect(cursor.startIndex).toEqual(params.startIndex); - expect(cursor.endIndex).toEqual(params.endIndex); - - const node = cursor.currentNode; - expect(node.type).toBe(params.nodeType); - expect(node.isNamed).toBe(params.nodeIsNamed); - expect(node.startPosition).toEqual(params.startPosition); - expect(node.endPosition).toEqual(params.endPosition); - expect(node.startIndex).toEqual(params.startIndex); - expect(node.endIndex).toEqual(params.endIndex); -} diff --git a/lib/binding_web/tree-sitter-web.d.ts b/lib/binding_web/tree-sitter-web.d.ts new file mode 100644 index 00000000..cfd8a102 --- /dev/null +++ b/lib/binding_web/tree-sitter-web.d.ts @@ -0,0 +1,242 @@ +declare module 'web-tree-sitter' { + class Parser { + /** + * + * @param moduleOptions Optional emscripten module-object, see https://emscripten.org/docs/api_reference/module.html + */ + static init(moduleOptions?: object): Promise; + delete(): void; + parse(input: string | Parser.Input, oldTree?: Parser.Tree, options?: Parser.Options): Parser.Tree; + getIncludedRanges(): Parser.Range[]; + getTimeoutMicros(): number; + setTimeoutMicros(timeout: number): void; + reset(): void; + getLanguage(): Parser.Language; + setLanguage(language?: Parser.Language | null): void; + getLogger(): Parser.Logger; + setLogger(logFunc?: Parser.Logger | false | null): void; + } + + namespace Parser { + export type Options = { + includedRanges?: Range[]; + }; + + export type Point = { + row: number; + column: number; + }; + + export type Range = { + startIndex: number, + endIndex: number, + startPosition: Point, + endPosition: Point + }; + + export type Edit = { + startIndex: number; + oldEndIndex: number; + newEndIndex: number; + startPosition: Point; + oldEndPosition: Point; + newEndPosition: Point; + }; + + export type Logger = ( + message: string, + params: { [param: string]: string }, + type: "parse" | "lex" + ) => void; + + export interface Input { + (index: number, position?: Point): string | null; + } + + export interface SyntaxNode { + tree: Tree; + id: number; + typeId: number; + grammarId: number; + type: string; + grammarType: string; + isNamed: boolean; + isMissing: boolean; + isExtra: boolean; + hasChanges: boolean; + hasError: boolean; + isError: boolean; + text: string; + parseState: number; + nextParseState: number; + startPosition: Point; + endPosition: Point; + startIndex: number; + endIndex: number; + parent: SyntaxNode | null; + children: Array; + namedChildren: Array; + childCount: number; + namedChildCount: number; + firstChild: SyntaxNode | null; + firstNamedChild: SyntaxNode | null; + lastChild: SyntaxNode | null; + lastNamedChild: SyntaxNode | null; + nextSibling: SyntaxNode | null; + nextNamedSibling: SyntaxNode | null; + previousSibling: SyntaxNode | null; + previousNamedSibling: SyntaxNode | null; + descendantCount: number; + + equals(other: SyntaxNode): boolean; + toString(): string; + child(index: number): SyntaxNode | null; + namedChild(index: number): SyntaxNode | null; + childForFieldName(fieldName: string): SyntaxNode | null; + childForFieldId(fieldId: number): SyntaxNode | null; + fieldNameForChild(childIndex: number): string | null; + childrenForFieldName(fieldName: string): Array; + childrenForFieldId(fieldId: number): Array; + firstChildForIndex(index: number): SyntaxNode | null; + firstNamedChildForIndex(index: number): SyntaxNode | null; + + descendantForIndex(index: number): SyntaxNode; + descendantForIndex(startIndex: number, endIndex: number): SyntaxNode; + namedDescendantForIndex(index: number): SyntaxNode; + namedDescendantForIndex(startIndex: number, endIndex: number): SyntaxNode; + descendantForPosition(position: Point): SyntaxNode; + descendantForPosition(startPosition: Point, endPosition: Point): SyntaxNode; + namedDescendantForPosition(position: Point): SyntaxNode; + namedDescendantForPosition(startPosition: Point, endPosition: Point): SyntaxNode; + descendantsOfType(types: String | Array, startPosition?: Point, endPosition?: Point): Array; + + walk(): TreeCursor; + } + + export interface TreeCursor { + nodeType: string; + nodeTypeId: number; + nodeStateId: number; + nodeText: string; + nodeId: number; + nodeIsNamed: boolean; + nodeIsMissing: boolean; + startPosition: Point; + endPosition: Point; + startIndex: number; + endIndex: number; + readonly currentNode: SyntaxNode; + readonly currentFieldName: string; + readonly currentFieldId: number; + readonly currentDepth: number; + readonly currentDescendantIndex: number; + + reset(node: SyntaxNode): void; + resetTo(cursor: TreeCursor): void; + delete(): void; + gotoParent(): boolean; + gotoFirstChild(): boolean; + gotoLastChild(): boolean; + gotoFirstChildForIndex(goalIndex: number): boolean; + gotoFirstChildForPosition(goalPosition: Point): boolean; + gotoNextSibling(): boolean; + gotoPreviousSibling(): boolean; + gotoDescendant(goalDescendantIndex: number): void; + } + + export interface Tree { + readonly rootNode: SyntaxNode; + + rootNodeWithOffset(offsetBytes: number, offsetExtent: Point): SyntaxNode; + copy(): Tree; + delete(): void; + edit(edit: Edit): void; + walk(): TreeCursor; + getChangedRanges(other: Tree): Range[]; + getIncludedRanges(): Range[]; + getLanguage(): Language; + } + + export interface QueryCapture { + name: string; + text?: string; + node: SyntaxNode; + setProperties?: { [prop: string]: string | null }; + assertedProperties?: { [prop: string]: string | null }; + refutedProperties?: { [prop: string]: string | null }; + } + + export interface QueryMatch { + pattern: number; + captures: QueryCapture[]; + } + + export type QueryOptions = { + startPosition?: Point; + endPosition?: Point; + startIndex?: number; + endIndex?: number; + matchLimit?: number; + maxStartDepth?: number; + timeoutMicros?: number; + }; + + export interface PredicateResult { + operator: string; + operands: { name: string; type: string }[]; + } + + export class Query { + captureNames: string[]; + readonly predicates: { [name: string]: Function }[]; + readonly setProperties: any[]; + readonly assertedProperties: any[]; + readonly refutedProperties: any[]; + readonly matchLimit: number; + + delete(): void; + captures(node: SyntaxNode, options?: QueryOptions): QueryCapture[]; + matches(node: SyntaxNode, options?: QueryOptions): QueryMatch[]; + predicatesForPattern(patternIndex: number): PredicateResult[]; + disableCapture(captureName: string): void; + disablePattern(patternIndex: number): void; + isPatternGuaranteedAtStep(byteOffset: number): boolean; + isPatternRooted(patternIndex: number): boolean; + isPatternNonLocal(patternIndex: number): boolean; + startIndexForPattern(patternIndex: number): number; + didExceedMatchLimit(): boolean; + } + + class Language { + static load(input: string | Uint8Array): Promise; + + readonly version: number; + readonly fieldCount: number; + readonly stateCount: number; + readonly nodeTypeCount: number; + + fieldNameForId(fieldId: number): string | null; + fieldIdForName(fieldName: string): number | null; + idForNodeType(type: string, named: boolean): number; + nodeTypeForId(typeId: number): string | null; + nodeTypeIsNamed(typeId: number): boolean; + nodeTypeIsVisible(typeId: number): boolean; + nextState(stateId: number, typeId: number): number; + query(source: string): Query; + lookaheadIterator(stateId: number): LookaheadIterable | null; + } + + export class LookaheadIterable { + readonly language: Language; + readonly currentTypeId: number; + readonly currentType: string; + + delete(): void; + reset(language: Language, stateId: number): boolean; + resetState(stateId: number): boolean; + [Symbol.iterator](): Iterator; + } + } + + export = Parser +} diff --git a/lib/binding_web/tsconfig.json b/lib/binding_web/tsconfig.json deleted file mode 100644 index b7ed356f..00000000 --- a/lib/binding_web/tsconfig.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "es2022", - "lib": [ - "es2022", - "dom" - ], - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "rootDir": "./", - "outDir": "./dist", - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictPropertyInitialization": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "moduleResolution": "node", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "composite": true, - "isolatedModules": true, - }, - "include": [ - "src/*.ts", - "script/*", - "test/*", - "lib/*.ts" - ], - "exclude": [ - "node_modules", - "dist", - ] -} diff --git a/lib/binding_web/vitest.config.ts b/lib/binding_web/vitest.config.ts deleted file mode 100644 index 64ed3bf2..00000000 --- a/lib/binding_web/vitest.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - test: { - globals: true, - environment: 'node', - coverage: { - include: [ - 'web-tree-sitter.js', - ], - exclude: [ - 'test/**', - 'dist/**', - 'lib/**', - 'wasm/**' - ], - }, - } -}) diff --git a/lib/binding_web/wasm-test-grammars.nix b/lib/binding_web/wasm-test-grammars.nix deleted file mode 100644 index 536359d3..00000000 --- a/lib/binding_web/wasm-test-grammars.nix +++ /dev/null @@ -1,67 +0,0 @@ -{ - cli, - lib, - nodejs_22, - pkgsCross, - src, - stdenv, - test-grammars, - version, -}: -let - grammars = [ - "bash" - "c" - "cpp" - "embedded-template" - "html" - "javascript" - "json" - "python" - "rust" - "typescript" - ]; -in -stdenv.mkDerivation { - inherit src version; - - pname = "wasm-test-grammars"; - - nativeBuildInputs = [ - cli - pkgsCross.wasi32.stdenv.cc - nodejs_22 - ]; - - buildPhase = '' - export HOME=$TMPDIR - export TREE_SITTER_WASI_SDK_PATH=${pkgsCross.wasi32.stdenv.cc} - export NIX_LDFLAGS="" - - cp -r ${test-grammars}/fixtures . - chmod -R u+w fixtures - - for grammar in ${lib.concatStringsSep " " grammars}; do - if [ -d "fixtures/grammars/$grammar" ]; then - echo "Building WASM for $grammar" - - if [ "$grammar" = "typescript" ]; then - tree-sitter build --wasm -o "tree-sitter-typescript.wasm" "fixtures/grammars/$grammar/typescript" - tree-sitter build --wasm -o "tree-sitter-tsx.wasm" "fixtures/grammars/$grammar/tsx" - else - tree-sitter build --wasm -o "tree-sitter-$grammar.wasm" "fixtures/grammars/$grammar" - fi - fi - done - ''; - - installPhase = '' - mkdir -p $out - for wasm in *.wasm; do - if [ -f "$wasm" ]; then - echo "Installing $wasm" - cp "$wasm" $out/ - fi - done - ''; -} diff --git a/lib/include/tree_sitter/api.h b/lib/include/tree_sitter/api.h index 22c85d48..4c19bbdf 100644 --- a/lib/include/tree_sitter/api.h +++ b/lib/include/tree_sitter/api.h @@ -26,7 +26,7 @@ extern "C" { * The Tree-sitter library is generally backwards-compatible with languages * generated using older CLI versions, but is not forwards-compatible. */ -#define TREE_SITTER_LANGUAGE_VERSION 15 +#define TREE_SITTER_LANGUAGE_VERSION 14 /** * The earliest ABI version that is supported by the current version of the @@ -48,29 +48,14 @@ typedef struct TSQuery TSQuery; typedef struct TSQueryCursor TSQueryCursor; typedef struct TSLookaheadIterator TSLookaheadIterator; -// This function signature reads one code point from the given string, -// returning the number of bytes consumed. It should write the code point -// to the `code_point` pointer, or write -1 if the input is invalid. -typedef uint32_t (*TSDecodeFunction)( - const uint8_t *string, - uint32_t length, - int32_t *code_point -); - -// Deprecated alias to be removed in ABI 16 -typedef TSDecodeFunction DecodeFunction; - typedef enum TSInputEncoding { TSInputEncodingUTF8, - TSInputEncodingUTF16LE, - TSInputEncodingUTF16BE, - TSInputEncodingCustom + TSInputEncodingUTF16, } TSInputEncoding; typedef enum TSSymbolType { TSSymbolTypeRegular, TSSymbolTypeAnonymous, - TSSymbolTypeSupertype, TSSymbolTypeAuxiliary, } TSSymbolType; @@ -90,20 +75,8 @@ typedef struct TSInput { void *payload; const char *(*read)(void *payload, uint32_t byte_index, TSPoint position, uint32_t *bytes_read); TSInputEncoding encoding; - TSDecodeFunction decode; } TSInput; -typedef struct TSParseState { - void *payload; - uint32_t current_byte_offset; - bool has_error; -} TSParseState; - -typedef struct TSParseOptions { - void *payload; - bool (*progress_callback)(TSParseState *state); -} TSParseOptions; - typedef enum TSLogType { TSLogTypeParse, TSLogTypeLex, @@ -176,30 +149,6 @@ typedef enum TSQueryError { TSQueryErrorLanguage, } TSQueryError; -typedef struct TSQueryCursorState { - void *payload; - uint32_t current_byte_offset; -} TSQueryCursorState; - -typedef struct TSQueryCursorOptions { - void *payload; - bool (*progress_callback)(TSQueryCursorState *state); -} TSQueryCursorOptions; - -/** - * The metadata associated with a language. - * - * Currently, this metadata can be used to check the [Semantic Version](https://semver.org/) - * of the language. This version information should be used to signal if a given parser might - * be incompatible with existing queries when upgrading between major versions, or minor versions - * if it's in zerover. - */ -typedef struct TSLanguageMetadata { - uint8_t major_version; - uint8_t minor_version; - uint8_t patch_version; -} TSLanguageMetadata; - /********************/ /* Section - Parser */ /********************/ @@ -225,7 +174,7 @@ const TSLanguage *ts_parser_language(const TSParser *self); * Returns a boolean indicating whether or not the language was successfully * assigned. True means assignment succeeded. False means there was a version * mismatch: the language was generated with an incompatible version of the - * Tree-sitter CLI. Check the language's ABI version using [`ts_language_abi_version`] + * Tree-sitter CLI. Check the language's version using [`ts_language_version`] * and compare it to this library's [`TREE_SITTER_LANGUAGE_VERSION`] and * [`TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION`] constants. */ @@ -296,11 +245,18 @@ const TSRange *ts_parser_included_ranges( * `TSInputEncodingUTF8` or `TSInputEncodingUTF16`. * * This function returns a syntax tree on success, and `NULL` on failure. There - * are four possible reasons for failure: + * are three possible reasons for failure: * 1. The parser does not have a language assigned. Check for this using the [`ts_parser_language`] function. - * 2. Parsing was cancelled due to the progress callback returning true. This callback - * is passed in [`ts_parser_parse_with_options`] inside the [`TSParseOptions`] struct. + * 2. Parsing was cancelled due to a timeout that was set by an earlier call to + * the [`ts_parser_set_timeout_micros`] function. You can resume parsing from + * where the parser left out by calling [`ts_parser_parse`] again with the + * same arguments. Or you can start parsing from scratch by first calling + * [`ts_parser_reset`]. + * 3. Parsing was cancelled using a cancellation flag that was set by an + * earlier call to [`ts_parser_set_cancellation_flag`]. You can resume parsing + * from where the parser left out by calling [`ts_parser_parse`] again with + * the same arguments. * * [`read`]: TSInput::read * [`payload`]: TSInput::payload @@ -313,20 +269,6 @@ TSTree *ts_parser_parse( TSInput input ); -/** - * Use the parser to parse some source code and create a syntax tree, with some options. - * - * See [`ts_parser_parse`] for more details. - * - * See [`TSParseOptions`] for more details on the options. - */ -TSTree* ts_parser_parse_with_options( - TSParser *self, - const TSTree *old_tree, - TSInput input, - TSParseOptions parse_options -); - /** * Use the parser to parse some source code stored in one contiguous buffer. * The first two parameters are the same as in the [`ts_parser_parse`] function @@ -357,7 +299,7 @@ TSTree *ts_parser_parse_string_encoding( /** * Instruct the parser to start the next parse from the beginning. * - * If the parser previously failed because of the progress callback, then + * If the parser previously failed because of a timeout or a cancellation, then * by default, it will resume where it left off on the next call to * [`ts_parser_parse`] or other parsing functions. If you don't want to resume, * and instead intend to use this parser to parse some other document, you must @@ -365,6 +307,34 @@ TSTree *ts_parser_parse_string_encoding( */ void ts_parser_reset(TSParser *self); +/** + * Set the maximum duration in microseconds that parsing should be allowed to + * take before halting. + * + * If parsing takes longer than this, it will halt early, returning NULL. + * See [`ts_parser_parse`] for more information. + */ +void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micros); + +/** + * Get the duration in microseconds that parsing is allowed to take. + */ +uint64_t ts_parser_timeout_micros(const TSParser *self); + +/** + * Set the parser's current cancellation flag pointer. + * + * If a non-null pointer is assigned, then the parser will periodically read + * from this pointer during parsing. If it reads a non-zero value, it will + * halt early, returning NULL. See [`ts_parser_parse`] for more information. + */ +void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag); + +/** + * Get the parser's current cancellation flag pointer. + */ +const size_t *ts_parser_cancellation_flag(const TSParser *self); + /** * Set the logger that a parser should use during parsing. * @@ -450,13 +420,6 @@ void ts_tree_edit(TSTree *self, const TSInputEdit *edit); * You need to pass the old tree that was passed to parse, as well as the new * tree that was returned from that function. * - * The returned ranges indicate areas where the hierarchical structure of syntax - * nodes (from root to leaf) has changed between the old and new trees. Characters - * outside these ranges have identical ancestor nodes in both trees. - * - * Note that the returned ranges may be slightly larger than the exact changed areas, - * but Tree-sitter attempts to make them as small as possible. - * * The returned array is allocated using `malloc` and the caller is responsible * for freeing it using `free`. The length of the array will be written to the * given `length` pointer. @@ -585,17 +548,15 @@ TSStateId ts_node_next_parse_state(TSNode self); /** * Get the node's immediate parent. - * Prefer [`ts_node_child_with_descendant`] for + * Prefer [`ts_node_child_containing_descendant`] for * iterating over the node's ancestors. */ TSNode ts_node_parent(TSNode self); /** - * Get the node that contains `descendant`. - * - * Note that this can return `descendant` itself. + * Get the node's child that contains `descendant`. */ -TSNode ts_node_child_with_descendant(TSNode self, TSNode descendant); +TSNode ts_node_child_containing_descendant(TSNode self, TSNode descendant); /** * Get the node's child at the given index, where zero represents the first @@ -664,12 +625,12 @@ TSNode ts_node_next_named_sibling(TSNode self); TSNode ts_node_prev_named_sibling(TSNode self); /** - * Get the node's first child that contains or starts after the given byte offset. + * Get the node's first child that extends beyond the given byte offset. */ TSNode ts_node_first_child_for_byte(TSNode self, uint32_t byte); /** - * Get the node's first named child that contains or starts after the given byte offset. + * Get the node's first named child that extends beyond the given byte offset. */ TSNode ts_node_first_named_child_for_byte(TSNode self, uint32_t byte); @@ -708,24 +669,6 @@ void ts_node_edit(TSNode *self, const TSInputEdit *edit); */ bool ts_node_eq(TSNode self, TSNode other); -/** - * Edit a point to keep it in-sync with source code that has been edited. - * - * This function updates a single point's byte offset and row/column position - * based on an edit operation. This is useful for editing points without - * requiring a tree or node instance. - */ -void ts_point_edit(TSPoint *point, uint32_t *point_byte, const TSInputEdit *edit); - -/** - * Edit a range to keep it in-sync with source code that has been edited. - * - * This function updates a range's start and end positions based on an edit - * operation. This is useful for editing ranges without requiring a tree - * or node instance. - */ -void ts_range_edit(TSRange *range, const TSInputEdit *edit); - /************************/ /* Section - TreeCursor */ /************************/ @@ -736,9 +679,6 @@ void ts_range_edit(TSRange *range, const TSInputEdit *edit); * A tree cursor allows you to walk a syntax tree more efficiently than is * possible using the [`TSNode`] functions. It is a mutable object that is always * on a certain syntax node, and can be moved imperatively to different nodes. - * - * Note that the given node is considered the root of the cursor, - * and the cursor cannot walk outside this node. */ TSTreeCursor ts_tree_cursor_new(TSNode node); @@ -787,9 +727,6 @@ TSFieldId ts_tree_cursor_current_field_id(const TSTreeCursor *self); * * This returns `true` if the cursor successfully moved, and returns `false` * if there was no parent node (the cursor was already on the root node). - * - * Note that the node the cursor was constructed with is considered the root - * of the cursor, and the cursor cannot walk outside this node. */ bool ts_tree_cursor_goto_parent(TSTreeCursor *self); @@ -798,9 +735,6 @@ bool ts_tree_cursor_goto_parent(TSTreeCursor *self); * * This returns `true` if the cursor successfully moved, and returns `false` * if there was no next sibling node. - * - * Note that the node the cursor was constructed with is considered the root - * of the cursor, and the cursor cannot walk outside this node. */ bool ts_tree_cursor_goto_next_sibling(TSTreeCursor *self); @@ -812,10 +746,8 @@ bool ts_tree_cursor_goto_next_sibling(TSTreeCursor *self); * * Note, that this function may be slower than * [`ts_tree_cursor_goto_next_sibling`] due to how node positions are stored. In - * the worst case, this will need to iterate through all the children up to the - * previous sibling node to recalculate its position. Also note that the node the cursor - * was constructed with is considered the root of the cursor, and the cursor cannot - * walk outside this node. + * the worst case, this will need to iterate through all the children upto the + * previous sibling node to recalculate its position. */ bool ts_tree_cursor_goto_previous_sibling(TSTreeCursor *self); @@ -859,7 +791,7 @@ uint32_t ts_tree_cursor_current_descendant_index(const TSTreeCursor *self); uint32_t ts_tree_cursor_current_depth(const TSTreeCursor *self); /** - * Move the cursor to the first child of its current node that contains or starts after + * Move the cursor to the first child of its current node that extends beyond * the given byte offset or point. * * This returns the index of the child node if one was found, and returns -1 @@ -1042,16 +974,6 @@ void ts_query_cursor_delete(TSQueryCursor *self); */ void ts_query_cursor_exec(TSQueryCursor *self, const TSQuery *query, TSNode node); -/** - * Start running a given query on a given node, with some options. - */ -void ts_query_cursor_exec_with_options( - TSQueryCursor *self, - const TSQuery *query, - TSNode node, - const TSQueryCursorOptions *query_options -); - /** * Manage the maximum number of in-progress matches allowed by this query * cursor. @@ -1068,60 +990,27 @@ uint32_t ts_query_cursor_match_limit(const TSQueryCursor *self); void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit); /** - * Set the range of bytes in which the query will be executed. + * Set the maximum duration in microseconds that query execution should be allowed to + * take before halting. * - * The query cursor will return matches that intersect with the given point range. - * This means that a match may be returned even if some of its captures fall - * outside the specified range, as long as at least part of the match - * overlaps with the range. - * - * For example, if a query pattern matches a node that spans a larger area - * than the specified range, but part of that node intersects with the range, - * the entire match will be returned. - * - * This will return `false` if the start byte is greater than the end byte, otherwise - * it will return `true`. + * If query execution takes longer than this, it will halt early, returning NULL. + * See [`ts_query_cursor_next_match`] or [`ts_query_cursor_next_capture`] for more information. */ -bool ts_query_cursor_set_byte_range(TSQueryCursor *self, uint32_t start_byte, uint32_t end_byte); +void ts_query_cursor_set_timeout_micros(TSQueryCursor *self, uint64_t timeout_micros); /** - * Set the range of (row, column) positions in which the query will be executed. + * Get the duration in microseconds that query execution is allowed to take. * - * The query cursor will return matches that intersect with the given point range. - * This means that a match may be returned even if some of its captures fall - * outside the specified range, as long as at least part of the match - * overlaps with the range. - * - * For example, if a query pattern matches a node that spans a larger area - * than the specified range, but part of that node intersects with the range, - * the entire match will be returned. - * - * This will return `false` if the start point is greater than the end point, otherwise - * it will return `true`. + * This is set via [`ts_query_cursor_set_timeout_micros`]. */ -bool ts_query_cursor_set_point_range(TSQueryCursor *self, TSPoint start_point, TSPoint end_point); +uint64_t ts_query_cursor_timeout_micros(const TSQueryCursor *self); /** - * Set the byte range within which all matches must be fully contained. - * - * Set the range of bytes in which matches will be searched for. In contrast to - * `ts_query_cursor_set_byte_range`, this will restrict the query cursor to only return - * matches where _all_ nodes are _fully_ contained within the given range. Both functions - * can be used together, e.g. to search for any matches that intersect line 5000, as - * long as they are fully contained within lines 4500-5500 + * Set the range of bytes or (row, column) positions in which the query + * will be executed. */ -bool ts_query_cursor_set_containing_byte_range(TSQueryCursor *self, uint32_t start_byte, uint32_t end_byte); - -/** - * Set the point range within which all matches must be fully contained. - * - * Set the range of bytes in which matches will be searched for. In contrast to - * `ts_query_cursor_set_point_range`, this will restrict the query cursor to only return - * matches where _all_ nodes are _fully_ contained within the given range. Both functions - * can be used together, e.g. to search for any matches that intersect line 5000, as - * long as they are fully contained within lines 4500-5500 - */ -bool ts_query_cursor_set_containing_point_range(TSQueryCursor *self, TSPoint start_point, TSPoint end_point); +void ts_query_cursor_set_byte_range(TSQueryCursor *self, uint32_t start_byte, uint32_t end_byte); +void ts_query_cursor_set_point_range(TSQueryCursor *self, TSPoint start_point, TSPoint end_point); /** * Advance to the next match of the currently running query. @@ -1136,7 +1025,7 @@ void ts_query_cursor_remove_match(TSQueryCursor *self, uint32_t match_id); * Advance to the next capture of the currently running query. * * If there is a capture, write its match to `*match` and its index within - * the match's capture list to `*capture_index`. Otherwise, return `false`. + * the matche's capture list to `*capture_index`. Otherwise, return `false`. */ bool ts_query_cursor_next_capture( TSQueryCursor *self, @@ -1185,6 +1074,11 @@ uint32_t ts_language_symbol_count(const TSLanguage *self); */ uint32_t ts_language_state_count(const TSLanguage *self); +/** + * Get a node type string for the given numerical id. + */ +const char *ts_language_symbol_name(const TSLanguage *self, TSSymbol symbol); + /** * Get the numerical id for the given node type string. */ @@ -1210,27 +1104,6 @@ const char *ts_language_field_name_for_id(const TSLanguage *self, TSFieldId id); */ TSFieldId ts_language_field_id_for_name(const TSLanguage *self, const char *name, uint32_t name_length); -/** - * Get a list of all supertype symbols for the language. -*/ -const TSSymbol *ts_language_supertypes(const TSLanguage *self, uint32_t *length); - -/** - * Get a list of all subtype symbol ids for a given supertype symbol. - * - * See [`ts_language_supertypes`] for fetching all supertype symbols. - */ -const TSSymbol *ts_language_subtypes( - const TSLanguage *self, - TSSymbol supertype, - uint32_t *length -); - -/** - * Get a node type string for the given numerical id. - */ -const char *ts_language_symbol_name(const TSLanguage *self, TSSymbol symbol); - /** * Check whether the given node type id belongs to named nodes, anonymous nodes, * or a hidden nodes. @@ -1246,16 +1119,7 @@ TSSymbolType ts_language_symbol_type(const TSLanguage *self, TSSymbol symbol); * * See also [`ts_parser_set_language`]. */ -uint32_t ts_language_abi_version(const TSLanguage *self); - -/** - * Get the metadata for this language. This information is generated by the - * CLI, and relies on the language author providing the correct metadata in - * the language's `tree-sitter.json` file. - * - * See also [`TSMetadata`]. - */ -const TSLanguageMetadata *ts_language_metadata(const TSLanguage *self); +uint32_t ts_language_version(const TSLanguage *self); /** * Get the next parse state. Combine this with lookahead iterators to generate @@ -1264,11 +1128,6 @@ const TSLanguageMetadata *ts_language_metadata(const TSLanguage *self); */ TSStateId ts_language_next_state(const TSLanguage *self, TSStateId state, TSSymbol symbol); -/** - * Get the name of this language. This returns `NULL` in older parsers. - */ -const char *ts_language_name(const TSLanguage *self); - /********************************/ /* Section - Lookahead Iterator */ /********************************/ @@ -1383,7 +1242,7 @@ const TSLanguage *ts_wasm_store_load_language( ); /** - * Get the number of languages instantiated in the given Wasm store. + * Get the number of languages instantiated in the given wasm store. */ size_t ts_wasm_store_language_count(const TSWasmStore *); diff --git a/crates/language/Cargo.toml b/lib/language/Cargo.toml similarity index 51% rename from crates/language/Cargo.toml rename to lib/language/Cargo.toml index b6f5cdf8..55361fd0 100644 --- a/crates/language/Cargo.toml +++ b/lib/language/Cargo.toml @@ -1,23 +1,14 @@ [package] name = "tree-sitter-language" description = "The tree-sitter Language type, used by the library and by language implementations" -version = "0.1.7" +version = "0.1.0" authors.workspace = true edition.workspace = true -rust-version = "1.77" -readme = "README.md" +rust-version.workspace = true homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter-language" license.workspace = true keywords.workspace = true -categories = ["api-bindings", "development-tools::ffi", "parsing"] - -build = "build.rs" -links = "tree-sitter-language" - -[lints] -workspace = true [lib] -path = "src/language.rs" +path = "language.rs" diff --git a/crates/language/src/language.rs b/lib/language/language.rs similarity index 96% rename from crates/language/src/language.rs rename to lib/language/language.rs index cb46b8a9..504c9374 100644 --- a/crates/language/src/language.rs +++ b/lib/language/language.rs @@ -1,5 +1,5 @@ #![no_std] -/// `LanguageFn` wraps a C function that returns a pointer to a tree-sitter grammar. +/// `LanguageFn` wraps a C function that returns a pointer to a tree-sitter grammer. #[repr(transparent)] #[derive(Clone, Copy)] pub struct LanguageFn(unsafe extern "C" fn() -> *const ()); diff --git a/lib/lldb_pretty_printers/table_entry.py b/lib/lldb_pretty_printers/table_entry.py deleted file mode 100644 index f46b9d43..00000000 --- a/lib/lldb_pretty_printers/table_entry.py +++ /dev/null @@ -1,60 +0,0 @@ -from lldb import SBValue - -# typedef struct { -# const TSParseAction *actions; -# uint32_t action_count; -# bool is_reusable; -# } TableEntry; - -# TODO: Same inline issue as with `TSTreeSyntheticProvider`. - - -class TableEntrySyntheticProvider: - def __init__(self, valobj: SBValue, _dict): - self.valobj: SBValue = valobj - self.update() - - def num_children(self) -> int: - # is_reusable, action_count, actions - return 2 + max(1, self.action_count.GetValueAsUnsigned()) - - def get_child_index(self, name: str) -> int: - if name == "is_reusable": - return 0 - elif name == "action_count": - return 1 - else: - if self.action_count.GetValueAsUnsigned() == 0: - return 2 - index = name.lstrip("actions[").rstrip("]") - if index.isdigit(): - return int(index) - else: - return -1 - - def get_child_at_index(self, index: int) -> SBValue: - if index == 0: - return self.is_reusable - elif index == 1: - return self.action_count - else: - if self.action_count.GetValueAsUnsigned() == 0: - return self.actions - offset: int = index - 3 - start: int = self.actions.GetValueAsUnsigned() - address: int = start + offset * self.element_type_size - element: SBValue = self.actions.CreateValueFromAddress( - "action[%s]" % (offset), address, self.element_type - ) - return element - - def update(self): - self.is_reusable: SBValue = self.valobj.GetChildMemberWithName("is_reusable") - self.action_count: SBValue = self.valobj.GetChildMemberWithName("action_count") - self.actions: SBValue = self.valobj.GetChildMemberWithName("actions") - - self.element_type: SBType = self.actions.GetType().GetPointeeType() - self.element_type_size: int = self.element_type.GetByteSize() - - def has_children(self) -> bool: - return True diff --git a/lib/lldb_pretty_printers/tree_sitter_types.py b/lib/lldb_pretty_printers/tree_sitter_types.py deleted file mode 100644 index b26c67ac..00000000 --- a/lib/lldb_pretty_printers/tree_sitter_types.py +++ /dev/null @@ -1,64 +0,0 @@ -import lldb - -# Even though these are "unused", we still need them in scope in order for the classes -# to exist when we register them with the debugger -from ts_tree import TSTreeSyntheticProvider -from table_entry import TableEntrySyntheticProvider -from ts_array import ArraySyntheticProvider, anon_array_recognizer - - -class TreeSitterType(object): - TS_TREE: str = "TSTree" - SUBTREE_ARRAY: str = "SubtreeArray" - MUTABLE_SUBTREE_ARRAY: str = "MutableSubtreeArray" - STACK_SLICE_ARRAY: str = "StackSliceArray" - STACK_SUMMARY: str = "StackSummary" - STACK_ENTRY: str = "StackEntry" - REUSABLE_NODE: str = "ReusableNode" - REDUCE_ACTION_SET: str = "ReduceActionSet" - TABLE_ENTRY: str = "TableEntry" - TS_RANGE_ARRAY: str = "TSRangeArray" - CAPTURE_QUANTIFIERS: str = "CaptureQuantifiers" - CAPTURE_LIST: str = "CaptureList" - ANALYSIS_STATE_SET: str = "AnalysisStateSet" - ANALYSIS_SUBGRAPH_ARRAY: str = "AnalysisSubgraphArray" - STACK_NODE_ARRAY: str = "StackNodeArray" - STRING_DATA: str = "StringData" - - -def ts_type_to_regex(type: str) -> str: - return f"^{type}$|^struct {type}$|^typedef {type}$" - - -# Holds all tree-sitter types defined via the `Array` macro. These types will -# all share the same `ArrayTypeSyntheticProvider` synthetic provider -TS_ARRAY_TYPES = [ - TreeSitterType.REDUCE_ACTION_SET, - TreeSitterType.TS_RANGE_ARRAY, - TreeSitterType.CAPTURE_QUANTIFIERS, - TreeSitterType.ANALYSIS_STATE_SET, - TreeSitterType.CAPTURE_LIST, - TreeSitterType.ANALYSIS_SUBGRAPH_ARRAY, - TreeSitterType.STACK_SLICE_ARRAY, - TreeSitterType.STACK_SUMMARY, - TreeSitterType.SUBTREE_ARRAY, - TreeSitterType.MUTABLE_SUBTREE_ARRAY, - TreeSitterType.STRING_DATA, - TreeSitterType.STACK_NODE_ARRAY, -] - - -def __lldb_init_module(debugger: lldb.SBDebugger, _dict): - debugger.HandleCommand( - f"type synthetic add -l tree_sitter_types.TSTreeSyntheticProvider -x '{ts_type_to_regex(TreeSitterType.TS_TREE)}'" - ) - debugger.HandleCommand( - f"type synthetic add -l tree_sitter_types.TableEntrySyntheticProvider -x '{ts_type_to_regex(TreeSitterType.TABLE_ENTRY)}'" - ) - debugger.HandleCommand( - f"type synthetic add -l tree_sitter_types.ArraySyntheticProvider --recognizer-function tree_sitter_types.anon_array_recognizer" - ) - for type in TS_ARRAY_TYPES: - debugger.HandleCommand( - f"type synthetic add -l tree_sitter_types.ArraySyntheticProvider -x '{ts_type_to_regex(type)}'" - ) diff --git a/lib/lldb_pretty_printers/ts_array.py b/lib/lldb_pretty_printers/ts_array.py deleted file mode 100644 index f51cd0a9..00000000 --- a/lib/lldb_pretty_printers/ts_array.py +++ /dev/null @@ -1,78 +0,0 @@ -from lldb import SBValue, SBType -import re - -# define Array(T) \ -# struct { \ -# T *contents; \ -# uint32_t size; \ -# uint32_t capacity; \ -# } - - -class ArraySyntheticProvider: - def __init__(self, valobj: SBValue, _dict): - self.valobj: SBValue = valobj - self.update() - - def num_children(self) -> int: - return 2 + self.size.GetValueAsUnsigned() # size, capacity, and elements - - def get_child_index(self, name: str) -> int: - if name == "size": - return 0 - elif name == "capacity": - return 1 - else: - if self.size.GetValueAsUnsigned() == 0: - return 2 - index = name.lstrip("[").rstrip("]") - if index.isdigit(): - return int(index) - else: - return -1 - - def get_child_at_index(self, index: int) -> SBValue: - if index == 0: - return self.size - elif index == 1: - return self.capacity - else: - if self.size.GetValueAsUnsigned() == 0: - return self.contents - offset: int = index - 2 - start: int = self.contents.GetValueAsUnsigned() - address: int = start + offset * self.element_type_size - element: SBValue = self.contents.CreateValueFromAddress( - "[%s]" % (offset), address, self.element_type - ) - return element - - def update(self): - self.contents: SBValue = self.valobj.GetChildMemberWithName("contents") - self.size: SBValue = self.valobj.GetChildMemberWithName("size") - self.capacity: SBValue = self.valobj.GetChildMemberWithName("capacity") - - self.element_type: SBType = self.contents.GetType().GetPointeeType() - self.element_type_size: int = self.element_type.GetByteSize() - - def has_children(self) -> bool: - return True - - -anon_re = re.compile( - r"struct\s*{$\s*\w+ \*contents;$\s*uint32_t size;$\s*uint32_t capacity;$\s*}", - re.MULTILINE, -) - - -# Used to recognize "anonymous" `Array(T)` types, i.e.: -# struct Foo { -# Array(Bar) bars; // Render this field usign `ArraySyntheticProvider` -# }; -def anon_array_recognizer(valobj: SBType, _dict) -> bool: - type_name = valobj.GetName() - if type_name == "(unnamed struct)": - type_str = str(valobj) - return anon_re.search(type_str) is not None - else: - return False diff --git a/lib/lldb_pretty_printers/ts_tree.py b/lib/lldb_pretty_printers/ts_tree.py deleted file mode 100644 index 1f690ebd..00000000 --- a/lib/lldb_pretty_printers/ts_tree.py +++ /dev/null @@ -1,101 +0,0 @@ -from lldb import SBType, SBValue - -# struct TSTree { -# Subtree root; -# const TSLanguage *language; -# TSRange *included_ranges; -# unsigned included_range_count; -# }; - -# TODO: Ideally, we'd display the elements of `included_ranges` as -# children of `included_ranges` rather than separate items, i.e.: - -# (TSTree) { -# root = ... -# language = ... -# included_range_count = ... -# included_ranges = { -# [0] = { -# ... -# } -# [1] = { -# ... -# } -# ... -# } -# } -# -# instead of the current behavior: -# -# (TSTree) { -# root = ... -# language = ... -# included_range_count = ... -# included_ranges[0] = { -# ... -# } -# included_ranges[1] = { -# ... -# } -# } -# - - -class TSTreeSyntheticProvider: - def __init__(self, valobj: SBValue, _dict): - self.valobj: SBValue = valobj - self.update() - - def num_children(self) -> int: - # root, language, included_range_count, included_ranges - return 3 + self.included_range_count.GetValueAsUnsigned() - - def get_child_index(self, name: str) -> int: - if name == "root": - return 0 - elif name == "language": - return 1 - elif name == "included_range_count": - return 2 - else: - if self.included_range_count.GetValueAsUnsigned() == 0: - return 3 - index = name.lstrip("included_ranges[").rstrip("]") - if index.isdigit(): - return int(index) - else: - return -1 - - def get_child_at_index(self, index: int) -> SBValue: - if index == 0: - return self.root - elif index == 1: - return self.language - elif index == 2: - return self.included_range_count - else: - if self.included_range_count.GetValueAsUnsigned() == 0: - return self.included_ranges - offset: int = index - 3 - start: int = self.included_ranges.GetValueAsUnsigned() - address: int = start + offset * self.element_type_size - element: SBValue = self.included_ranges.CreateValueFromAddress( - "included_ranges[%s]" % (offset), address, self.element_type - ) - return element - - def update(self): - self.root: SBValue = self.valobj.GetChildMemberWithName("root") - self.language: SBValue = self.valobj.GetChildMemberWithName("language") - self.included_range_count: SBValue = self.valobj.GetChildMemberWithName( - "included_range_count" - ) - self.included_ranges: SBValue = self.valobj.GetChildMemberWithName( - "included_ranges" - ) - - self.element_type: SBType = self.included_ranges.GetType().GetPointeeType() - self.element_type_size: int = self.element_type.GetByteSize() - - def has_children(self) -> bool: - return True diff --git a/lib/package.nix b/lib/package.nix deleted file mode 100644 index c94d1e8c..00000000 --- a/lib/package.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - stdenv, - cmake, - pkg-config, - src, - version, - lib, -}: -stdenv.mkDerivation { - inherit src version; - pname = "tree-sitter"; - - nativeBuildInputs = [ - cmake - pkg-config - ]; - - sourceRoot = "source"; - - cmakeFlags = [ - "-DBUILD_SHARED_LIBS=ON" - "-DCMAKE_INSTALL_LIBDIR=lib" - "-DCMAKE_INSTALL_INCLUDEDIR=include" - "-DTREE_SITTER_FEATURE_WASM=OFF" - ]; - - enableParallelBuilding = true; - - postInstall = '' - mkdir -p $out/{lib/pkgconfig,share/tree-sitter} - substituteInPlace $out/lib/pkgconfig/tree-sitter.pc \ - --replace-fail "\''${prefix}" "$out" 2>/dev/null - ''; - - meta = { - description = "Tree-sitter incremental parsing library"; - longDescription = '' - Tree-sitter is a parser generator tool and an incremental parsing library. - It can build a concrete syntax tree for a source file and efficiently update - the syntax tree as the source file is edited. This package provides the core - C library that can be used to parse source code using Tree-sitter grammars. - ''; - homepage = "https://tree-sitter.github.io/tree-sitter"; - changelog = "https://github.com/tree-sitter/tree-sitter/releases/tag/v${version}"; - license = lib.licenses.mit; - maintainers = [ lib.maintainers.amaanq ]; - platforms = lib.platforms.all; - }; -} diff --git a/lib/src/alloc.h b/lib/src/alloc.h index a27b8a63..a0eadb7a 100644 --- a/lib/src/alloc.h +++ b/lib/src/alloc.h @@ -15,10 +15,10 @@ extern "C" { #define TS_PUBLIC __attribute__((visibility("default"))) #endif -TS_PUBLIC extern void *(*ts_current_malloc)(size_t size); -TS_PUBLIC extern void *(*ts_current_calloc)(size_t count, size_t size); -TS_PUBLIC extern void *(*ts_current_realloc)(void *ptr, size_t size); -TS_PUBLIC extern void (*ts_current_free)(void *ptr); +TS_PUBLIC extern void *(*ts_current_malloc)(size_t); +TS_PUBLIC extern void *(*ts_current_calloc)(size_t, size_t); +TS_PUBLIC extern void *(*ts_current_realloc)(void *, size_t); +TS_PUBLIC extern void (*ts_current_free)(void *); // Allow clients to override allocation functions #ifndef ts_malloc diff --git a/lib/src/array.h b/lib/src/array.h index d965c617..15a3b233 100644 --- a/lib/src/array.h +++ b/lib/src/array.h @@ -6,15 +6,14 @@ extern "C" { #endif #include "./alloc.h" -#include "./ts_assert.h" +#include #include #include #include #include #ifdef _MSC_VER -#pragma warning(push) #pragma warning(disable : 4101) #elif defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push @@ -38,7 +37,7 @@ extern "C" { /// Get a pointer to the element at a given `index` in the array. #define array_get(self, _index) \ - (ts_assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index]) + (assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index]) /// Get a pointer to the first element in the array. #define array_front(self) array_get(self, 0) @@ -172,7 +171,7 @@ static inline void _array__delete(Array *self) { /// This is not what you're looking for, see `array_erase`. static inline void _array__erase(Array *self, size_t element_size, uint32_t index) { - ts_assert(index < self->size); + assert(index < self->size); char *contents = (char *)self->contents; memmove(contents + index * element_size, contents + (index + 1) * element_size, (self->size - index - 1) * element_size); @@ -223,7 +222,7 @@ static inline void _array__splice(Array *self, size_t element_size, uint32_t new_size = self->size + new_count - old_count; uint32_t old_end = index + old_count; uint32_t new_end = index + new_count; - ts_assert(old_end <= self->size); + assert(old_end <= self->size); _array__reserve(self, element_size, new_size); @@ -279,7 +278,7 @@ static inline void _array__splice(Array *self, size_t element_size, #define _compare_int(a, b) ((int)*(a) - (int)(b)) #ifdef _MSC_VER -#pragma warning(pop) +#pragma warning(default : 4101) #elif defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif diff --git a/lib/src/clock.h b/lib/src/clock.h new file mode 100644 index 00000000..5d246ca7 --- /dev/null +++ b/lib/src/clock.h @@ -0,0 +1,146 @@ +#ifndef TREE_SITTER_CLOCK_H_ +#define TREE_SITTER_CLOCK_H_ + +#include +#include + +typedef uint64_t TSDuration; + +#ifdef _WIN32 + +// Windows: +// * Represent a time as a performance counter value. +// * Represent a duration as a number of performance counter ticks. + +#include +typedef uint64_t TSClock; + +static inline TSDuration duration_from_micros(uint64_t micros) { + LARGE_INTEGER frequency; + QueryPerformanceFrequency(&frequency); + return micros * (uint64_t)frequency.QuadPart / 1000000; +} + +static inline uint64_t duration_to_micros(TSDuration self) { + LARGE_INTEGER frequency; + QueryPerformanceFrequency(&frequency); + return self * 1000000 / (uint64_t)frequency.QuadPart; +} + +static inline TSClock clock_null(void) { + return 0; +} + +static inline TSClock clock_now(void) { + LARGE_INTEGER result; + QueryPerformanceCounter(&result); + return (uint64_t)result.QuadPart; +} + +static inline TSClock clock_after(TSClock base, TSDuration duration) { + return base + duration; +} + +static inline bool clock_is_null(TSClock self) { + return !self; +} + +static inline bool clock_is_gt(TSClock self, TSClock other) { + return self > other; +} + +#elif defined(CLOCK_MONOTONIC) && !defined(__APPLE__) + +// POSIX with monotonic clock support (Linux) +// * Represent a time as a monotonic (seconds, nanoseconds) pair. +// * Represent a duration as a number of microseconds. +// +// On these platforms, parse timeouts will correspond accurately to +// real time, regardless of what other processes are running. + +#include +typedef struct timespec TSClock; + +static inline TSDuration duration_from_micros(uint64_t micros) { + return micros; +} + +static inline uint64_t duration_to_micros(TSDuration self) { + return self; +} + +static inline TSClock clock_now(void) { + TSClock result; + clock_gettime(CLOCK_MONOTONIC, &result); + return result; +} + +static inline TSClock clock_null(void) { + return (TSClock) {0, 0}; +} + +static inline TSClock clock_after(TSClock base, TSDuration duration) { + TSClock result = base; + result.tv_sec += duration / 1000000; + result.tv_nsec += (duration % 1000000) * 1000; + if (result.tv_nsec >= 1000000000) { + result.tv_nsec -= 1000000000; + ++(result.tv_sec); + } + return result; +} + +static inline bool clock_is_null(TSClock self) { + return !self.tv_sec && !self.tv_nsec; +} + +static inline bool clock_is_gt(TSClock self, TSClock other) { + if (self.tv_sec > other.tv_sec) return true; + if (self.tv_sec < other.tv_sec) return false; + return self.tv_nsec > other.tv_nsec; +} + +#else + +// macOS or POSIX without monotonic clock support +// * Represent a time as a process clock value. +// * Represent a duration as a number of process clock ticks. +// +// On these platforms, parse timeouts may be affected by other processes, +// which is not ideal, but is better than using a non-monotonic time API +// like `gettimeofday`. + +#include +typedef uint64_t TSClock; + +static inline TSDuration duration_from_micros(uint64_t micros) { + return micros * (uint64_t)CLOCKS_PER_SEC / 1000000; +} + +static inline uint64_t duration_to_micros(TSDuration self) { + return self * 1000000 / (uint64_t)CLOCKS_PER_SEC; +} + +static inline TSClock clock_null(void) { + return 0; +} + +static inline TSClock clock_now(void) { + return (uint64_t)clock(); +} + +static inline TSClock clock_after(TSClock base, TSDuration duration) { + return base + duration; +} + +static inline bool clock_is_null(TSClock self) { + return !self; +} + +static inline bool clock_is_gt(TSClock self, TSClock other) { + return self > other; +} + +#endif + +#endif // TREE_SITTER_CLOCK_H_ diff --git a/lib/src/get_changed_ranges.c b/lib/src/get_changed_ranges.c index c4c63653..bcf8da94 100644 --- a/lib/src/get_changed_ranges.c +++ b/lib/src/get_changed_ranges.c @@ -3,7 +3,7 @@ #include "./language.h" #include "./error_costs.h" #include "./tree_cursor.h" -#include "./ts_assert.h" +#include // #define DEBUG_GET_CHANGED_RANGES @@ -34,7 +34,7 @@ bool ts_range_array_intersects( uint32_t end_byte ) { for (unsigned i = start_index; i < self->size; i++) { - TSRange *range = array_get(self, i); + TSRange *range = &self->contents[i]; if (range->end_byte > start_byte) { if (range->start_byte >= end_byte) break; return true; @@ -103,46 +103,11 @@ void ts_range_array_get_changed_ranges( } } -void ts_range_edit(TSRange *range, const TSInputEdit *edit) { - if (range->end_byte >= edit->old_end_byte) { - if (range->end_byte != UINT32_MAX) { - range->end_byte = edit->new_end_byte + (range->end_byte - edit->old_end_byte); - range->end_point = point_add( - edit->new_end_point, - point_sub(range->end_point, edit->old_end_point) - ); - if (range->end_byte < edit->new_end_byte) { - range->end_byte = UINT32_MAX; - range->end_point = POINT_MAX; - } - } - } else if (range->end_byte > edit->start_byte) { - range->end_byte = edit->start_byte; - range->end_point = edit->start_point; - } - - if (range->start_byte >= edit->old_end_byte) { - range->start_byte = edit->new_end_byte + (range->start_byte - edit->old_end_byte); - range->start_point = point_add( - edit->new_end_point, - point_sub(range->start_point, edit->old_end_point) - ); - if (range->start_byte < edit->new_end_byte) { - range->start_byte = UINT32_MAX; - range->start_point = POINT_MAX; - } - } else if (range->start_byte > edit->start_byte) { - range->start_byte = edit->start_byte; - range->start_point = edit->start_point; - } -} - typedef struct { TreeCursor cursor; const TSLanguage *language; unsigned visible_depth; bool in_padding; - Subtree prev_external_token; } Iterator; static Iterator iterator_new( @@ -162,7 +127,6 @@ static Iterator iterator_new( .language = language, .visible_depth = 1, .in_padding = false, - .prev_external_token = NULL_SUBTREE, }; } @@ -193,7 +157,7 @@ static bool iterator_tree_is_visible(const Iterator *self) { TreeCursorEntry entry = *array_back(&self->cursor.stack); if (ts_subtree_visible(*entry.subtree)) return true; if (self->cursor.stack.size > 1) { - Subtree parent = *array_get(&self->cursor.stack, self->cursor.stack.size - 2)->subtree; + Subtree parent = *self->cursor.stack.contents[self->cursor.stack.size - 2].subtree; return ts_language_alias_at( self->language, parent.ptr->production_id, @@ -217,10 +181,10 @@ static void iterator_get_visible_state( } for (; i + 1 > 0; i--) { - TreeCursorEntry entry = *array_get(&self->cursor.stack, i); + TreeCursorEntry entry = self->cursor.stack.contents[i]; if (i > 0) { - const Subtree *parent = array_get(&self->cursor.stack, i - 1)->subtree; + const Subtree *parent = self->cursor.stack.contents[i - 1].subtree; *alias_symbol = ts_language_alias_at( self->language, parent->ptr->production_id, @@ -280,10 +244,6 @@ static bool iterator_descend(Iterator *self, uint32_t goal_position) { position = child_right; if (!ts_subtree_extra(*child)) structural_child_index++; - Subtree last_external_token = ts_subtree_last_external_token(*child); - if (last_external_token.ptr) { - self->prev_external_token = last_external_token; - } } } while (did_descend); @@ -308,10 +268,6 @@ static void iterator_advance(Iterator *self) { const Subtree *parent = array_back(&self->cursor.stack)->subtree; uint32_t child_index = entry.child_index + 1; - Subtree last_external_token = ts_subtree_last_external_token(*entry.subtree); - if (last_external_token.ptr) { - self->prev_external_token = last_external_token; - } if (ts_subtree_child_count(*parent) > child_index) { Length position = length_add(entry.position, ts_subtree_total_size(*entry.subtree)); uint32_t structural_child_index = entry.structural_child_index; @@ -357,41 +313,29 @@ static IteratorComparison iterator_compare( TSSymbol new_alias_symbol = 0; iterator_get_visible_state(old_iter, &old_tree, &old_alias_symbol, &old_start); iterator_get_visible_state(new_iter, &new_tree, &new_alias_symbol, &new_start); - TSSymbol old_symbol = ts_subtree_symbol(old_tree); - TSSymbol new_symbol = ts_subtree_symbol(new_tree); if (!old_tree.ptr && !new_tree.ptr) return IteratorMatches; if (!old_tree.ptr || !new_tree.ptr) return IteratorDiffers; - if (old_alias_symbol != new_alias_symbol || old_symbol != new_symbol) return IteratorDiffers; - - uint32_t old_size = ts_subtree_size(old_tree).bytes; - uint32_t new_size = ts_subtree_size(new_tree).bytes; - TSStateId old_state = ts_subtree_parse_state(old_tree); - TSStateId new_state = ts_subtree_parse_state(new_tree); - bool old_has_external_tokens = ts_subtree_has_external_tokens(old_tree); - bool new_has_external_tokens = ts_subtree_has_external_tokens(new_tree); - uint32_t old_error_cost = ts_subtree_error_cost(old_tree); - uint32_t new_error_cost = ts_subtree_error_cost(new_tree); if ( - old_start != new_start || - old_symbol == ts_builtin_sym_error || - old_size != new_size || - old_state == TS_TREE_STATE_NONE || - new_state == TS_TREE_STATE_NONE || - ((old_state == ERROR_STATE) != (new_state == ERROR_STATE)) || - old_error_cost != new_error_cost || - old_has_external_tokens != new_has_external_tokens || - ts_subtree_has_changes(old_tree) || - ( - old_has_external_tokens && - !ts_subtree_external_scanner_state_eq(old_iter->prev_external_token, new_iter->prev_external_token) - ) + old_alias_symbol == new_alias_symbol && + ts_subtree_symbol(old_tree) == ts_subtree_symbol(new_tree) ) { - return IteratorMayDiffer; + if (old_start == new_start && + !ts_subtree_has_changes(old_tree) && + ts_subtree_symbol(old_tree) != ts_builtin_sym_error && + ts_subtree_size(old_tree).bytes == ts_subtree_size(new_tree).bytes && + ts_subtree_parse_state(old_tree) != TS_TREE_STATE_NONE && + ts_subtree_parse_state(new_tree) != TS_TREE_STATE_NONE && + (ts_subtree_parse_state(old_tree) == ERROR_STATE) == + (ts_subtree_parse_state(new_tree) == ERROR_STATE)) { + return IteratorMatches; + } else { + return IteratorMayDiffer; + } } - return IteratorMatches; + return IteratorDiffers; } #ifdef DEBUG_GET_CHANGED_RANGES @@ -404,8 +348,8 @@ static inline void iterator_print_state(Iterator *self) { "(%-25s %s\t depth:%u [%u, %u] - [%u, %u])", name, self->in_padding ? "(p)" : " ", self->visible_depth, - start.row, start.column, - end.row, end.column + start.row + 1, start.column, + end.row + 1, end.column ); } #endif @@ -436,7 +380,7 @@ unsigned ts_subtree_get_changed_ranges( do { #ifdef DEBUG_GET_CHANGED_RANGES - printf("At [%-2u, %-2u] Compare ", position.extent.row, position.extent.column); + printf("At [%-2u, %-2u] Compare ", position.extent.row + 1, position.extent.column); iterator_print_state(&old_iter); printf("\tvs\t"); iterator_print_state(&new_iter); @@ -531,9 +475,9 @@ unsigned ts_subtree_get_changed_ranges( // Keep track of the current position in the included range differences // array in order to avoid scanning the entire array on each iteration. while (included_range_difference_index < included_range_differences->size) { - const TSRange *range = array_get(included_range_differences, + const TSRange *range = &included_range_differences->contents[ included_range_difference_index - ); + ]; if (range->end_byte <= position.bytes) { included_range_difference_index++; } else { diff --git a/lib/src/language.c b/lib/src/language.c index de5e1f91..d49907f9 100644 --- a/lib/src/language.c +++ b/lib/src/language.c @@ -24,41 +24,8 @@ uint32_t ts_language_state_count(const TSLanguage *self) { return self->state_count; } -const TSSymbol *ts_language_supertypes(const TSLanguage *self, uint32_t *length) { - if (self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) { - *length = self->supertype_count; - return self->supertype_symbols; - } else { - *length = 0; - return NULL; - } -} - -const TSSymbol *ts_language_subtypes( - const TSLanguage *self, - TSSymbol supertype, - uint32_t *length -) { - if (self->abi_version < LANGUAGE_VERSION_WITH_RESERVED_WORDS || !ts_language_symbol_metadata(self, supertype).supertype) { - *length = 0; - return NULL; - } - - TSMapSlice slice = self->supertype_map_slices[supertype]; - *length = slice.length; - return &self->supertype_map_entries[slice.index]; -} - -uint32_t ts_language_abi_version(const TSLanguage *self) { - return self->abi_version; -} - -const TSLanguageMetadata *ts_language_metadata(const TSLanguage *self) { - return self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? &self->metadata : NULL; -} - -const char *ts_language_name(const TSLanguage *self) { - return self->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS ? self->name : NULL; +uint32_t ts_language_version(const TSLanguage *self) { + return self->version; } uint32_t ts_language_field_count(const TSLanguage *self) { @@ -76,7 +43,7 @@ void ts_language_table_entry( result->is_reusable = false; result->actions = NULL; } else { - ts_assert(symbol < self->token_count); + assert(symbol < self->token_count); uint32_t action_index = ts_language_lookup(self, state, symbol); const TSParseActionEntry *entry = &self->parse_actions[action_index]; result->action_count = entry->entry.count; @@ -85,39 +52,6 @@ void ts_language_table_entry( } } -TSLexerMode ts_language_lex_mode_for_state( - const TSLanguage *self, - TSStateId state -) { - if (self->abi_version < 15) { - TSLexMode mode = ((const TSLexMode *)self->lex_modes)[state]; - return (TSLexerMode) { - .lex_state = mode.lex_state, - .external_lex_state = mode.external_lex_state, - .reserved_word_set_id = 0, - }; - } else { - return self->lex_modes[state]; - } -} - -bool ts_language_is_reserved_word( - const TSLanguage *self, - TSStateId state, - TSSymbol symbol -) { - TSLexerMode lex_mode = ts_language_lex_mode_for_state(self, state); - if (lex_mode.reserved_word_set_id > 0) { - unsigned start = lex_mode.reserved_word_set_id * self->max_reserved_word_set_size; - unsigned end = start + self->max_reserved_word_set_size; - for (unsigned i = start; i < end; i++) { - if (self->reserved_words[i] == symbol) return true; - if (self->reserved_words[i] == 0) break; - } - } - return false; -} - TSSymbolMetadata ts_language_symbol_metadata( const TSLanguage *self, TSSymbol symbol @@ -182,7 +116,7 @@ TSSymbol ts_language_symbol_for_name( uint32_t length, bool is_named ) { - if (is_named && !strncmp(string, "ERROR", length)) return ts_builtin_sym_error; + if (!strncmp(string, "ERROR", length)) return ts_builtin_sym_error; uint16_t count = (uint16_t)ts_language_symbol_count(self); for (TSSymbol i = 0; i < count; i++) { TSSymbolMetadata metadata = ts_language_symbol_metadata(self, i); @@ -204,8 +138,6 @@ TSSymbolType ts_language_symbol_type( return TSSymbolTypeRegular; } else if (metadata.visible) { return TSSymbolTypeAnonymous; - } else if (metadata.supertype) { - return TSSymbolTypeSupertype; } else { return TSSymbolTypeAuxiliary; } diff --git a/lib/src/language.h b/lib/src/language.h index 518c06bf..daaee9a4 100644 --- a/lib/src/language.h +++ b/lib/src/language.h @@ -10,8 +10,8 @@ extern "C" { #define ts_builtin_sym_error_repeat (ts_builtin_sym_error - 1) -#define LANGUAGE_VERSION_WITH_RESERVED_WORDS 15 #define LANGUAGE_VERSION_WITH_PRIMARY_STATES 14 +#define LANGUAGE_VERSION_USABLE_VIA_WASM 13 typedef struct { const TSParseAction *actions; @@ -35,11 +35,17 @@ typedef struct { uint16_t action_count; } LookaheadIterator; -void ts_language_table_entry(const TSLanguage *self, TSStateId state, TSSymbol symbol, TableEntry *result); -TSLexerMode ts_language_lex_mode_for_state(const TSLanguage *self, TSStateId state); -bool ts_language_is_reserved_word(const TSLanguage *self, TSStateId state, TSSymbol symbol); -TSSymbolMetadata ts_language_symbol_metadata(const TSLanguage *self, TSSymbol symbol); -TSSymbol ts_language_public_symbol(const TSLanguage *self, TSSymbol symbol); +void ts_language_table_entry(const TSLanguage *, TSStateId, TSSymbol, TableEntry *); + +TSSymbolMetadata ts_language_symbol_metadata(const TSLanguage *, TSSymbol); + +TSSymbol ts_language_public_symbol(const TSLanguage *, TSSymbol); + +TSStateId ts_language_next_state(const TSLanguage *self, TSStateId state, TSSymbol symbol); + +static inline bool ts_language_is_symbol_external(const TSLanguage *self, TSSymbol symbol) { + return 0 < symbol && symbol < self->external_token_count + 1; +} static inline const TSParseAction *ts_language_actions( const TSLanguage *self, @@ -183,7 +189,7 @@ static inline bool ts_language_state_is_primary( const TSLanguage *self, TSStateId state ) { - if (self->abi_version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) { + if (self->version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) { return state == self->primary_state_ids[state]; } else { return true; @@ -232,7 +238,7 @@ static inline void ts_language_field_map( return; } - TSMapSlice slice = self->field_map_slices[production_id]; + TSFieldMapSlice slice = self->field_map_slices[production_id]; *start = &self->field_map_entries[slice.index]; *end = &self->field_map_entries[slice.index] + slice.length; } @@ -266,6 +272,7 @@ static inline void ts_language_write_symbol_as_dot_string( TSSymbol symbol ) { const char *name = ts_language_symbol_name(self, symbol); + printf("name: %s\n", name); for (const char *chr = name; *chr; chr++) { switch (*chr) { case '"': diff --git a/lib/src/length.h b/lib/src/length.h index ddf156ce..42d61ef3 100644 --- a/lib/src/length.h +++ b/lib/src/length.h @@ -31,7 +31,7 @@ static inline Length length_add(Length len1, Length len2) { static inline Length length_sub(Length len1, Length len2) { Length result; - result.bytes = (len1.bytes >= len2.bytes) ? len1.bytes - len2.bytes : 0; + result.bytes = len1.bytes - len2.bytes; result.extent = point_sub(len1.extent, len2.extent); return result; } diff --git a/lib/src/lexer.c b/lib/src/lexer.c index 1709c418..e795618d 100644 --- a/lib/src/lexer.c +++ b/lib/src/lexer.c @@ -1,11 +1,9 @@ -#include "./length.h" -#include "./lexer.h" -#include "./unicode.h" - -#include "tree_sitter/api.h" - -#include #include +#include "./lexer.h" +#include "./subtree.h" +#include "./length.h" +#include "./unicode.h" +#include #define LOG(message, character) \ if (self->logger.log) { \ @@ -39,35 +37,6 @@ static const TSRange DEFAULT_RANGE = { .end_byte = UINT32_MAX }; -/** - * Sets the column data to the given value and marks it valid. - * @param self The lexer state. - * @param val The new value of the column data. - */ -static void ts_lexer__set_column_data(Lexer *self, uint32_t val) { - self->column_data.valid = true; - self->column_data.value = val; -} - -/** - * Increments the value of the column data; no-op if invalid. - * @param self The lexer state. - */ -static void ts_lexer__increment_column_data(Lexer *self) { - if (self->column_data.valid) { - self->column_data.value++; - } -} - -/** - * Marks the column data as invalid. - * @param self The lexer state. - */ -static void ts_lexer__invalidate_column_data(Lexer *self) { - self->column_data.valid = false; - self->column_data.value = 0; -} - // Check if the lexer has reached EOF. This state is stored // by setting the lexer's `current_included_range_index` such that // it has consumed all of its available ranges. @@ -114,10 +83,9 @@ static void ts_lexer__get_lookahead(Lexer *self) { } const uint8_t *chunk = (const uint8_t *)self->chunk + position_in_chunk; - TSDecodeFunction decode = - self->input.encoding == TSInputEncodingUTF8 ? ts_decode_utf8 : - self->input.encoding == TSInputEncodingUTF16LE ? ts_decode_utf16_le : - self->input.encoding == TSInputEncodingUTF16BE ? ts_decode_utf16_be : self->input.decode; + UnicodeDecodeFunction decode = self->input.encoding == TSInputEncodingUTF8 + ? ts_decode_utf8 + : ts_decode_utf16; self->lookahead_size = decode(chunk, size, &self->data.lookahead); @@ -136,10 +104,6 @@ static void ts_lexer__get_lookahead(Lexer *self) { } static void ts_lexer_goto(Lexer *self, Length position) { - if (position.bytes != self->current_position.bytes) { - ts_lexer__invalidate_column_data(self); - } - self->current_position = position; // Move to the first valid position at or after the given position. @@ -192,24 +156,16 @@ static void ts_lexer_goto(Lexer *self, Length position) { } } -/** - * Actually advances the lexer. Does not log anything. - * @param self The lexer state. - * @param skip Whether to mark the consumed codepoint as whitespace. - */ +// Intended to be called only from functions that control logging. static void ts_lexer__do_advance(Lexer *self, bool skip) { if (self->lookahead_size) { + self->current_position.bytes += self->lookahead_size; if (self->data.lookahead == '\n') { self->current_position.extent.row++; self->current_position.extent.column = 0; - ts_lexer__set_column_data(self, 0); } else { - bool is_bom = self->current_position.bytes == 0 && - self->data.lookahead == BYTE_ORDER_MARK; - if (!is_bom) ts_lexer__increment_column_data(self); self->current_position.extent.column += self->lookahead_size; } - self->current_position.bytes += self->lookahead_size; } const TSRange *current_range = &self->included_ranges[self->current_included_range_index]; @@ -293,33 +249,27 @@ static void ts_lexer__mark_end(TSLexer *_self) { static uint32_t ts_lexer__get_column(TSLexer *_self) { Lexer *self = (Lexer *)_self; + uint32_t goal_byte = self->current_position.bytes; + self->did_get_column = true; + self->current_position.bytes -= self->current_position.extent.column; + self->current_position.extent.column = 0; - if (!self->column_data.valid) { - // Record current position - uint32_t goal_byte = self->current_position.bytes; - - // Back up to the beginning of the line - Length start_of_col = { - self->current_position.bytes - self->current_position.extent.column, - {self->current_position.extent.row, 0}, - }; - ts_lexer_goto(self, start_of_col); - ts_lexer__set_column_data(self, 0); + if (self->current_position.bytes < self->chunk_start) { ts_lexer__get_chunk(self); + } - if (!ts_lexer__eof(_self)) { - ts_lexer__get_lookahead(self); - - // Advance to the recorded position - while (self->current_position.bytes < goal_byte && !ts_lexer__eof(_self) && self->chunk) { - ts_lexer__do_advance(self, false); - if (ts_lexer__eof(_self)) break; - } + uint32_t result = 0; + if (!ts_lexer__eof(_self)) { + ts_lexer__get_lookahead(self); + while (self->current_position.bytes < goal_byte && self->chunk) { + result++; + ts_lexer__do_advance(self, false); + if (ts_lexer__eof(_self)) break; } } - return self->column_data.value; + return result; } // Is the lexer at a boundary between two disjoint included ranges of @@ -372,11 +322,6 @@ void ts_lexer_init(Lexer *self) { .included_ranges = NULL, .included_range_count = 0, .current_included_range_index = 0, - .did_get_column = false, - .column_data = { - .valid = false, - .value = 0 - } }; ts_lexer_set_included_ranges(self, NULL, 0); } @@ -407,12 +352,10 @@ void ts_lexer_start(Lexer *self) { if (!ts_lexer__eof(&self->data)) { if (!self->chunk_size) ts_lexer__get_chunk(self); if (!self->lookahead_size) ts_lexer__get_lookahead(self); - if (self->current_position.bytes == 0) { - if (self->data.lookahead == BYTE_ORDER_MARK) { - ts_lexer__advance(&self->data, true); - } - ts_lexer__set_column_data(self, 0); - } + if ( + self->current_position.bytes == 0 && + self->data.lookahead == BYTE_ORDER_MARK + ) ts_lexer__advance(&self->data, true); } } @@ -443,6 +386,12 @@ void ts_lexer_finish(Lexer *self, uint32_t *lookahead_end_byte) { } } +void ts_lexer_advance_to_end(Lexer *self) { + while (self->chunk) { + ts_lexer__advance(&self->data, false); + } +} + void ts_lexer_mark_end(Lexer *self) { ts_lexer__mark_end(&self->data); } diff --git a/lib/src/lexer.h b/lib/src/lexer.h index 7f451e3f..445c4fdc 100644 --- a/lib/src/lexer.h +++ b/lib/src/lexer.h @@ -10,11 +10,6 @@ extern "C" { #include "tree_sitter/api.h" #include "./parser.h" -typedef struct { - uint32_t value; - bool valid; -} ColumnData; - typedef struct { TSLexer data; Length current_position; @@ -32,18 +27,18 @@ typedef struct { uint32_t chunk_size; uint32_t lookahead_size; bool did_get_column; - ColumnData column_data; char debug_buffer[TREE_SITTER_SERIALIZATION_BUFFER_SIZE]; } Lexer; -void ts_lexer_init(Lexer *self); -void ts_lexer_delete(Lexer *self); -void ts_lexer_set_input(Lexer *self, TSInput input); -void ts_lexer_reset(Lexer *self, Length position); -void ts_lexer_start(Lexer *self); -void ts_lexer_finish(Lexer *self, uint32_t *lookahead_end_byte); -void ts_lexer_mark_end(Lexer *self); +void ts_lexer_init(Lexer *); +void ts_lexer_delete(Lexer *); +void ts_lexer_set_input(Lexer *, TSInput); +void ts_lexer_reset(Lexer *, Length); +void ts_lexer_start(Lexer *); +void ts_lexer_finish(Lexer *, uint32_t *); +void ts_lexer_advance_to_end(Lexer *); +void ts_lexer_mark_end(Lexer *); bool ts_lexer_set_included_ranges(Lexer *self, const TSRange *ranges, uint32_t count); TSRange *ts_lexer_included_ranges(const Lexer *self, uint32_t *count); diff --git a/lib/src/lib.c b/lib/src/lib.c index f56be97a..70671ee6 100644 --- a/lib/src/lib.c +++ b/lib/src/lib.c @@ -1,10 +1,11 @@ +#define _POSIX_C_SOURCE 200112L + #include "./alloc.c" #include "./get_changed_ranges.c" #include "./language.c" #include "./lexer.c" #include "./node.c" #include "./parser.c" -#include "./point.c" #include "./query.c" #include "./stack.c" #include "./subtree.c" diff --git a/lib/src/node.c b/lib/src/node.c index 84ffed28..83d48cb8 100644 --- a/lib/src/node.c +++ b/lib/src/node.c @@ -1,5 +1,4 @@ #include -#include "./point.h" #include "./subtree.h" #include "./tree.h" #include "./language.h" @@ -104,6 +103,21 @@ static inline bool ts_node_child_iterator_next( return true; } +// This will return true if the next sibling is a zero-width token that is adjacent to the current node and is relevant +static inline bool ts_node_child_iterator_next_sibling_is_empty_adjacent(NodeChildIterator *self, TSNode previous) { + if (!self->parent.ptr || ts_node_child_iterator_done(self)) return false; + if (self->child_index == 0) return false; + const Subtree *child = &ts_subtree_children(self->parent)[self->child_index]; + TSSymbol alias = 0; + if (!ts_subtree_extra(*child)) { + if (self->alias_sequence) { + alias = self->alias_sequence[self->structural_child_index]; + } + } + TSNode next = ts_node_new(self->tree, child, self->position, alias); + return ts_node_end_byte(previous) == ts_node_end_byte(next) && ts_node__is_relevant(next, true); +} + // TSNode - private static inline bool ts_node__is_relevant(TSNode self, bool include_anonymous) { @@ -263,16 +277,8 @@ static inline TSNode ts_node__next_sibling(TSNode self, bool include_anonymous) TSNode child; NodeChildIterator iterator = ts_node_iterate_children(&node); while (ts_node_child_iterator_next(&iterator, &child)) { - if (iterator.position.bytes <= target_end_byte) continue; - uint32_t start_byte = ts_node_start_byte(self); - uint32_t child_start_byte = ts_node_start_byte(child); - - bool is_empty = start_byte == target_end_byte; - bool contains_target = is_empty ? - child_start_byte < start_byte : - child_start_byte <= start_byte; - - if (contains_target) { + if (iterator.position.bytes < target_end_byte) continue; + if (ts_node_start_byte(child) <= ts_node_start_byte(self)) { if (ts_node__subtree(child).ptr != ts_node__subtree(self).ptr) { child_containing_target = child; } @@ -356,9 +362,6 @@ static inline TSNode ts_node__descendant_for_byte_range( uint32_t range_end, bool include_anonymous ) { - if (range_start > range_end) { - return ts_node__null(); - } TSNode node = self; TSNode last_visible_node = self; @@ -372,13 +375,9 @@ static inline TSNode ts_node__descendant_for_byte_range( uint32_t node_end = iterator.position.bytes; // The end of this node must extend far enough forward to touch - // the end of the range + // the end of the range and exceed the start of the range. if (node_end < range_end) continue; - - // ...and exceed the start of the range, unless the node itself is - // empty, in which case it must at least be equal to the start of the range. - bool is_empty = ts_node_start_byte(child) == node_end; - if (is_empty ? node_end < range_start : node_end <= range_start) continue; + if (node_end <= range_start) continue; // The start of this node must extend far enough backward to // touch the start of the range. @@ -402,9 +401,6 @@ static inline TSNode ts_node__descendant_for_point_range( TSPoint range_end, bool include_anonymous ) { - if (point_gt(range_start, range_end)) { - return ts_node__null(); - } TSNode node = self; TSNode last_visible_node = self; @@ -418,15 +414,9 @@ static inline TSNode ts_node__descendant_for_point_range( TSPoint node_end = iterator.position.extent; // The end of this node must extend far enough forward to touch - // the end of the range + // the end of the range and exceed the start of the range. if (point_lt(node_end, range_end)) continue; - - // ...and exceed the start of the range, unless the node itself is - // empty, in which case it must at least be equal to the start of the range. - bool is_empty = point_eq(ts_node_start_point(child), node_end); - if (is_empty ? point_lt(node_end, range_start) : point_lte(node_end, range_start)) { - continue; - } + if (point_lte(node_end, range_start)) continue; // The start of this node must extend far enough backward to // touch the start of the range. @@ -549,18 +539,17 @@ TSNode ts_node_parent(TSNode self) { if (node.id == self.id) return ts_node__null(); while (true) { - TSNode next_node = ts_node_child_with_descendant(node, self); - if (next_node.id == self.id || ts_node_is_null(next_node)) break; - node = next_node; + TSNode next_node = ts_node_child_containing_descendant(node, self); + if (ts_node_is_null(next_node)) break; + node = next_node; } return node; } -TSNode ts_node_child_with_descendant(TSNode self, TSNode descendant) { - uint32_t start_byte = ts_node_start_byte(descendant); - uint32_t end_byte = ts_node_end_byte(descendant); - bool is_empty = start_byte == end_byte; +TSNode ts_node_child_containing_descendant(TSNode self, TSNode subnode) { + uint32_t start_byte = ts_node_start_byte(subnode); + uint32_t end_byte = ts_node_end_byte(subnode); do { NodeChildIterator iter = ts_node_iterate_children(&self); @@ -568,23 +557,29 @@ TSNode ts_node_child_with_descendant(TSNode self, TSNode descendant) { if ( !ts_node_child_iterator_next(&iter, &self) || ts_node_start_byte(self) > start_byte + || self.id == subnode.id ) { return ts_node__null(); } - if (self.id == descendant.id) { - return self; - } - // If the descendant is empty, and the end byte is within `self`, - // we check whether `self` contains it or not. - if (is_empty && iter.position.bytes >= end_byte && ts_node_child_count(self) > 0) { - TSNode child = ts_node_child_with_descendant(self, descendant); - // If the child is not null, return self if it's relevant, else return the child - if (!ts_node_is_null(child)) { - return ts_node__is_relevant(self, true) ? self : child; + // Here we check the current self node and *all* of its zero-width token siblings that follow. + // If any of these nodes contain the target subnode, we return that node. Otherwise, we restore the node we started at + // for the loop condition, and that will continue with the next *non-zero-width* sibling. + TSNode old = self; + // While the next sibling is a zero-width token + while (ts_node_child_iterator_next_sibling_is_empty_adjacent(&iter, self)) { + TSNode current_node = ts_node_child_containing_descendant(self, subnode); + // If the target child is in self, return it + if (!ts_node_is_null(current_node)) { + return current_node; + } + ts_node_child_iterator_next(&iter, &self); + if (self.id == subnode.id) { + return ts_node__null(); } } - } while ((is_empty ? iter.position.bytes <= end_byte : iter.position.bytes < end_byte) || ts_node_child_count(self) == 0); + self = old; + } while (iter.position.bytes < end_byte || ts_node_child_count(self) == 0); } while (!ts_node__is_relevant(self, true)); return self; @@ -861,7 +856,13 @@ void ts_node_edit(TSNode *self, const TSInputEdit *edit) { uint32_t start_byte = ts_node_start_byte(*self); TSPoint start_point = ts_node_start_point(*self); - ts_point_edit(&start_point, &start_byte, edit); + if (start_byte >= edit->old_end_byte) { + start_byte = edit->new_end_byte + (start_byte - edit->old_end_byte); + start_point = point_add(edit->new_end_point, point_sub(start_point, edit->old_end_point)); + } else if (start_byte > edit->start_byte) { + start_byte = edit->new_end_byte; + start_point = edit->new_end_point; + } self->context[0] = start_byte; self->context[1] = start_point.row; diff --git a/lib/src/parser.c b/lib/src/parser.c index bb247911..3d40c06e 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -1,3 +1,7 @@ +#define _POSIX_C_SOURCE 200112L + +#include +#include #include #include #include @@ -5,6 +9,8 @@ #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" +#include "./atomic.h" +#include "./clock.h" #include "./error_costs.h" #include "./get_changed_ranges.h" #include "./language.h" @@ -15,7 +21,6 @@ #include "./stack.h" #include "./subtree.h" #include "./tree.h" -#include "./ts_assert.h" #include "./wasm_store.h" #define LOG(...) \ @@ -77,8 +82,8 @@ static const unsigned MAX_VERSION_COUNT = 6; static const unsigned MAX_VERSION_COUNT_OVERFLOW = 4; static const unsigned MAX_SUMMARY_DEPTH = 16; -static const unsigned MAX_COST_DIFFERENCE = 18 * ERROR_COST_PER_SKIPPED_TREE; -static const unsigned OP_COUNT_PER_PARSER_CALLBACK_CHECK = 100; +static const unsigned MAX_COST_DIFFERENCE = 16 * ERROR_COST_PER_SKIPPED_TREE; +static const unsigned OP_COUNT_PER_PARSER_TIMEOUT_CHECK = 100; typedef struct { Subtree token; @@ -101,16 +106,15 @@ struct TSParser { ReusableNode reusable_node; void *external_scanner_payload; FILE *dot_graph_file; + TSClock end_clock; + TSDuration timeout_duration; unsigned accept_count; unsigned operation_count; + const volatile size_t *cancellation_flag; Subtree old_tree; TSRangeArray included_range_differences; - TSParseOptions parse_options; - TSParseState parse_state; unsigned included_range_difference_index; bool has_scanner_error; - bool canceled_balancing; - bool has_error; }; typedef struct { @@ -187,7 +191,7 @@ static bool ts_parser__breakdown_top_of_stack( did_break_down = true; pending = false; for (uint32_t i = 0; i < pop.size; i++) { - StackSlice slice = *array_get(&pop, i); + StackSlice slice = pop.contents[i]; TSStateId state = ts_stack_state(self->stack, slice.version); Subtree parent = *array_front(&slice.subtrees); @@ -202,12 +206,18 @@ static bool ts_parser__breakdown_top_of_stack( } ts_subtree_retain(child); - ts_stack_push(self->stack, slice.version, child, pending, state); + ts_stack_push(self->stack, slice.version, child, pending, state, self->language); + LOG("push 1"); + printf("push 1\n"); + LOG_STACK(); } for (uint32_t j = 1; j < slice.subtrees.size; j++) { - Subtree tree = *array_get(&slice.subtrees, j); - ts_stack_push(self->stack, slice.version, tree, false, state); + Subtree tree = slice.subtrees.contents[j]; + ts_stack_push(self->stack, slice.version, tree, false, state, self->language); + LOG("push 2"); + printf("push 2\n"); + LOG_STACK(); } ts_subtree_release(&self->tree_pool, parent); @@ -338,7 +348,7 @@ static bool ts_parser__better_version_exists( return false; } -static bool ts_parser__call_main_lex_fn(TSParser *self, TSLexerMode lex_mode) { +static bool ts_parser__call_main_lex_fn(TSParser *self, TSLexMode lex_mode) { if (ts_language_is_wasm(self->language)) { return ts_wasm_store_call_lex_main(self->wasm_store, lex_mode.lex_state); } else { @@ -346,7 +356,7 @@ static bool ts_parser__call_main_lex_fn(TSParser *self, TSLexerMode lex_mode) { } } -static bool ts_parser__call_keyword_lex_fn(TSParser *self) { +static bool ts_parser__call_keyword_lex_fn(TSParser *self, TSLexMode lex_mode) { if (ts_language_is_wasm(self->language)) { return ts_wasm_store_call_lex_keyword(self->wasm_store, 0); } else { @@ -390,24 +400,20 @@ static void ts_parser__external_scanner_destroy( static unsigned ts_parser__external_scanner_serialize( TSParser *self ) { - uint32_t length; if (ts_language_is_wasm(self->language)) { - length = ts_wasm_store_call_scanner_serialize( + return ts_wasm_store_call_scanner_serialize( self->wasm_store, (uintptr_t)self->external_scanner_payload, self->lexer.debug_buffer ); - if (ts_wasm_store_has_error(self->wasm_store)) { - self->has_scanner_error = true; - } } else { - length = self->language->external_scanner.serialize( + uint32_t length = self->language->external_scanner.serialize( self->external_scanner_payload, self->lexer.debug_buffer ); + assert(length <= TREE_SITTER_SERIALIZATION_BUFFER_SIZE); + return length; } - ts_assert(length <= TREE_SITTER_SERIALIZATION_BUFFER_SIZE); - return length; } static void ts_parser__external_scanner_deserialize( @@ -473,10 +479,10 @@ static bool ts_parser__can_reuse_first_leaf( Subtree tree, TableEntry *table_entry ) { + TSLexMode current_lex_mode = self->language->lex_modes[state]; TSSymbol leaf_symbol = ts_subtree_leaf_symbol(tree); TSStateId leaf_state = ts_subtree_leaf_parse_state(tree); - TSLexerMode current_lex_mode = ts_language_lex_mode_for_state(self->language, state); - TSLexerMode leaf_lex_mode = ts_language_lex_mode_for_state(self->language, leaf_state); + TSLexMode leaf_lex_mode = self->language->lex_modes[leaf_state]; // At the end of a non-terminal extra node, the lexer normally returns // NULL, which indicates that the parser should look for a reduce action @@ -487,7 +493,7 @@ static bool ts_parser__can_reuse_first_leaf( // If the token was created in a state with the same set of lookaheads, it is reusable. if ( table_entry->action_count > 0 && - memcmp(&leaf_lex_mode, ¤t_lex_mode, sizeof(TSLexerMode)) == 0 && + memcmp(&leaf_lex_mode, ¤t_lex_mode, sizeof(TSLexMode)) == 0 && ( leaf_symbol != self->language->keyword_capture_token || (!ts_subtree_is_keyword(tree) && ts_subtree_parse_state(tree) == state) @@ -507,7 +513,7 @@ static Subtree ts_parser__lex( StackVersion version, TSStateId parse_state ) { - TSLexerMode lex_mode = ts_language_lex_mode_for_state(self->language, parse_state); + TSLexMode lex_mode = self->language->lex_modes[parse_state]; if (lex_mode.lex_state == (uint16_t)-1) { LOG("no_lookahead_after_non_terminal_extra"); return NULL_SUBTREE; @@ -531,7 +537,6 @@ static Subtree ts_parser__lex( for (;;) { bool found_token = false; Length current_position = self->lexer.current_position; - ColumnData column_data = self->lexer.column_data; if (lex_mode.external_lex_state != 0) { LOG( @@ -554,29 +559,27 @@ static Subtree ts_parser__lex( external_scanner_state_len ); - // Avoid infinite loops caused by the external scanner returning empty tokens. - // Empty tokens are needed in some circumstances, e.g. indent/dedent tokens - // in Python. Ignore the following classes of empty tokens: + // When recovering from an error, ignore any zero-length external tokens + // unless they have changed the external scanner's state. This helps to + // avoid infinite loops which could otherwise occur, because the lexer is + // looking for any possible token, instead of looking for the specific set of + // tokens that are valid in some parse state. // - // * Tokens produced during error recovery. When recovering from an error, - // all tokens are allowed, so it's easy to accidentally return unwanted - // empty tokens. - // * Tokens that are marked as 'extra' in the grammar. These don't change - // the parse state, so they would definitely cause an infinite loop. + // Note that it's possible that the token end position may be *before* the + // original position of the lexer because of the way that tokens are positioned + // at included range boundaries: when a token is terminated at the start of + // an included range, it is marked as ending at the *end* of the preceding + // included range. if ( self->lexer.token_end_position.bytes <= current_position.bytes && + (error_mode || !ts_stack_has_advanced_since_error(self->stack, version)) && !external_scanner_state_changed ) { - TSSymbol symbol = self->language->external_scanner.symbol_map[self->lexer.data.result_symbol]; - TSStateId next_parse_state = ts_language_next_state(self->language, parse_state, symbol); - bool token_is_extra = (next_parse_state == parse_state); - if (error_mode || !ts_stack_has_advanced_since_error(self->stack, version) || token_is_extra) { - LOG( - "ignore_empty_external_token symbol:%s", - SYM_NAME(self->language->external_scanner.symbol_map[self->lexer.data.result_symbol]) - ); - found_token = false; - } + LOG( + "ignore_empty_external_token symbol:%s", + SYM_NAME(self->language->external_scanner.symbol_map[self->lexer.data.result_symbol]) + ) + found_token = false; } } @@ -587,7 +590,6 @@ static Subtree ts_parser__lex( } ts_lexer_reset(&self->lexer, current_position); - self->lexer.column_data = column_data; } LOG( @@ -603,7 +605,7 @@ static Subtree ts_parser__lex( if (!error_mode) { error_mode = true; - lex_mode = ts_language_lex_mode_for_state(self->language, ERROR_STATE); + lex_mode = self->language->lex_modes[ERROR_STATE]; ts_lexer_reset(&self->lexer, start_position); continue; } @@ -655,15 +657,12 @@ static Subtree ts_parser__lex( ts_lexer_reset(&self->lexer, self->lexer.token_start_position); ts_lexer_start(&self->lexer); - is_keyword = ts_parser__call_keyword_lex_fn(self); + is_keyword = ts_parser__call_keyword_lex_fn(self, lex_mode); if ( is_keyword && self->lexer.token_end_position.bytes == end_byte && - ( - ts_language_has_actions(self->language, parse_state, self->lexer.data.result_symbol) || - ts_language_is_reserved_word(self->language, parse_state, self->lexer.data.result_symbol) - ) + ts_language_has_actions(self->language, parse_state, self->lexer.data.result_symbol) ) { symbol = self->lexer.data.result_symbol; } @@ -920,7 +919,10 @@ static void ts_parser__shift( subtree_to_push = ts_subtree_from_mut(result); } - ts_stack_push(self->stack, version, subtree_to_push, !is_leaf, state); + ts_stack_push(self->stack, version, subtree_to_push, !is_leaf, state, self->language); + LOG("push 3"); + printf("push 3\n"); + LOG_STACK(); if (ts_subtree_has_external_tokens(subtree_to_push)) { ts_stack_set_last_external_token( self->stack, version, ts_subtree_last_external_token(subtree_to_push) @@ -947,22 +949,20 @@ static StackVersion ts_parser__reduce( // children. StackSliceArray pop = ts_stack_pop_count(self->stack, version, count); uint32_t removed_version_count = 0; - uint32_t halted_version_count = ts_stack_halted_version_count(self->stack); for (uint32_t i = 0; i < pop.size; i++) { - StackSlice slice = *array_get(&pop, i); + StackSlice slice = pop.contents[i]; StackVersion slice_version = slice.version - removed_version_count; // This is where new versions are added to the parse stack. The versions // will all be sorted and truncated at the end of the outer parsing loop. // Allow the maximum version count to be temporarily exceeded, but only // by a limited threshold. - if (slice_version > MAX_VERSION_COUNT + MAX_VERSION_COUNT_OVERFLOW + halted_version_count) { + if (slice_version > MAX_VERSION_COUNT + MAX_VERSION_COUNT_OVERFLOW) { ts_stack_remove_version(self->stack, slice_version); ts_subtree_array_delete(&self->tree_pool, &slice.subtrees); removed_version_count++; while (i + 1 < pop.size) { - LOG("aborting reduce with too many versions") - StackSlice next_slice = *array_get(&pop, i + 1); + StackSlice next_slice = pop.contents[i + 1]; if (next_slice.version != slice.version) break; ts_subtree_array_delete(&self->tree_pool, &next_slice.subtrees); i++; @@ -985,7 +985,7 @@ static StackVersion ts_parser__reduce( // choose one of the arrays of trees to be the parent node's children, and // delete the rest of the tree arrays. while (i + 1 < pop.size) { - StackSlice next_slice = *array_get(&pop, i + 1); + StackSlice next_slice = pop.contents[i + 1]; if (next_slice.version != slice.version) break; i++; @@ -1025,9 +1025,15 @@ static StackVersion ts_parser__reduce( // Push the parent node onto the stack, along with any extra tokens that // were previously on top of the stack. - ts_stack_push(self->stack, slice_version, ts_subtree_from_mut(parent), false, next_state); + ts_stack_push(self->stack, slice_version, ts_subtree_from_mut(parent), false, next_state, self->language); + LOG("push 4"); + printf("push 4\n"); + LOG_STACK(); for (uint32_t j = 0; j < self->trailing_extras.size; j++) { - ts_stack_push(self->stack, slice_version, *array_get(&self->trailing_extras, j), false, next_state); + ts_stack_push(self->stack, slice_version, self->trailing_extras.contents[j], false, next_state, self->language); + LOG("push 5"); + printf("push 5\n"); + LOG_STACK(); } for (StackVersion j = 0; j < slice_version; j++) { @@ -1050,18 +1056,24 @@ static void ts_parser__accept( StackVersion version, Subtree lookahead ) { - ts_assert(ts_subtree_is_eof(lookahead)); - ts_stack_push(self->stack, version, lookahead, false, 1); + assert(ts_subtree_is_eof(lookahead)); + ts_stack_push(self->stack, version, lookahead, false, 1, self->language); + LOG("push 6"); + printf("push 6\n"); + LOG_STACK(); - StackSliceArray pop = ts_stack_pop_all(self->stack, version); + LOG("POP ALL") + printf("POP ALL\n"); + StackSliceArray pop = ts_stack_pop_all(self->stack, version, self->dot_graph_file); + LOG_STACK(); for (uint32_t i = 0; i < pop.size; i++) { - SubtreeArray trees = array_get(&pop, i)->subtrees; + SubtreeArray trees = pop.contents[i].subtrees; Subtree root = NULL_SUBTREE; for (uint32_t j = trees.size - 1; j + 1 > 0; j--) { - Subtree tree = *array_get(&trees, j); + Subtree tree = trees.contents[j]; if (!ts_subtree_extra(tree)) { - ts_assert(!tree.data.is_inline); + assert(!tree.data.is_inline); uint32_t child_count = ts_subtree_child_count(tree); const Subtree *children = ts_subtree_children(tree); for (uint32_t k = 0; k < child_count; k++) { @@ -1079,7 +1091,7 @@ static void ts_parser__accept( } } - ts_assert(root.ptr); + assert(root.ptr); self->accept_count++; if (self->finished_tree.ptr) { @@ -1094,7 +1106,7 @@ static void ts_parser__accept( } } - ts_stack_remove_version(self->stack, array_get(&pop, 0)->version); + ts_stack_remove_version(self->stack, pop.contents[0].version); ts_stack_halt(self->stack, version); } @@ -1160,7 +1172,7 @@ static bool ts_parser__do_all_potential_reductions( StackVersion reduction_version = STACK_VERSION_NONE; for (uint32_t j = 0; j < self->reduce_actions.size; j++) { - ReduceAction action = *array_get(&self->reduce_actions, j); + ReduceAction action = self->reduce_actions.contents[j]; reduction_version = ts_parser__reduce( self, version, action.symbol, action.count, @@ -1198,7 +1210,7 @@ static bool ts_parser__recover_to_state( StackVersion previous_version = STACK_VERSION_NONE; for (unsigned i = 0; i < pop.size; i++) { - StackSlice slice = *array_get(&pop, i); + StackSlice slice = pop.contents[i]; if (slice.version == previous_version) { ts_subtree_array_delete(&self->tree_pool, &slice.subtrees); @@ -1215,13 +1227,13 @@ static bool ts_parser__recover_to_state( SubtreeArray error_trees = ts_stack_pop_error(self->stack, slice.version); if (error_trees.size > 0) { - ts_assert(error_trees.size == 1); - Subtree error_tree = *array_get(&error_trees, 0); + assert(error_trees.size == 1); + Subtree error_tree = error_trees.contents[0]; uint32_t error_child_count = ts_subtree_child_count(error_tree); if (error_child_count > 0) { array_splice(&slice.subtrees, 0, 0, error_child_count, ts_subtree_children(error_tree)); for (unsigned j = 0; j < error_child_count; j++) { - ts_subtree_retain(*array_get(&slice.subtrees, j)); + ts_subtree_retain(slice.subtrees.contents[j]); } } ts_subtree_array_delete(&self->tree_pool, &error_trees); @@ -1231,14 +1243,20 @@ static bool ts_parser__recover_to_state( if (slice.subtrees.size > 0) { Subtree error = ts_subtree_new_error_node(&slice.subtrees, true, self->language); - ts_stack_push(self->stack, slice.version, error, false, goal_state); + ts_stack_push(self->stack, slice.version, error, false, goal_state, self->language); + LOG("push 7"); + printf("push 7\n"); + LOG_STACK(); } else { array_delete(&slice.subtrees); } for (unsigned j = 0; j < self->trailing_extras.size; j++) { - Subtree tree = *array_get(&self->trailing_extras, j); - ts_stack_push(self->stack, slice.version, tree, false, goal_state); + Subtree tree = self->trailing_extras.contents[j]; + ts_stack_push(self->stack, slice.version, tree, false, goal_state, self->language); + LOG("push 8"); + printf("push 8\n"); + LOG_STACK(); } previous_version = slice.version; @@ -1273,7 +1291,7 @@ static void ts_parser__recover( // if the current lookahead token would be valid in that state. if (summary && !ts_subtree_is_error(lookahead)) { for (unsigned i = 0; i < summary->size; i++) { - StackSummaryEntry entry = *array_get(summary, i); + StackSummaryEntry entry = summary->contents[i]; if (entry.state == ERROR_STATE) continue; if (entry.position.bytes == position.bytes) continue; @@ -1318,23 +1336,10 @@ static void ts_parser__recover( // and subsequently halted. Remove those versions. for (unsigned i = previous_version_count; i < ts_stack_version_count(self->stack); i++) { if (!ts_stack_is_active(self->stack, i)) { - LOG("removed paused version:%u", i); ts_stack_remove_version(self->stack, i--); - LOG_STACK(); } } - // If the parser is still in the error state at the end of the file, just wrap everything - // in an ERROR node and terminate. - if (ts_subtree_is_eof(lookahead)) { - LOG("recover_eof"); - SubtreeArray children = array_new(); - Subtree parent = ts_subtree_new_error_node(&children, false, self->language); - ts_stack_push(self->stack, version, parent, false, 1); - ts_parser__accept(self, version, lookahead); - return; - } - // If strategy 1 succeeded, a new stack version will have been created which is able to handle // the current lookahead token. Now, in addition, try strategy 2 described above: skip the // current lookahead token by wrapping it in an ERROR node. @@ -1355,6 +1360,20 @@ static void ts_parser__recover( return; } + // If the parser is still in the error state at the end of the file, just wrap everything + // in an ERROR node and terminate. + if (ts_subtree_is_eof(lookahead)) { + LOG("recover_eof"); + SubtreeArray children = array_new(); + Subtree parent = ts_subtree_new_error_node(&children, false, self->language); + ts_stack_push(self->stack, version, parent, false, 1, self->language); + LOG("push 9"); + printf("push 9\n"); + LOG_STACK(); + ts_parser__accept(self, version, lookahead); + return; + } + // Do not recover if the result would clearly be worse than some existing stack version. unsigned new_cost = current_error_cost + ERROR_COST_PER_SKIPPED_TREE + @@ -1400,40 +1419,33 @@ static void ts_parser__recover( // arbitrarily and discard the rest. if (pop.size > 1) { for (unsigned i = 1; i < pop.size; i++) { - ts_subtree_array_delete(&self->tree_pool, &array_get(&pop, i)->subtrees); + ts_subtree_array_delete(&self->tree_pool, &pop.contents[i].subtrees); } - while (ts_stack_version_count(self->stack) > array_get(&pop, 0)->version + 1) { - ts_stack_remove_version(self->stack, array_get(&pop, 0)->version + 1); + while (ts_stack_version_count(self->stack) > pop.contents[0].version + 1) { + ts_stack_remove_version(self->stack, pop.contents[0].version + 1); } } - ts_stack_renumber_version(self->stack, array_get(&pop, 0)->version, version); - array_push(&array_get(&pop, 0)->subtrees, ts_subtree_from_mut(error_repeat)); + ts_stack_renumber_version(self->stack, pop.contents[0].version, version); + array_push(&pop.contents[0].subtrees, ts_subtree_from_mut(error_repeat)); error_repeat = ts_subtree_new_node( ts_builtin_sym_error_repeat, - &array_get(&pop, 0)->subtrees, + &pop.contents[0].subtrees, 0, self->language ); } // Push the new ERROR onto the stack. - ts_stack_push(self->stack, version, ts_subtree_from_mut(error_repeat), false, ERROR_STATE); + ts_stack_push(self->stack, version, ts_subtree_from_mut(error_repeat), false, ERROR_STATE, self->language); + LOG("push 10"); + printf("push 10\n"); + LOG_STACK(); if (ts_subtree_has_external_tokens(lookahead)) { ts_stack_set_last_external_token( self->stack, version, ts_subtree_last_external_token(lookahead) ); } - - bool has_error = true; - for (unsigned i = 0; i < ts_stack_version_count(self->stack); i++) { - ErrorStatus status = ts_parser__version_status(self, i); - if (!status.is_in_error) { - has_error = false; - break; - } - } - self->has_error = has_error; } static void ts_parser__handle_error( @@ -1490,8 +1502,11 @@ static void ts_parser__handle_error( ts_stack_push( self->stack, version_with_missing_tree, missing_tree, false, - state_after_missing_symbol + state_after_missing_symbol, self->language ); + LOG("push 11"); + printf("push 11\n"); + LOG_STACK(); if (ts_parser__do_all_potential_reductions( self, version_with_missing_tree, @@ -1509,13 +1524,17 @@ static void ts_parser__handle_error( } } - ts_stack_push(self->stack, v, NULL_SUBTREE, false, ERROR_STATE); + ts_stack_push(self->stack, v, NULL_SUBTREE, false, ERROR_STATE, self->language); + LOG("push 12"); + printf("push 12\n"); + LOG_STACK(); v = (v == version) ? previous_version_count : v + 1; } for (unsigned i = previous_version_count; i < version_count; i++) { bool did_merge = ts_stack_merge(self->stack, version, previous_version_count); - ts_assert(did_merge); + assert(did_merge); + (void)did_merge; // fix warning/error with clang -Os } ts_stack_record_summary(self->stack, version, MAX_SUMMARY_DEPTH); @@ -1533,27 +1552,6 @@ static void ts_parser__handle_error( LOG_STACK(); } -static bool ts_parser__check_progress(TSParser *self, Subtree *lookahead, const uint32_t *position, unsigned operations) { - self->operation_count += operations; - if (self->operation_count >= OP_COUNT_PER_PARSER_CALLBACK_CHECK) { - self->operation_count = 0; - } - if (position != NULL) { - self->parse_state.current_byte_offset = *position; - self->parse_state.has_error = self->has_error; - } - if ( - self->operation_count == 0 && - (self->parse_options.progress_callback && self->parse_options.progress_callback(&self->parse_state)) - ) { - if (lookahead && lookahead->ptr) { - ts_subtree_release(&self->tree_pool, *lookahead); - } - return false; - } - return true; -} - static bool ts_parser__advance( TSParser *self, StackVersion version, @@ -1604,9 +1602,19 @@ static bool ts_parser__advance( } } - // If a progress callback was provided, then check every + // If a cancellation flag or a timeout was provided, then check every // time a fixed number of parse actions has been processed. - if (!ts_parser__check_progress(self, &lookahead, &position, 1)) { + if (++self->operation_count == OP_COUNT_PER_PARSER_TIMEOUT_CHECK) { + self->operation_count = 0; + } + if ( + self->operation_count == 0 && + ((self->cancellation_flag && atomic_load(self->cancellation_flag)) || + (!clock_is_null(self->end_clock) && clock_is_gt(clock_now(), self->end_clock))) + ) { + if (lookahead.ptr) { + ts_subtree_release(&self->tree_pool, lookahead); + } return false; } @@ -1615,7 +1623,6 @@ static bool ts_parser__advance( // an ambiguous state. REDUCE actions always create a new stack // version, whereas SHIFT actions update the existing stack version // and terminate this loop. - bool did_reduce = false; StackVersion last_reduction_version = STACK_VERSION_NONE; for (uint32_t i = 0; i < table_entry.action_count; i++) { TSParseAction action = table_entry.actions[i]; @@ -1651,7 +1658,6 @@ static bool ts_parser__advance( action.reduce.dynamic_precedence, action.reduce.production_id, is_fragile, end_of_non_terminal_extra ); - did_reduce = true; if (reduction_version != STACK_VERSION_NONE) { last_reduction_version = reduction_version; } @@ -1703,30 +1709,22 @@ static bool ts_parser__advance( continue; } - // A reduction was performed, but was merged into an existing stack version. - // This version can be discarded. - if (did_reduce) { - if (lookahead.ptr) { - ts_subtree_release(&self->tree_pool, lookahead); - } + // A non-terminal extra rule was reduced and merged into an existing + // stack version. This version can be discarded. + if (!lookahead.ptr) { ts_stack_halt(self->stack, version); return true; } - // If the current lookahead token is a keyword that is not valid, but the - // default word token *is* valid, then treat the lookahead token as the word - // token instead. + // If there were no parse actions for the current lookahead token, then + // it is not valid in this state. If the current lookahead token is a + // keyword, then switch to treating it as the normal word token if that + // token is valid in this state. if ( ts_subtree_is_keyword(lookahead) && - ts_subtree_symbol(lookahead) != self->language->keyword_capture_token && - !ts_language_is_reserved_word(self->language, state, ts_subtree_symbol(lookahead)) + ts_subtree_symbol(lookahead) != self->language->keyword_capture_token ) { - ts_language_table_entry( - self->language, - state, - self->language->keyword_capture_token, - &table_entry - ); + ts_language_table_entry(self->language, state, self->language->keyword_capture_token, &table_entry); if (table_entry.action_count > 0) { LOG( "switch from_keyword:%s, to_word_token:%s", @@ -1741,10 +1739,19 @@ static bool ts_parser__advance( } } - // If the current lookahead token is not valid and the previous subtree on - // the stack was reused from an old tree, then it wasn't actually valid to - // reuse that previous subtree. Remove it from the stack, and in its place, - // push each of its children. Then try again to process the current lookahead. + // If the current lookahead token is not valid and the parser is + // already in the error state, restart the error recovery process. + // TODO - can this be unified with the other `RECOVER` case above? + if (state == ERROR_STATE) { + ts_parser__recover(self, version, lookahead); + return true; + } + + // If the current lookahead token is not valid and the previous + // subtree on the stack was reused from an old tree, it isn't actually + // valid to reuse it. Remove it from the stack, and in its place, + // push each of its children. Then try again to process the current + // lookahead. if (ts_parser__breakdown_top_of_stack(self, version)) { state = ts_stack_state(self->stack, version); ts_subtree_release(&self->tree_pool, lookahead); @@ -1752,12 +1759,12 @@ static bool ts_parser__advance( continue; } - // Otherwise, there is definitely an error in this version of the parse stack. - // Mark this version as paused and continue processing any other stack - // versions that exist. If some other version advances successfully, then - // this version can simply be removed. But if all versions end up paused, - // then error recovery is needed. - LOG("detect_error lookahead:%s", TREE_NAME(lookahead)); + // At this point, the current lookahead token is definitely not valid + // for this parse stack version. Mark this version as paused and continue + // processing any other stack versions that might exist. If some other + // version advances successfully, then this version can simply be removed. + // But if all versions end up paused, then error recovery is needed. + LOG("detect_error"); ts_stack_pause(self->stack, version, lookahead); return true; } @@ -1846,7 +1853,6 @@ static unsigned ts_parser__condense_stack(TSParser *self) { has_unpaused_version = true; } else { ts_stack_remove_version(self->stack, i); - made_changes = true; i--; n--; } @@ -1864,66 +1870,8 @@ static unsigned ts_parser__condense_stack(TSParser *self) { return min_error_cost; } -static bool ts_parser__balance_subtree(TSParser *self) { - Subtree finished_tree = self->finished_tree; - - // If we haven't canceled balancing in progress before, then we want to clear the tree stack and - // push the initial finished tree onto it. Otherwise, if we're resuming balancing after a - // cancellation, we don't want to clear the tree stack. - if (!self->canceled_balancing) { - array_clear(&self->tree_pool.tree_stack); - if (ts_subtree_child_count(finished_tree) > 0 && finished_tree.ptr->ref_count == 1) { - array_push(&self->tree_pool.tree_stack, ts_subtree_to_mut_unsafe(finished_tree)); - } - } - - while (self->tree_pool.tree_stack.size > 0) { - if (!ts_parser__check_progress(self, NULL, NULL, 1)) { - return false; - } - - MutableSubtree tree = *array_get(&self->tree_pool.tree_stack, - self->tree_pool.tree_stack.size - 1 - ); - - if (tree.ptr->repeat_depth > 0) { - Subtree child1 = ts_subtree_children(tree)[0]; - Subtree child2 = ts_subtree_children(tree)[tree.ptr->child_count - 1]; - long repeat_delta = (long)ts_subtree_repeat_depth(child1) - (long)ts_subtree_repeat_depth(child2); - if (repeat_delta > 0) { - unsigned n = (unsigned)repeat_delta; - - for (unsigned i = n / 2; i > 0; i /= 2) { - ts_subtree_compress(tree, i, self->language, &self->tree_pool.tree_stack); - n -= i; - - // We scale the operation count increment in `ts_parser__check_progress` proportionately to the compression - // size since larger values of i take longer to process. Shifting by 4 empirically provides good check - // intervals (e.g. 193 operations when i=3100) to prevent blocking during large compressions. - uint8_t operations = i >> 4 > 0 ? i >> 4 : 1; - if (!ts_parser__check_progress(self, NULL, NULL, operations)) { - return false; - } - } - } - } - - (void)array_pop(&self->tree_pool.tree_stack); - - for (uint32_t i = 0; i < tree.ptr->child_count; i++) { - Subtree child = ts_subtree_children(tree)[i]; - if (ts_subtree_child_count(child) > 0 && child.ptr->ref_count == 1) { - array_push(&self->tree_pool.tree_stack, ts_subtree_to_mut_unsafe(child)); - } - } - } - - return true; -} - static bool ts_parser_has_outstanding_parse(TSParser *self) { return ( - self->canceled_balancing || self->external_scanner_payload || ts_stack_state(self->stack, 0) != 1 || ts_stack_node_count_since_error(self->stack, 0) != 0 @@ -1938,15 +1886,16 @@ TSParser *ts_parser_new(void) { array_init(&self->reduce_actions); array_reserve(&self->reduce_actions, 4); self->tree_pool = ts_subtree_pool_new(32); - self->stack = ts_stack_new(&self->tree_pool); + self->stack = ts_stack_new(&self->tree_pool, self->language); self->finished_tree = NULL_SUBTREE; self->reusable_node = reusable_node_new(); self->dot_graph_file = NULL; + self->cancellation_flag = NULL; + self->timeout_duration = 0; self->language = NULL; self->has_scanner_error = false; - self->has_error = false; - self->canceled_balancing = false; self->external_scanner_payload = NULL; + self->end_clock = clock_null(); self->operation_count = 0; self->old_tree = NULL_SUBTREE; self->included_range_differences = (TSRangeArray) array_new(); @@ -1992,8 +1941,8 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) { if (language) { if ( - language->abi_version > TREE_SITTER_LANGUAGE_VERSION || - language->abi_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION + language->version > TREE_SITTER_LANGUAGE_VERSION || + language->version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION ) return false; if (ts_language_is_wasm(language)) { @@ -2005,6 +1954,8 @@ bool ts_parser_set_language(TSParser *self, const TSLanguage *language) { } self->language = ts_language_copy(language); + ts_stack_set_language(self->stack, ts_language_copy(language)); + ts_stack_set_lexer(self->stack, &self->lexer); return true; } @@ -2032,6 +1983,22 @@ void ts_parser_print_dot_graphs(TSParser *self, int fd) { } } +const size_t *ts_parser_cancellation_flag(const TSParser *self) { + return (const size_t *)self->cancellation_flag; +} + +void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag) { + self->cancellation_flag = (const volatile size_t *)flag; +} + +uint64_t ts_parser_timeout_micros(const TSParser *self) { + return duration_to_micros(self->timeout_duration); +} + +void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micros) { + self->timeout_duration = duration_from_micros(timeout_micros); +} + bool ts_parser_set_included_ranges( TSParser *self, const TSRange *ranges, @@ -2065,10 +2032,6 @@ void ts_parser_reset(TSParser *self) { } self->accept_count = 0; self->has_scanner_error = false; - self->has_error = false; - self->canceled_balancing = false; - self->parse_options = (TSParseOptions) {0}; - self->parse_state = (TSParseState) {0}; } TSTree *ts_parser_parse( @@ -2088,11 +2051,8 @@ TSTree *ts_parser_parse( array_clear(&self->included_range_differences); self->included_range_difference_index = 0; - self->operation_count = 0; - if (ts_parser_has_outstanding_parse(self)) { LOG("resume_parsing"); - if (self->canceled_balancing) goto balance; } else { ts_parser__external_scanner_create(self); if (self->has_scanner_error) goto exit; @@ -2109,7 +2069,7 @@ TSTree *ts_parser_parse( LOG("parse_after_edit"); LOG_TREE(self->old_tree); for (unsigned i = 0; i < self->included_range_differences.size; i++) { - TSRange *range = array_get(&self->included_range_differences, i); + TSRange *range = &self->included_range_differences.contents[i]; LOG("different_included_range %u - %u", range->start_byte, range->end_byte); } } else { @@ -2118,6 +2078,13 @@ TSTree *ts_parser_parse( } } + self->operation_count = 0; + if (self->timeout_duration) { + self->end_clock = clock_after(clock_now(), self->timeout_duration); + } else { + self->end_clock = clock_null(); + } + uint32_t position = 0, last_position = 0, version_count = 0; do { for ( @@ -2166,7 +2133,7 @@ TSTree *ts_parser_parse( } while (self->included_range_difference_index < self->included_range_differences.size) { - TSRange *range = array_get(&self->included_range_differences, self->included_range_difference_index); + TSRange *range = &self->included_range_differences.contents[self->included_range_difference_index]; if (range->end_byte <= position) { self->included_range_difference_index++; } else { @@ -2175,13 +2142,8 @@ TSTree *ts_parser_parse( } } while (version_count != 0); -balance: - ts_assert(self->finished_tree.ptr); - if (!ts_parser__balance_subtree(self)) { - self->canceled_balancing = true; - return false; - } - self->canceled_balancing = false; + assert(self->finished_tree.ptr); + ts_subtree_balance(self->finished_tree, &self->tree_pool, self->language); LOG("done"); LOG_TREE(self->finished_tree); @@ -2198,20 +2160,6 @@ exit: return result; } -TSTree *ts_parser_parse_with_options( - TSParser *self, - const TSTree *old_tree, - TSInput input, - TSParseOptions parse_options -) { - self->parse_options = parse_options; - self->parse_state.payload = parse_options.payload; - TSTree *result = ts_parser_parse(self, old_tree, input); - // Reset parser options before further parse calls. - self->parse_options = (TSParseOptions) {0}; - return result; -} - TSTree *ts_parser_parse_string( TSParser *self, const TSTree *old_tree, @@ -2233,7 +2181,6 @@ TSTree *ts_parser_parse_string_encoding( &input, ts_string_input_read, encoding, - NULL, }); } diff --git a/lib/src/parser.h b/lib/src/parser.h index 858107de..799f599b 100644 --- a/lib/src/parser.h +++ b/lib/src/parser.h @@ -18,11 +18,6 @@ typedef uint16_t TSStateId; typedef uint16_t TSSymbol; typedef uint16_t TSFieldId; typedef struct TSLanguage TSLanguage; -typedef struct TSLanguageMetadata { - uint8_t major_version; - uint8_t minor_version; - uint8_t patch_version; -} TSLanguageMetadata; #endif typedef struct { @@ -31,11 +26,10 @@ typedef struct { bool inherited; } TSFieldMapEntry; -// Used to index the field and supertype maps. typedef struct { uint16_t index; uint16_t length; -} TSMapSlice; +} TSFieldMapSlice; typedef struct { bool visible; @@ -85,12 +79,6 @@ typedef struct { uint16_t external_lex_state; } TSLexMode; -typedef struct { - uint16_t lex_state; - uint16_t external_lex_state; - uint16_t reserved_word_set_id; -} TSLexerMode; - typedef union { TSParseAction action; struct { @@ -105,7 +93,7 @@ typedef struct { } TSCharacterRange; struct TSLanguage { - uint32_t abi_version; + uint32_t version; uint32_t symbol_count; uint32_t alias_count; uint32_t token_count; @@ -121,13 +109,13 @@ struct TSLanguage { const TSParseActionEntry *parse_actions; const char * const *symbol_names; const char * const *field_names; - const TSMapSlice *field_map_slices; + const TSFieldMapSlice *field_map_slices; const TSFieldMapEntry *field_map_entries; const TSSymbolMetadata *symbol_metadata; const TSSymbol *public_symbol_map; const uint16_t *alias_map; const TSSymbol *alias_sequences; - const TSLexerMode *lex_modes; + const TSLexMode *lex_modes; bool (*lex_fn)(TSLexer *, TSStateId); bool (*keyword_lex_fn)(TSLexer *, TSStateId); TSSymbol keyword_capture_token; @@ -141,23 +129,15 @@ struct TSLanguage { void (*deserialize)(void *, const char *, unsigned); } external_scanner; const TSStateId *primary_state_ids; - const char *name; - const TSSymbol *reserved_words; - uint16_t max_reserved_word_set_size; - uint32_t supertype_count; - const TSSymbol *supertype_symbols; - const TSMapSlice *supertype_map_slices; - const TSSymbol *supertype_map_entries; - TSLanguageMetadata metadata; }; -static inline bool set_contains(const TSCharacterRange *ranges, uint32_t len, int32_t lookahead) { +static inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) { uint32_t index = 0; uint32_t size = len - index; while (size > 1) { uint32_t half_size = size / 2; uint32_t mid_index = index + half_size; - const TSCharacterRange *range = &ranges[mid_index]; + TSCharacterRange *range = &ranges[mid_index]; if (lookahead >= range->start && lookahead <= range->end) { return true; } else if (lookahead > range->end) { @@ -165,7 +145,7 @@ static inline bool set_contains(const TSCharacterRange *ranges, uint32_t len, in } size -= half_size; } - const TSCharacterRange *range = &ranges[index]; + TSCharacterRange *range = &ranges[index]; return (lookahead >= range->start && lookahead <= range->end); } diff --git a/lib/src/point.c b/lib/src/point.c deleted file mode 100644 index da46f61b..00000000 --- a/lib/src/point.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "point.h" - -void ts_point_edit(TSPoint *point, uint32_t *byte, const TSInputEdit *edit) { - uint32_t start_byte = *byte; - TSPoint start_point = *point; - - if (start_byte >= edit->old_end_byte) { - start_byte = edit->new_end_byte + (start_byte - edit->old_end_byte); - start_point = point_add(edit->new_end_point, point_sub(start_point, edit->old_end_point)); - } else if (start_byte > edit->start_byte) { - start_byte = edit->new_end_byte; - start_point = edit->new_end_point; - } - - *point = start_point; - *byte = start_byte; -} diff --git a/lib/src/point.h b/lib/src/point.h index 39581988..37346c8d 100644 --- a/lib/src/point.h +++ b/lib/src/point.h @@ -22,7 +22,7 @@ static inline TSPoint point_sub(TSPoint a, TSPoint b) { if (a.row > b.row) return point__new(a.row - b.row, a.column); else - return point__new(0, (a.column >= b.column) ? a.column - b.column : 0); + return point__new(0, a.column - b.column); } static inline bool point_lte(TSPoint a, TSPoint b) { @@ -45,4 +45,18 @@ static inline bool point_eq(TSPoint a, TSPoint b) { return a.row == b.row && a.column == b.column; } +static inline TSPoint point_min(TSPoint a, TSPoint b) { + if (a.row < b.row || (a.row == b.row && a.column < b.column)) + return a; + else + return b; +} + +static inline TSPoint point_max(TSPoint a, TSPoint b) { + if (a.row > b.row || (a.row == b.row && a.column > b.column)) + return a; + else + return b; +} + #endif diff --git a/lib/src/portable/endian.h b/lib/src/portable/endian.h deleted file mode 100644 index a6560826..00000000 --- a/lib/src/portable/endian.h +++ /dev/null @@ -1,241 +0,0 @@ -// "License": Public Domain -// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like. -// In case there are jurisdictions that don't support putting things in the public domain you can also consider it to -// be "dual licensed" under the BSD, MIT and Apache licenses, if you want to. This code is trivial anyway. Consider it -// an example on how to get the endian conversion functions on different platforms. - -// updates from https://github.com/mikepb/endian.h/issues/4 - -#ifndef ENDIAN_H -#define ENDIAN_H - -#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__) - -# define __WINDOWS__ - -#endif - -#if defined(HAVE_ENDIAN_H) || \ - defined(__linux__) || \ - defined(__GNU__) || \ - defined(__HAIKU__) || \ - defined(__illumos__) || \ - defined(__NetBSD__) || \ - defined(__OpenBSD__) || \ - defined(__CYGWIN__) || \ - defined(__MSYS__) || \ - defined(__EMSCRIPTEN__) || \ - defined(__wasi__) || \ - defined(__wasm__) - -#if defined(__NetBSD__) -#define _NETBSD_SOURCE 1 -#endif - -# include - -#elif defined(HAVE_SYS_ENDIAN_H) || \ - defined(__FreeBSD__) || \ - defined(__DragonFly__) - -# include - -#elif defined(__APPLE__) -# define __BYTE_ORDER BYTE_ORDER -# define __BIG_ENDIAN BIG_ENDIAN -# define __LITTLE_ENDIAN LITTLE_ENDIAN -# define __PDP_ENDIAN PDP_ENDIAN - -# if !defined(_POSIX_C_SOURCE) -# include - -# define htobe16(x) OSSwapHostToBigInt16(x) -# define htole16(x) OSSwapHostToLittleInt16(x) -# define be16toh(x) OSSwapBigToHostInt16(x) -# define le16toh(x) OSSwapLittleToHostInt16(x) - -# define htobe32(x) OSSwapHostToBigInt32(x) -# define htole32(x) OSSwapHostToLittleInt32(x) -# define be32toh(x) OSSwapBigToHostInt32(x) -# define le32toh(x) OSSwapLittleToHostInt32(x) - -# define htobe64(x) OSSwapHostToBigInt64(x) -# define htole64(x) OSSwapHostToLittleInt64(x) -# define be64toh(x) OSSwapBigToHostInt64(x) -# define le64toh(x) OSSwapLittleToHostInt64(x) -# else -# if BYTE_ORDER == LITTLE_ENDIAN -# define htobe16(x) __builtin_bswap16(x) -# define htole16(x) (x) -# define be16toh(x) __builtin_bswap16(x) -# define le16toh(x) (x) - -# define htobe32(x) __builtin_bswap32(x) -# define htole32(x) (x) -# define be32toh(x) __builtin_bswap32(x) -# define le32toh(x) (x) - -# define htobe64(x) __builtin_bswap64(x) -# define htole64(x) (x) -# define be64toh(x) __builtin_bswap64(x) -# define le64toh(x) (x) -# elif BYTE_ORDER == BIG_ENDIAN -# define htobe16(x) (x) -# define htole16(x) __builtin_bswap16(x) -# define be16toh(x) (x) -# define le16toh(x) __builtin_bswap16(x) - -# define htobe32(x) (x) -# define htole32(x) __builtin_bswap32(x) -# define be32toh(x) (x) -# define le32toh(x) __builtin_bswap32(x) - -# define htobe64(x) (x) -# define htole64(x) __builtin_bswap64(x) -# define be64toh(x) (x) -# define le64toh(x) __builtin_bswap64(x) -# else -# error byte order not supported -# endif -# endif - -#elif defined(__WINDOWS__) - -# if defined(_MSC_VER) && !defined(__clang__) -# include -# define B_SWAP_16(x) _byteswap_ushort(x) -# define B_SWAP_32(x) _byteswap_ulong(x) -# define B_SWAP_64(x) _byteswap_uint64(x) -# else -# define B_SWAP_16(x) __builtin_bswap16(x) -# define B_SWAP_32(x) __builtin_bswap32(x) -# define B_SWAP_64(x) __builtin_bswap64(x) -# endif - -# if defined(__MINGW32__) || defined(HAVE_SYS_PARAM_H) -# include -# endif - -# ifndef BIG_ENDIAN -# ifdef __BIG_ENDIAN -# define BIG_ENDIAN __BIG_ENDIAN -# elif defined(__ORDER_BIG_ENDIAN__) -# define BIG_ENDIAN __ORDER_BIG_ENDIAN__ -# else -# define BIG_ENDIAN 4321 -# endif -# endif - -# ifndef LITTLE_ENDIAN -# ifdef __LITTLE_ENDIAN -# define LITTLE_ENDIAN __LITTLE_ENDIAN -# elif defined(__ORDER_LITTLE_ENDIAN__) -# define LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ -# else -# define LITTLE_ENDIAN 1234 -# endif -# endif - -# ifndef BYTE_ORDER -# ifdef __BYTE_ORDER -# define BYTE_ORDER __BYTE_ORDER -# elif defined(__BYTE_ORDER__) -# define BYTE_ORDER __BYTE_ORDER__ -# else - /* assume LE on Windows if nothing was defined */ -# define BYTE_ORDER LITTLE_ENDIAN -# endif -# endif - -# if BYTE_ORDER == LITTLE_ENDIAN - -# define htobe16(x) B_SWAP_16(x) -# define htole16(x) (x) -# define be16toh(x) B_SWAP_16(x) -# define le16toh(x) (x) - -# define htobe32(x) B_SWAP_32(x) -# define htole32(x) (x) -# define be32toh(x) B_SWAP_32(x) -# define le32toh(x) (x) - -# define htobe64(x) B_SWAP_64(x) -# define htole64(x) (x) -# define be64toh(x) B_SWAP_64(x) -# define le64toh(x) (x) - -# elif BYTE_ORDER == BIG_ENDIAN - -# define htobe16(x) (x) -# define htole16(x) B_SWAP_16(x) -# define be16toh(x) (x) -# define le16toh(x) B_SWAP_16(x) - -# define htobe32(x) (x) -# define htole32(x) B_SWAP_32(x) -# define be32toh(x) (x) -# define le32toh(x) B_SWAP_32(x) - -# define htobe64(x) (x) -# define htole64(x) B_SWAP_64(x) -# define be64toh(x) (x) -# define le64toh(x) B_SWAP_64(x) - -# else - -# error byte order not supported - -# endif - -#elif defined(__QNXNTO__) - -# include - -# define __LITTLE_ENDIAN 1234 -# define __BIG_ENDIAN 4321 -# define __PDP_ENDIAN 3412 - -# if defined(__BIGENDIAN__) - -# define __BYTE_ORDER __BIG_ENDIAN - -# define htobe16(x) (x) -# define htobe32(x) (x) -# define htobe64(x) (x) - -# define htole16(x) ENDIAN_SWAP16(x) -# define htole32(x) ENDIAN_SWAP32(x) -# define htole64(x) ENDIAN_SWAP64(x) - -# elif defined(__LITTLEENDIAN__) - -# define __BYTE_ORDER __LITTLE_ENDIAN - -# define htole16(x) (x) -# define htole32(x) (x) -# define htole64(x) (x) - -# define htobe16(x) ENDIAN_SWAP16(x) -# define htobe32(x) ENDIAN_SWAP32(x) -# define htobe64(x) ENDIAN_SWAP64(x) - -# else - -# error byte order not supported - -# endif - -# define be16toh(x) ENDIAN_BE16(x) -# define be32toh(x) ENDIAN_BE32(x) -# define be64toh(x) ENDIAN_BE64(x) -# define le16toh(x) ENDIAN_LE16(x) -# define le32toh(x) ENDIAN_LE32(x) -# define le64toh(x) ENDIAN_LE64(x) - -#else - -# error platform not supported - -#endif - -#endif diff --git a/lib/src/query.c b/lib/src/query.c index e378910a..4941f507 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -1,15 +1,7 @@ -/* - * On NetBSD, defining standard requirements like this removes symbols - * from the namespace; however, we need non-standard symbols for - * endian.h. - */ -#if defined(__NetBSD__) && defined(_POSIX_C_SOURCE) -#undef _POSIX_C_SOURCE -#endif - #include "tree_sitter/api.h" #include "./alloc.h" #include "./array.h" +#include "./clock.h" #include "./language.h" #include "./point.h" #include "./tree_cursor.h" @@ -89,7 +81,7 @@ typedef struct { * for the entire top-level pattern. When iterating through a query's * captures using `ts_query_cursor_next_capture`, this field is used to * detect that a capture can safely be returned from a match that has not - * even completed yet. + * even completed yet. */ typedef struct { TSSymbol symbol; @@ -108,7 +100,6 @@ typedef struct { bool contains_captures: 1; bool root_pattern_guaranteed: 1; bool parent_pattern_guaranteed: 1; - bool is_missing: 1; } QueryStep; /* @@ -131,7 +122,7 @@ typedef struct { } SymbolTable; /** - * CaptureQuantifiers - a data structure holding the quantifiers of pattern captures. + * CaptureQuantififers - a data structure holding the quantifiers of pattern captures. */ typedef Array(uint8_t) CaptureQuantifiers; @@ -182,8 +173,7 @@ typedef struct { * list of captures from the `CaptureListPool`. * - `seeking_immediate_match` - A flag that indicates that the state's next * step must be matched by the very next sibling. This is used when - * processing repetitions, or when processing a wildcard node followed by - * an anchor. + * processing repetitions. * - `has_in_progress_alternatives` - A flag that indicates that there is are * other states that have the same captures as this state, but are at * different steps in their pattern. This means that in order to obey the @@ -318,11 +308,13 @@ struct TSQueryCursor { CaptureListPool capture_list_pool; uint32_t depth; uint32_t max_start_depth; - TSRange included_range; - TSRange containing_range; + uint32_t start_byte; + uint32_t end_byte; + TSPoint start_point; + TSPoint end_point; uint32_t next_state_id; - const TSQueryCursorOptions *query_options; - TSQueryCursorState query_state; + TSClock end_clock; + TSDuration timeout_duration; unsigned operation_count; bool on_visible_node; bool ascending; @@ -334,7 +326,7 @@ static const TSQueryError PARENT_DONE = -1; static const uint16_t PATTERN_DONE_MARKER = UINT16_MAX; static const uint16_t NONE = UINT16_MAX; static const TSSymbol WILDCARD_SYMBOL = 0; -static const unsigned OP_COUNT_PER_QUERY_CALLBACK_CHECK = 100; +static const unsigned OP_COUNT_PER_QUERY_TIMEOUT_CHECK = 100; /********** * Stream @@ -406,7 +398,9 @@ static void stream_scan_identifier(Stream *stream) { iswalnum(stream->next) || stream->next == '_' || stream->next == '-' || - stream->next == '.' + stream->next == '.' || + stream->next == '?' || + stream->next == '!' ); } @@ -430,26 +424,26 @@ static CaptureListPool capture_list_pool_new(void) { static void capture_list_pool_reset(CaptureListPool *self) { for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) { // This invalid size means that the list is not in use. - array_get(&self->list, i)->size = UINT32_MAX; + self->list.contents[i].size = UINT32_MAX; } self->free_capture_list_count = self->list.size; } static void capture_list_pool_delete(CaptureListPool *self) { for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) { - array_delete(array_get(&self->list, i)); + array_delete(&self->list.contents[i]); } array_delete(&self->list); } static const CaptureList *capture_list_pool_get(const CaptureListPool *self, uint16_t id) { if (id >= self->list.size) return &self->empty_list; - return array_get(&self->list, id); + return &self->list.contents[id]; } static CaptureList *capture_list_pool_get_mut(CaptureListPool *self, uint16_t id) { - ts_assert(id < self->list.size); - return array_get(&self->list, id); + assert(id < self->list.size); + return &self->list.contents[id]; } static bool capture_list_pool_is_empty(const CaptureListPool *self) { @@ -462,8 +456,8 @@ static uint16_t capture_list_pool_acquire(CaptureListPool *self) { // First see if any already allocated capture list is currently unused. if (self->free_capture_list_count > 0) { for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) { - if (array_get(&self->list, i)->size == UINT32_MAX) { - array_clear(array_get(&self->list, i)); + if (self->list.contents[i].size == UINT32_MAX) { + array_clear(&self->list.contents[i]); self->free_capture_list_count--; return i; } @@ -484,7 +478,7 @@ static uint16_t capture_list_pool_acquire(CaptureListPool *self) { static void capture_list_pool_release(CaptureListPool *self, uint16_t id) { if (id >= self->list.size) return; - array_get(&self->list, id)->size = UINT32_MAX; + self->list.contents[id].size = UINT32_MAX; self->free_capture_list_count++; } @@ -767,10 +761,10 @@ static int symbol_table_id_for_name( uint32_t length ) { for (unsigned i = 0; i < self->slices.size; i++) { - Slice slice = *array_get(&self->slices, i); + Slice slice = self->slices.contents[i]; if ( slice.length == length && - !strncmp(array_get(&self->characters, slice.offset), name, length) + !strncmp(&self->characters.contents[slice.offset], name, length) ) return i; } return -1; @@ -781,9 +775,9 @@ static const char *symbol_table_name_for_id( uint16_t id, uint32_t *length ) { - Slice slice = *(array_get(&self->slices,id)); + Slice slice = self->slices.contents[id]; *length = slice.length; - return array_get(&self->characters, slice.offset); + return &self->characters.contents[slice.offset]; } static uint16_t symbol_table_insert_name( @@ -798,8 +792,8 @@ static uint16_t symbol_table_insert_name( .length = length, }; array_grow_by(&self->characters, length + 1); - memcpy(array_get(&self->characters, slice.offset), name, length); - *array_get(&self->characters, self->characters.size - 1) = 0; + memcpy(&self->characters.contents[slice.offset], name, length); + self->characters.contents[self->characters.size - 1] = 0; array_push(&self->slices, slice); return self->slices.size - 1; } @@ -921,26 +915,35 @@ static unsigned analysis_state__recursion_depth(const AnalysisState *self) { return result; } +static inline int analysis_state__compare_position( + AnalysisState *const *self, + AnalysisState *const *other +) { + for (unsigned i = 0; i < (*self)->depth; i++) { + if (i >= (*other)->depth) return -1; + if ((*self)->stack[i].child_index < (*other)->stack[i].child_index) return -1; + if ((*self)->stack[i].child_index > (*other)->stack[i].child_index) return 1; + } + if ((*self)->depth < (*other)->depth) return 1; + if ((*self)->step_index < (*other)->step_index) return -1; + if ((*self)->step_index > (*other)->step_index) return 1; + return 0; +} + static inline int analysis_state__compare( AnalysisState *const *self, AnalysisState *const *other ) { - if ((*self)->depth < (*other)->depth) return 1; + int result = analysis_state__compare_position(self, other); + if (result != 0) return result; for (unsigned i = 0; i < (*self)->depth; i++) { - if (i >= (*other)->depth) return -1; - AnalysisStateEntry s1 = (*self)->stack[i]; - AnalysisStateEntry s2 = (*other)->stack[i]; - if (s1.child_index < s2.child_index) return -1; - if (s1.child_index > s2.child_index) return 1; - if (s1.parent_symbol < s2.parent_symbol) return -1; - if (s1.parent_symbol > s2.parent_symbol) return 1; - if (s1.parse_state < s2.parse_state) return -1; - if (s1.parse_state > s2.parse_state) return 1; - if (s1.field_id < s2.field_id) return -1; - if (s1.field_id > s2.field_id) return 1; + if ((*self)->stack[i].parent_symbol < (*other)->stack[i].parent_symbol) return -1; + if ((*self)->stack[i].parent_symbol > (*other)->stack[i].parent_symbol) return 1; + if ((*self)->stack[i].parse_state < (*other)->stack[i].parse_state) return -1; + if ((*self)->stack[i].parse_state > (*other)->stack[i].parse_state) return 1; + if ((*self)->stack[i].field_id < (*other)->stack[i].field_id) return -1; + if ((*self)->stack[i].field_id > (*other)->stack[i].field_id) return 1; } - if ((*self)->step_index < (*other)->step_index) return -1; - if ((*self)->step_index > (*other)->step_index) return 1; return 0; } @@ -1102,23 +1105,23 @@ static inline bool ts_query__pattern_map_search( while (size > 1) { uint32_t half_size = size / 2; uint32_t mid_index = base_index + half_size; - TSSymbol mid_symbol = array_get(&self->steps, - array_get(&self->pattern_map, mid_index)->step_index - )->symbol; + TSSymbol mid_symbol = self->steps.contents[ + self->pattern_map.contents[mid_index].step_index + ].symbol; if (needle > mid_symbol) base_index = mid_index; size -= half_size; } - TSSymbol symbol = array_get(&self->steps, - array_get(&self->pattern_map, base_index)->step_index - )->symbol; + TSSymbol symbol = self->steps.contents[ + self->pattern_map.contents[base_index].step_index + ].symbol; if (needle > symbol) { base_index++; if (base_index < self->pattern_map.size) { - symbol = array_get(&self->steps, - array_get(&self->pattern_map, base_index)->step_index - )->symbol; + symbol = self->steps.contents[ + self->pattern_map.contents[base_index].step_index + ].symbol; } } @@ -1141,9 +1144,9 @@ static inline void ts_query__pattern_map_insert( // initiated first, which allows the ordering of the states array // to be maintained more efficiently. while (index < self->pattern_map.size) { - PatternEntry *entry = array_get(&self->pattern_map, index); + PatternEntry *entry = &self->pattern_map.contents[index]; if ( - array_get(&self->steps, entry->step_index)->symbol == symbol && + self->steps.contents[entry->step_index].symbol == symbol && entry->pattern_index < new_entry.pattern_index ) { index++; @@ -1176,11 +1179,11 @@ static void ts_query__perform_analysis( #ifdef DEBUG_ANALYZE_QUERY printf("Iteration: %u. Final step indices:", iteration); for (unsigned j = 0; j < analysis->final_step_indices.size; j++) { - printf(" %4u", *array_get(&analysis->final_step_indices, j)); + printf(" %4u", analysis->final_step_indices.contents[j]); } printf("\n"); for (unsigned j = 0; j < analysis->states.size; j++) { - AnalysisState *state = *array_get(&analysis->states, j); + AnalysisState *state = analysis->states.contents[j]; printf(" %3u: step: %u, stack: [", j, state->step_index); for (unsigned k = 0; k < state->depth; k++) { printf( @@ -1223,7 +1226,7 @@ static void ts_query__perform_analysis( analysis_state_set__clear(&analysis->next_states, &analysis->state_pool); for (unsigned j = 0; j < analysis->states.size; j++) { - AnalysisState * const state = *array_get(&analysis->states, j); + AnalysisState * const state = analysis->states.contents[j]; // For efficiency, it's important to avoid processing the same analysis state more // than once. To achieve this, keep the states in order of ascending position within @@ -1231,7 +1234,7 @@ static void ts_query__perform_analysis( // the states that have made the least progress. Avoid advancing states that have already // made more progress. if (analysis->next_states.size > 0) { - int comparison = analysis_state__compare( + int comparison = analysis_state__compare_position( &state, array_back(&analysis->next_states) ); @@ -1246,7 +1249,7 @@ static void ts_query__perform_analysis( analysis_state_set__push( &analysis->next_states, &analysis->state_pool, - *array_get(&analysis->states, j) + analysis->states.contents[j] ); j++; } @@ -1258,12 +1261,12 @@ static void ts_query__perform_analysis( const TSSymbol parent_symbol = analysis_state__top(state)->parent_symbol; const TSFieldId parent_field_id = analysis_state__top(state)->field_id; const unsigned child_index = analysis_state__top(state)->child_index; - const QueryStep * const step = array_get(&self->steps, state->step_index); + const QueryStep * const step = &self->steps.contents[state->step_index]; unsigned subgraph_index, exists; array_search_sorted_by(subgraphs, .symbol, parent_symbol, &subgraph_index, &exists); if (!exists) continue; - const AnalysisSubgraph *subgraph = array_get(subgraphs, subgraph_index); + const AnalysisSubgraph *subgraph = &subgraphs->contents[subgraph_index]; // Follow every possible path in the parse table, but only visit states that // are part of the subgraph for the current symbol. @@ -1299,8 +1302,7 @@ static void ts_query__perform_analysis( &node_index, &exists ); while (node_index < subgraph->nodes.size) { - AnalysisSubgraphNode *node = array_get(&subgraph->nodes, node_index); - node_index++; + AnalysisSubgraphNode *node = &subgraph->nodes.contents[node_index++]; if (node->state != successor.state || node->child_index != successor.child_index) break; // Use the subgraph to determine what alias and field will eventually be applied @@ -1333,12 +1335,7 @@ static void ts_query__perform_analysis( // Determine if this hypothetical child node would match the current step // of the query pattern. bool does_match = false; - - // ERROR nodes can appear anywhere, so if the step is - // looking for an ERROR node, consider it potentially matchable. - if (step->symbol == ts_builtin_sym_error) { - does_match = true; - } else if (visible_symbol) { + if (visible_symbol) { does_match = true; if (step->symbol == WILDCARD_SYMBOL) { if ( @@ -1406,7 +1403,7 @@ static void ts_query__perform_analysis( if (does_match) { for (;;) { next_state.step_index++; - next_step = array_get(&self->steps, next_state.step_index); + next_step = &self->steps.contents[next_state.step_index]; if ( next_step->depth == PATTERN_DONE_MARKER || next_step->depth <= step->depth @@ -1430,7 +1427,7 @@ static void ts_query__perform_analysis( // record that matching can terminate at this step of the pattern. Otherwise, // add this state to the list of states to process on the next iteration. if (!next_step->is_dead_end) { - bool did_finish_pattern = array_get(&self->steps, next_state.step_index)->depth != step->depth; + bool did_finish_pattern = self->steps.contents[next_state.step_index].depth != step->depth; if (did_finish_pattern) { array_insert_sorted_by(&analysis->finished_parent_symbols, , state->root_symbol); } else if (next_state.depth == 0) { @@ -1450,7 +1447,7 @@ static void ts_query__perform_analysis( next_step->alternative_index > next_state.step_index ) { next_state.step_index = next_step->alternative_index; - next_step = array_get(&self->steps, next_state.step_index); + next_step = &self->steps.contents[next_state.step_index]; } else { break; } @@ -1468,9 +1465,9 @@ static void ts_query__perform_analysis( static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { Array(uint16_t) non_rooted_pattern_start_steps = array_new(); for (unsigned i = 0; i < self->pattern_map.size; i++) { - PatternEntry *pattern = array_get(&self->pattern_map, i); + PatternEntry *pattern = &self->pattern_map.contents[i]; if (!pattern->is_rooted) { - QueryStep *step = array_get(&self->steps, pattern->step_index); + QueryStep *step = &self->steps.contents[pattern->step_index]; if (step->symbol != WILDCARD_SYMBOL) { array_push(&non_rooted_pattern_start_steps, i); } @@ -1481,9 +1478,8 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // basic information about each step. Mark all of the steps that contain // captures, and record the indices of all of the steps that have child steps. Array(uint32_t) parent_step_indices = array_new(); - bool all_patterns_are_valid = true; for (unsigned i = 0; i < self->steps.size; i++) { - QueryStep *step = array_get(&self->steps, i); + QueryStep *step = &self->steps.contents[i]; if (step->depth == PATTERN_DONE_MARKER) { step->parent_pattern_guaranteed = true; step->root_pattern_guaranteed = true; @@ -1494,7 +1490,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { bool is_wildcard = step->symbol == WILDCARD_SYMBOL; step->contains_captures = step->capture_ids[0] != NONE; for (unsigned j = i + 1; j < self->steps.size; j++) { - QueryStep *next_step = array_get(&self->steps, j); + QueryStep *next_step = &self->steps.contents[j]; if ( next_step->depth == PATTERN_DONE_MARKER || next_step->depth <= step->depth @@ -1509,45 +1505,8 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { has_children = true; } - if (has_children) { - if (!is_wildcard) { - array_push(&parent_step_indices, i); - } else if (step->supertype_symbol && self->language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) { - // Look at the child steps to see if any aren't valid subtypes for this supertype. - uint32_t subtype_length; - const TSSymbol *subtypes = ts_language_subtypes( - self->language, - step->supertype_symbol, - &subtype_length - ); - - for (unsigned j = i + 1; j < self->steps.size; j++) { - QueryStep *child_step = array_get(&self->steps, j); - if (child_step->depth == PATTERN_DONE_MARKER || child_step->depth <= step->depth) { - break; - } - if (child_step->depth == step->depth + 1 && child_step->symbol != WILDCARD_SYMBOL) { - bool is_valid_subtype = false; - for (uint32_t k = 0; k < subtype_length; k++) { - if (child_step->symbol == subtypes[k]) { - is_valid_subtype = true; - break; - } - } - - if (!is_valid_subtype) { - for (unsigned offset_idx = 0; offset_idx < self->step_offsets.size; offset_idx++) { - StepOffset *step_offset = array_get(&self->step_offsets, offset_idx); - if (step_offset->step_index >= j) { - *error_offset = step_offset->byte_offset; - all_patterns_are_valid = false; - goto supertype_cleanup; - } - } - } - } - } - } + if (has_children && !is_wildcard) { + array_push(&parent_step_indices, i); } } @@ -1561,8 +1520,8 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // parent. AnalysisSubgraphArray subgraphs = array_new(); for (unsigned i = 0; i < parent_step_indices.size; i++) { - uint32_t parent_step_index = *array_get(&parent_step_indices, i); - TSSymbol parent_symbol = array_get(&self->steps, parent_step_index)->symbol; + uint32_t parent_step_index = parent_step_indices.contents[i]; + TSSymbol parent_symbol = self->steps.contents[parent_step_index].symbol; AnalysisSubgraph subgraph = { .symbol = parent_symbol }; array_insert_sorted_by(&subgraphs, .symbol, subgraph); } @@ -1604,7 +1563,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { &exists ); if (exists) { - AnalysisSubgraph *subgraph = array_get(&subgraphs, subgraph_index); + AnalysisSubgraph *subgraph = &subgraphs.contents[subgraph_index]; if (subgraph->nodes.size == 0 || array_back(&subgraph->nodes)->state != state) { array_push(&subgraph->nodes, ((AnalysisSubgraphNode) { .state = state, @@ -1641,7 +1600,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { &exists ); if (exists) { - AnalysisSubgraph *subgraph = array_get(&subgraphs, subgraph_index); + AnalysisSubgraph *subgraph = &subgraphs.contents[subgraph_index]; if ( subgraph->start_states.size == 0 || *array_back(&subgraph->start_states) != state @@ -1658,7 +1617,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // from the end states using the predecessor map. Array(AnalysisSubgraphNode) next_nodes = array_new(); for (unsigned i = 0; i < subgraphs.size; i++) { - AnalysisSubgraph *subgraph = array_get(&subgraphs, i); + AnalysisSubgraph *subgraph = &subgraphs.contents[i]; if (subgraph->nodes.size == 0) { array_delete(&subgraph->start_states); array_erase(&subgraphs, i); @@ -1699,16 +1658,16 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { #ifdef DEBUG_ANALYZE_QUERY printf("\nSubgraphs:\n"); for (unsigned i = 0; i < subgraphs.size; i++) { - AnalysisSubgraph *subgraph = array_get(&subgraphs, i); + AnalysisSubgraph *subgraph = &subgraphs.contents[i]; printf(" %u, %s:\n", subgraph->symbol, ts_language_symbol_name(self->language, subgraph->symbol)); for (unsigned j = 0; j < subgraph->start_states.size; j++) { printf( " {state: %u}\n", - *array_get(&subgraph->start_states, j) + subgraph->start_states.contents[j] ); } for (unsigned j = 0; j < subgraph->nodes.size; j++) { - AnalysisSubgraphNode *node = array_get(&subgraph->nodes, j); + AnalysisSubgraphNode *node = &subgraph->nodes.contents[j]; printf( " {state: %u, child_index: %u, production_id: %u, done: %d}\n", node->state, node->child_index, node->production_id, node->done @@ -1720,11 +1679,12 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // For each non-terminal pattern, determine if the pattern can successfully match, // and identify all of the possible children within the pattern where matching could fail. + bool all_patterns_are_valid = true; QueryAnalysis analysis = query_analysis__new(); for (unsigned i = 0; i < parent_step_indices.size; i++) { - uint16_t parent_step_index = *array_get(&parent_step_indices, i); - uint16_t parent_depth = array_get(&self->steps, parent_step_index)->depth; - TSSymbol parent_symbol = array_get(&self->steps, parent_step_index)->symbol; + uint16_t parent_step_index = parent_step_indices.contents[i]; + uint16_t parent_depth = self->steps.contents[parent_step_index].depth; + TSSymbol parent_symbol = self->steps.contents[parent_step_index].symbol; if (parent_symbol == ts_builtin_sym_error) continue; // Find the subgraph that corresponds to this pattern's root symbol. If the pattern's @@ -1735,19 +1695,19 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { unsigned first_child_step_index = parent_step_index + 1; uint32_t j, child_exists; array_search_sorted_by(&self->step_offsets, .step_index, first_child_step_index, &j, &child_exists); - ts_assert(child_exists); - *error_offset = array_get(&self->step_offsets, j)->byte_offset; + assert(child_exists); + *error_offset = self->step_offsets.contents[j].byte_offset; all_patterns_are_valid = false; break; } // Initialize an analysis state at every parse state in the table where // this parent symbol can occur. - AnalysisSubgraph *subgraph = array_get(&subgraphs, subgraph_index); + AnalysisSubgraph *subgraph = &subgraphs.contents[subgraph_index]; analysis_state_set__clear(&analysis.states, &analysis.state_pool); analysis_state_set__clear(&analysis.deeper_states, &analysis.state_pool); for (unsigned j = 0; j < subgraph->start_states.size; j++) { - TSStateId parse_state = *array_get(&subgraph->start_states, j); + TSStateId parse_state = subgraph->start_states.contents[j]; analysis_state_set__push(&analysis.states, &analysis.state_pool, &((AnalysisState) { .step_index = parent_step_index + 1, .stack = { @@ -1767,7 +1727,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { #ifdef DEBUG_ANALYZE_QUERY printf( "\nWalk states for %s:\n", - ts_language_symbol_name(self->language, (*array_get(&analysis.states, 0))->stack[0].parent_symbol) + ts_language_symbol_name(self->language, analysis.states.contents[0]->stack[0].parent_symbol) ); #endif @@ -1778,7 +1738,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // be considered fallible. if (analysis.did_abort) { for (unsigned j = parent_step_index + 1; j < self->steps.size; j++) { - QueryStep *step = array_get(&self->steps, j); + QueryStep *step = &self->steps.contents[j]; if ( step->depth <= parent_depth || step->depth == PATTERN_DONE_MARKER @@ -1794,17 +1754,12 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // If this pattern cannot match, store the pattern index so that it can be // returned to the caller. if (analysis.finished_parent_symbols.size == 0) { - uint16_t impossible_step_index; - if (analysis.final_step_indices.size > 0) { - impossible_step_index = *array_back(&analysis.final_step_indices); - } else { - // If there isn't a final step, then that means the parent step itself is unreachable. - impossible_step_index = parent_step_index; - } + assert(analysis.final_step_indices.size > 0); + uint16_t impossible_step_index = *array_back(&analysis.final_step_indices); uint32_t j, impossible_exists; array_search_sorted_by(&self->step_offsets, .step_index, impossible_step_index, &j, &impossible_exists); if (j >= self->step_offsets.size) j = self->step_offsets.size - 1; - *error_offset = array_get(&self->step_offsets, j)->byte_offset; + *error_offset = self->step_offsets.contents[j].byte_offset; all_patterns_are_valid = false; break; } @@ -1812,8 +1767,8 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // Mark as fallible any step where a match terminated. // Later, this property will be propagated to all of the step's predecessors. for (unsigned j = 0; j < analysis.final_step_indices.size; j++) { - uint32_t final_step_index = *array_get(&analysis.final_step_indices, j); - QueryStep *step = array_get(&self->steps, final_step_index); + uint32_t final_step_index = analysis.final_step_indices.contents[j]; + QueryStep *step = &self->steps.contents[final_step_index]; if ( step->depth != PATTERN_DONE_MARKER && step->depth > parent_depth && @@ -1828,7 +1783,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // Mark as indefinite any step with captures that are used in predicates. Array(uint16_t) predicate_capture_ids = array_new(); for (unsigned i = 0; i < self->patterns.size; i++) { - QueryPattern *pattern = array_get(&self->patterns, i); + QueryPattern *pattern = &self->patterns.contents[i]; // Gather all of the captures that are used in predicates for this pattern. array_clear(&predicate_capture_ids); @@ -1837,7 +1792,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { end = start + pattern->predicate_steps.length, j = start; j < end; j++ ) { - TSQueryPredicateStep *step = array_get(&self->predicate_steps, j); + TSQueryPredicateStep *step = &self->predicate_steps.contents[j]; if (step->type == TSQueryPredicateStepTypeCapture) { uint16_t value_id = step->value_id; array_insert_sorted_by(&predicate_capture_ids, , value_id); @@ -1850,7 +1805,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { end = start + pattern->steps.length, j = start; j < end; j++ ) { - QueryStep *step = array_get(&self->steps, j); + QueryStep *step = &self->steps.contents[j]; for (unsigned k = 0; k < MAX_STEP_CAPTURE_COUNT; k++) { uint16_t capture_id = step->capture_ids[k]; if (capture_id == NONE) break; @@ -1870,7 +1825,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { while (!done) { done = true; for (unsigned i = self->steps.size - 1; i > 0; i--) { - QueryStep *step = array_get(&self->steps, i); + QueryStep *step = &self->steps.contents[i]; if (step->depth == PATTERN_DONE_MARKER) continue; // Determine if this step is definite or has definite alternatives. @@ -1883,12 +1838,12 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { if (step->alternative_index == NONE || step->alternative_index < i) { break; } - step = array_get(&self->steps, step->alternative_index); + step = &self->steps.contents[step->alternative_index]; } // If not, mark its predecessor as indefinite. if (!parent_pattern_guaranteed) { - QueryStep *prev_step = array_get(&self->steps, i - 1); + QueryStep *prev_step = &self->steps.contents[i - 1]; if ( !prev_step->is_dead_end && prev_step->depth != PATTERN_DONE_MARKER && @@ -1904,7 +1859,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { #ifdef DEBUG_ANALYZE_QUERY printf("Steps:\n"); for (unsigned i = 0; i < self->steps.size; i++) { - QueryStep *step = array_get(&self->steps, i); + QueryStep *step = &self->steps.contents[i]; if (step->depth == PATTERN_DONE_MARKER) { printf(" %u: DONE\n", i); } else { @@ -1928,18 +1883,18 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // prevent certain optimizations with range restrictions. analysis.did_abort = false; for (uint32_t i = 0; i < non_rooted_pattern_start_steps.size; i++) { - uint16_t pattern_entry_index = *array_get(&non_rooted_pattern_start_steps, i); - PatternEntry *pattern_entry = array_get(&self->pattern_map, pattern_entry_index); + uint16_t pattern_entry_index = non_rooted_pattern_start_steps.contents[i]; + PatternEntry *pattern_entry = &self->pattern_map.contents[pattern_entry_index]; analysis_state_set__clear(&analysis.states, &analysis.state_pool); analysis_state_set__clear(&analysis.deeper_states, &analysis.state_pool); for (unsigned j = 0; j < subgraphs.size; j++) { - AnalysisSubgraph *subgraph = array_get(&subgraphs, j); + AnalysisSubgraph *subgraph = &subgraphs.contents[j]; TSSymbolMetadata metadata = ts_language_symbol_metadata(self->language, subgraph->symbol); if (metadata.visible || metadata.named) continue; for (uint32_t k = 0; k < subgraph->start_states.size; k++) { - TSStateId parse_state = *array_get(&subgraph->start_states, k); + TSStateId parse_state = subgraph->start_states.contents[k]; analysis_state_set__push(&analysis.states, &analysis.state_pool, &((AnalysisState) { .step_index = pattern_entry->step_index, .stack = { @@ -1968,11 +1923,11 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { ); if (analysis.finished_parent_symbols.size > 0) { - array_get(&self->patterns, pattern_entry->pattern_index)->is_non_local = true; + self->patterns.contents[pattern_entry->pattern_index].is_non_local = true; } for (unsigned k = 0; k < analysis.finished_parent_symbols.size; k++) { - TSSymbol symbol = *array_get(&analysis.finished_parent_symbols, k); + TSSymbol symbol = analysis.finished_parent_symbols.contents[k]; array_insert_sorted_by(&self->repeat_symbols_with_rootless_patterns, , symbol); } } @@ -1982,7 +1937,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { printf("\nRepetition symbols with rootless patterns:\n"); printf("aborted analysis: %d\n", analysis.did_abort); for (unsigned i = 0; i < self->repeat_symbols_with_rootless_patterns.size; i++) { - TSSymbol symbol = *array_get(&self->repeat_symbols_with_rootless_patterns, i); + TSSymbol symbol = self->repeat_symbols_with_rootless_patterns.contents[i]; printf(" %u, %s\n", symbol, ts_language_symbol_name(self->language, symbol)); } printf("\n"); @@ -1991,18 +1946,16 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // Cleanup for (unsigned i = 0; i < subgraphs.size; i++) { - array_delete(&array_get(&subgraphs, i)->start_states); - array_delete(&array_get(&subgraphs, i)->nodes); + array_delete(&subgraphs.contents[i].start_states); + array_delete(&subgraphs.contents[i].nodes); } array_delete(&subgraphs); query_analysis__delete(&analysis); array_delete(&next_nodes); - array_delete(&predicate_capture_ids); - state_predecessor_map_delete(&predecessor_map); - -supertype_cleanup: array_delete(&non_rooted_pattern_start_steps); array_delete(&parent_step_indices); + array_delete(&predicate_capture_ids); + state_predecessor_map_delete(&predecessor_map); return all_patterns_are_valid; } @@ -2013,7 +1966,7 @@ static void ts_query__add_negated_fields( TSFieldId *field_ids, uint16_t field_count ) { - QueryStep *step = array_get(&self->steps, step_index); + QueryStep *step = &self->steps.contents[step_index]; // The negated field array stores a list of field lists, separated by zeros. // Try to find the start index of an existing list that matches this new list. @@ -2021,7 +1974,7 @@ static void ts_query__add_negated_fields( unsigned match_count = 0; unsigned start_i = 0; for (unsigned i = 0; i < self->negated_fields.size; i++) { - TSFieldId existing_field_id = *array_get(&self->negated_fields, i); + TSFieldId existing_field_id = self->negated_fields.contents[i]; // At each zero value, terminate the match attempt. If we've exactly // matched the new field list, then reuse this index. Otherwise, @@ -2125,10 +2078,6 @@ static TSQueryError ts_query__parse_predicate( if (!stream_is_ident_start(stream)) return TSQueryErrorSyntax; const char *predicate_name = stream->input; stream_scan_identifier(stream); - if (stream->next != '?' && stream->next != '!') { - return TSQueryErrorSyntax; - } - stream_advance(stream); uint32_t length = (uint32_t)(stream->input - predicate_name); uint16_t id = symbol_table_insert_name( &self->predicate_values, @@ -2295,10 +2244,10 @@ static TSQueryError ts_query__parse_pattern( // For all of the branches except for the last one, add the subsequent branch as an // alternative, and link the end of the branch to the current end of the steps. for (unsigned i = 0; i < branch_step_indices.size - 1; i++) { - uint32_t step_index = *array_get(&branch_step_indices, i); - uint32_t next_step_index = *array_get(&branch_step_indices, i + 1); - QueryStep *start_step = array_get(&self->steps, step_index); - QueryStep *end_step = array_get(&self->steps, next_step_index - 1); + uint32_t step_index = branch_step_indices.contents[i]; + uint32_t next_step_index = branch_step_indices.contents[i + 1]; + QueryStep *start_step = &self->steps.contents[step_index]; + QueryStep *end_step = &self->steps.contents[next_step_index - 1]; start_step->alternative_index = next_step_index; end_step->alternative_index = self->steps.size; end_step->is_dead_end = true; @@ -2362,62 +2311,16 @@ static TSQueryError ts_query__parse_pattern( // Otherwise, this parenthesis is the start of a named node. else { TSSymbol symbol; - bool is_missing = false; - const char *node_name = stream->input; // Parse a normal node name if (stream_is_ident_start(stream)) { + const char *node_name = stream->input; stream_scan_identifier(stream); uint32_t length = (uint32_t)(stream->input - node_name); // Parse the wildcard symbol if (length == 1 && node_name[0] == '_') { symbol = WILDCARD_SYMBOL; - } else if (!strncmp(node_name, "MISSING", length)) { - is_missing = true; - stream_skip_whitespace(stream); - - if (stream_is_ident_start(stream)) { - const char *missing_node_name = stream->input; - stream_scan_identifier(stream); - uint32_t missing_node_length = (uint32_t)(stream->input - missing_node_name); - symbol = ts_language_symbol_for_name( - self->language, - missing_node_name, - missing_node_length, - true - ); - if (!symbol) { - stream_reset(stream, missing_node_name); - return TSQueryErrorNodeType; - } - } - - else if (stream->next == '"') { - const char *string_start = stream->input; - TSQueryError e = ts_query__parse_string_literal(self, stream); - if (e) return e; - - symbol = ts_language_symbol_for_name( - self->language, - self->string_buffer.contents, - self->string_buffer.size, - false - ); - if (!symbol) { - stream_reset(stream, string_start + 1); - return TSQueryErrorNodeType; - } - } - - else if (stream->next == ')') { - symbol = WILDCARD_SYMBOL; - } - - else { - stream_reset(stream, stream->input); - return TSQueryErrorSyntax; - } } else { @@ -2443,79 +2346,36 @@ static TSQueryError ts_query__parse_pattern( step->supertype_symbol = step->symbol; step->symbol = WILDCARD_SYMBOL; } - if (is_missing) { - step->is_missing = true; - } if (symbol == WILDCARD_SYMBOL) { step->is_named = true; } - // Parse a supertype symbol + stream_skip_whitespace(stream); + if (stream->next == '/') { - if (!step->supertype_symbol) { - stream_reset(stream, node_name - 1); // reset to the start of the node - return TSQueryErrorStructure; - } - stream_advance(stream); - - const char *subtype_node_name = stream->input; - - if (stream_is_ident_start(stream)) { // Named node - stream_scan_identifier(stream); - uint32_t length = (uint32_t)(stream->input - subtype_node_name); - step->symbol = ts_language_symbol_for_name( - self->language, - subtype_node_name, - length, - true - ); - } else if (stream->next == '"') { // Anonymous leaf node - TSQueryError e = ts_query__parse_string_literal(self, stream); - if (e) return e; - step->symbol = ts_language_symbol_for_name( - self->language, - self->string_buffer.contents, - self->string_buffer.size, - false - ); - } else { + if (!stream_is_ident_start(stream)) { return TSQueryErrorSyntax; } + const char *node_name = stream->input; + stream_scan_identifier(stream); + uint32_t length = (uint32_t)(stream->input - node_name); + + step->symbol = ts_language_symbol_for_name( + self->language, + node_name, + length, + true + ); if (!step->symbol) { - stream_reset(stream, subtype_node_name); + stream_reset(stream, node_name); return TSQueryErrorNodeType; } - // Get all the possible subtypes for the given supertype, - // and check if the given subtype is valid. - if (self->language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) { - uint32_t subtype_length; - const TSSymbol *subtypes = ts_language_subtypes( - self->language, - step->supertype_symbol, - &subtype_length - ); - - bool subtype_is_valid = false; - for (uint32_t i = 0; i < subtype_length; i++) { - if (subtypes[i] == step->symbol) { - subtype_is_valid = true; - break; - } - } - - // This subtype is not valid for the given supertype. - if (!subtype_is_valid) { - stream_reset(stream, node_name - 1); // reset to the start of the node - return TSQueryErrorStructure; - } - } + stream_skip_whitespace(stream); } - stream_skip_whitespace(stream); - // Parse the child patterns bool child_is_immediate = false; uint16_t last_child_step_index = 0; @@ -2571,9 +2431,6 @@ static TSQueryError ts_query__parse_pattern( child_is_immediate, &child_capture_quantifiers ); - // In the event we only parsed a predicate, meaning no new steps were added, - // then subtract one so we're not indexing past the end of the array - if (step_index == self->steps.size) step_index--; if (e == PARENT_DONE) { if (stream->next == ')') { if (child_is_immediate) { @@ -2581,23 +2438,7 @@ static TSQueryError ts_query__parse_pattern( capture_quantifiers_delete(&child_capture_quantifiers); return TSQueryErrorSyntax; } - // Mark this step *and* its alternatives as the last child of the parent. - QueryStep *last_child_step = array_get(&self->steps, last_child_step_index); - last_child_step->is_last_child = true; - if ( - last_child_step->alternative_index != NONE && - last_child_step->alternative_index < self->steps.size - ) { - QueryStep *alternative_step = array_get(&self->steps, last_child_step->alternative_index); - alternative_step->is_last_child = true; - while ( - alternative_step->alternative_index != NONE && - alternative_step->alternative_index < self->steps.size - ) { - alternative_step = array_get(&self->steps, alternative_step->alternative_index); - alternative_step->is_last_child = true; - } - } + self->steps.contents[last_child_step_index].is_last_child = true; } if (negated_field_count) { @@ -2700,7 +2541,7 @@ static TSQueryError ts_query__parse_pattern( } uint32_t step_index = starting_step_index; - QueryStep *step = array_get(&self->steps, step_index); + QueryStep *step = &self->steps.contents[step_index]; for (;;) { step->field = field_id; if ( @@ -2709,7 +2550,7 @@ static TSQueryError ts_query__parse_pattern( step->alternative_index < self->steps.size ) { step_index = step->alternative_index; - step = array_get(&self->steps, step_index); + step = &self->steps.contents[step_index]; } else { break; } @@ -2734,6 +2575,12 @@ static TSQueryError ts_query__parse_pattern( stream_advance(stream); stream_skip_whitespace(stream); + + QueryStep repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); + repeat_step.alternative_index = starting_step_index; + repeat_step.is_pass_through = true; + repeat_step.alternative_is_immediate = true; + array_push(&self->steps, repeat_step); } // Parse the zero-or-more repetition operator. @@ -2742,6 +2589,21 @@ static TSQueryError ts_query__parse_pattern( stream_advance(stream); stream_skip_whitespace(stream); + + QueryStep repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); + repeat_step.alternative_index = starting_step_index; + repeat_step.is_pass_through = true; + repeat_step.alternative_is_immediate = true; + array_push(&self->steps, repeat_step); + + // Stop when `step->alternative_index` is `NONE` or it points to + // `repeat_step` or beyond. Note that having just been pushed, + // `repeat_step` occupies slot `self->steps.size - 1`. + QueryStep *step = &self->steps.contents[starting_step_index]; + while (step->alternative_index != NONE && step->alternative_index < self->steps.size - 1) { + step = &self->steps.contents[step->alternative_index]; + } + step->alternative_index = self->steps.size; } // Parse the optional operator. @@ -2750,6 +2612,12 @@ static TSQueryError ts_query__parse_pattern( stream_advance(stream); stream_skip_whitespace(stream); + + QueryStep *step = &self->steps.contents[starting_step_index]; + while (step->alternative_index != NONE && step->alternative_index < self->steps.size) { + step = &self->steps.contents[step->alternative_index]; + } + step->alternative_index = self->steps.size; } // Parse an '@'-prefixed capture pattern @@ -2773,7 +2641,7 @@ static TSQueryError ts_query__parse_pattern( uint32_t step_index = starting_step_index; for (;;) { - QueryStep *step = array_get(&self->steps, step_index); + QueryStep *step = &self->steps.contents[step_index]; query_step__add_capture(step, capture_id); if ( step->alternative_index != NONE && @@ -2793,43 +2661,6 @@ static TSQueryError ts_query__parse_pattern( } } - QueryStep repeat_step; - QueryStep *step; - switch (quantifier) { - case TSQuantifierOneOrMore: - repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); - repeat_step.alternative_index = starting_step_index; - repeat_step.is_pass_through = true; - repeat_step.alternative_is_immediate = true; - array_push(&self->steps, repeat_step); - break; - case TSQuantifierZeroOrMore: - repeat_step = query_step__new(WILDCARD_SYMBOL, depth, false); - repeat_step.alternative_index = starting_step_index; - repeat_step.is_pass_through = true; - repeat_step.alternative_is_immediate = true; - array_push(&self->steps, repeat_step); - - // Stop when `step->alternative_index` is `NONE` or it points to - // `repeat_step` or beyond. Note that having just been pushed, - // `repeat_step` occupies slot `self->steps.size - 1`. - step = array_get(&self->steps, starting_step_index); - while (step->alternative_index != NONE && step->alternative_index < self->steps.size - 1) { - step = array_get(&self->steps, step->alternative_index); - } - step->alternative_index = self->steps.size; - break; - case TSQuantifierZeroOrOne: - step = array_get(&self->steps, starting_step_index); - while (step->alternative_index != NONE && step->alternative_index < self->steps.size) { - step = array_get(&self->steps, step->alternative_index); - } - step->alternative_index = self->steps.size; - break; - default: - break; - } - capture_quantifiers_mul(capture_quantifiers, quantifier); return 0; @@ -2844,8 +2675,8 @@ TSQuery *ts_query_new( ) { if ( !language || - language->abi_version > TREE_SITTER_LANGUAGE_VERSION || - language->abi_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION + language->version > TREE_SITTER_LANGUAGE_VERSION || + language->version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION ) { *error_type = TSQueryErrorLanguage; return NULL; @@ -2908,14 +2739,14 @@ TSQuery *ts_query_new( // Maintain a map that can look up patterns for a given root symbol. uint16_t wildcard_root_alternative_index = NONE; for (;;) { - QueryStep *step = array_get(&self->steps, start_step_index); + QueryStep *step = &self->steps.contents[start_step_index]; // If a pattern has a wildcard at its root, but it has a non-wildcard child, // then optimize the matching process by skipping matching the wildcard. // Later, during the matching process, the query cursor will check that // there is a parent node, and capture it if necessary. if (step->symbol == WILDCARD_SYMBOL && step->depth == 0 && !step->field) { - QueryStep *second_step = array_get(&self->steps, start_step_index + 1); + QueryStep *second_step = &self->steps.contents[start_step_index + 1]; if (second_step->symbol != WILDCARD_SYMBOL && second_step->depth == 1 && !second_step->is_immediate) { wildcard_root_alternative_index = step->alternative_index; start_step_index += 1; @@ -2930,7 +2761,7 @@ TSQuery *ts_query_new( uint32_t start_depth = step->depth; bool is_rooted = start_depth == 0; for (uint32_t step_index = start_step_index + 1; step_index < self->steps.size; step_index++) { - QueryStep *child_step = array_get(&self->steps, step_index); + QueryStep *child_step = &self->steps.contents[step_index]; if (child_step->is_dead_end) break; if (child_step->depth == start_depth) { is_rooted = false; @@ -3034,24 +2865,26 @@ const TSQueryPredicateStep *ts_query_predicates_for_pattern( uint32_t pattern_index, uint32_t *step_count ) { - Slice slice = array_get(&self->patterns, pattern_index)->predicate_steps; + Slice slice = self->patterns.contents[pattern_index].predicate_steps; *step_count = slice.length; - if (slice.length == 0) return NULL; - return array_get(&self->predicate_steps, slice.offset); + if (self->predicate_steps.contents == NULL) { + return NULL; + } + return &self->predicate_steps.contents[slice.offset]; } uint32_t ts_query_start_byte_for_pattern( const TSQuery *self, uint32_t pattern_index ) { - return array_get(&self->patterns, pattern_index)->start_byte; + return self->patterns.contents[pattern_index].start_byte; } uint32_t ts_query_end_byte_for_pattern( const TSQuery *self, uint32_t pattern_index ) { - return array_get(&self->patterns, pattern_index)->end_byte; + return self->patterns.contents[pattern_index].end_byte; } bool ts_query_is_pattern_rooted( @@ -3059,7 +2892,7 @@ bool ts_query_is_pattern_rooted( uint32_t pattern_index ) { for (unsigned i = 0; i < self->pattern_map.size; i++) { - PatternEntry *entry = array_get(&self->pattern_map, i); + PatternEntry *entry = &self->pattern_map.contents[i]; if (entry->pattern_index == pattern_index) { if (!entry->is_rooted) return false; } @@ -3072,7 +2905,7 @@ bool ts_query_is_pattern_non_local( uint32_t pattern_index ) { if (pattern_index < self->patterns.size) { - return array_get(&self->patterns, pattern_index)->is_non_local; + return self->patterns.contents[pattern_index].is_non_local; } else { return false; } @@ -3084,12 +2917,12 @@ bool ts_query_is_pattern_guaranteed_at_step( ) { uint32_t step_index = UINT32_MAX; for (unsigned i = 0; i < self->step_offsets.size; i++) { - StepOffset *step_offset = array_get(&self->step_offsets, i); + StepOffset *step_offset = &self->step_offsets.contents[i]; if (step_offset->byte_offset > byte_offset) break; step_index = step_offset->step_index; } if (step_index < self->steps.size) { - return array_get(&self->steps, step_index)->root_pattern_guaranteed; + return self->steps.contents[step_index].root_pattern_guaranteed; } else { return false; } @@ -3099,13 +2932,13 @@ bool ts_query__step_is_fallible( const TSQuery *self, uint16_t step_index ) { - ts_assert((uint32_t)step_index + 1 < self->steps.size); - QueryStep *step = array_get(&self->steps, step_index); - QueryStep *next_step = array_get(&self->steps, step_index + 1); + assert((uint32_t)step_index + 1 < self->steps.size); + QueryStep *step = &self->steps.contents[step_index]; + QueryStep *next_step = &self->steps.contents[step_index + 1]; return ( next_step->depth != PATTERN_DONE_MARKER && next_step->depth > step->depth && - (!next_step->parent_pattern_guaranteed || step->symbol == WILDCARD_SYMBOL) + !next_step->parent_pattern_guaranteed ); } @@ -3119,7 +2952,7 @@ void ts_query_disable_capture( int id = symbol_table_id_for_name(&self->captures, name, length); if (id != -1) { for (unsigned i = 0; i < self->steps.size; i++) { - QueryStep *step = array_get(&self->steps, i); + QueryStep *step = &self->steps.contents[i]; query_step__remove_capture(step, id); } } @@ -3132,7 +2965,7 @@ void ts_query_disable_pattern( // Remove the given pattern from the pattern map. Its steps will still // be in the `steps` array, but they will never be read. for (unsigned i = 0; i < self->pattern_map.size; i++) { - PatternEntry *pattern = array_get(&self->pattern_map, i); + PatternEntry *pattern = &self->pattern_map.contents[i]; if (pattern->pattern_index == pattern_index) { array_erase(&self->pattern_map, i); i--; @@ -3153,19 +2986,13 @@ TSQueryCursor *ts_query_cursor_new(void) { .states = array_new(), .finished_states = array_new(), .capture_list_pool = capture_list_pool_new(), - .included_range = { - .start_point = {0, 0}, - .end_point = POINT_MAX, - .start_byte = 0, - .end_byte = UINT32_MAX, - }, - .containing_range = { - .start_point = {0, 0}, - .end_point = POINT_MAX, - .start_byte = 0, - .end_byte = UINT32_MAX, - }, + .start_byte = 0, + .end_byte = UINT32_MAX, + .start_point = {0, 0}, + .end_point = POINT_MAX, .max_start_depth = UINT32_MAX, + .timeout_duration = 0, + .end_clock = clock_null(), .operation_count = 0, }; array_reserve(&self->states, 8); @@ -3193,6 +3020,14 @@ void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit) { self->capture_list_pool.max_capture_list_count = limit; } +uint64_t ts_query_cursor_timeout_micros(const TSQueryCursor *self) { + return duration_to_micros(self->timeout_duration); +} + +void ts_query_cursor_set_timeout_micros(TSQueryCursor *self, uint64_t timeout_micros) { + self->timeout_duration = duration_from_micros(timeout_micros); +} + #ifdef DEBUG_EXECUTE_QUERY #define LOG(...) fprintf(stderr, __VA_ARGS__) #else @@ -3207,7 +3042,7 @@ void ts_query_cursor_exec( if (query) { LOG("query steps:\n"); for (unsigned i = 0; i < query->steps.size; i++) { - QueryStep *step = array_get(&query->steps, i); + QueryStep *step = &query->steps.contents[i]; LOG(" %u: {", i); if (step->depth == PATTERN_DONE_MARKER) { LOG("DONE"); @@ -3242,26 +3077,14 @@ void ts_query_cursor_exec( self->query = query; self->did_exceed_match_limit = false; self->operation_count = 0; - self->query_options = NULL; - self->query_state = (TSQueryCursorState) {0}; -} - -void ts_query_cursor_exec_with_options( - TSQueryCursor *self, - const TSQuery *query, - TSNode node, - const TSQueryCursorOptions *query_options -) { - ts_query_cursor_exec(self, query, node); - if (query_options) { - self->query_options = query_options; - self->query_state = (TSQueryCursorState) { - .payload = query_options->payload - }; + if (self->timeout_duration) { + self->end_clock = clock_after(clock_now(), self->timeout_duration); + } else { + self->end_clock = clock_null(); } } -bool ts_query_cursor_set_byte_range( +void ts_query_cursor_set_byte_range( TSQueryCursor *self, uint32_t start_byte, uint32_t end_byte @@ -3269,15 +3092,11 @@ bool ts_query_cursor_set_byte_range( if (end_byte == 0) { end_byte = UINT32_MAX; } - if (start_byte > end_byte) { - return false; - } - self->included_range.start_byte = start_byte; - self->included_range.end_byte = end_byte; - return true; + self->start_byte = start_byte; + self->end_byte = end_byte; } -bool ts_query_cursor_set_point_range( +void ts_query_cursor_set_point_range( TSQueryCursor *self, TSPoint start_point, TSPoint end_point @@ -3285,44 +3104,8 @@ bool ts_query_cursor_set_point_range( if (end_point.row == 0 && end_point.column == 0) { end_point = POINT_MAX; } - if (point_gt(start_point, end_point)) { - return false; - } - self->included_range.start_point = start_point; - self->included_range.end_point = end_point; - return true; -} - -bool ts_query_cursor_set_containing_byte_range( - TSQueryCursor *self, - uint32_t start_byte, - uint32_t end_byte -) { - if (end_byte == 0) { - end_byte = UINT32_MAX; - } - if (start_byte > end_byte) { - return false; - } - self->containing_range.start_byte = start_byte; - self->containing_range.end_byte = end_byte; - return true; -} - -bool ts_query_cursor_set_containing_point_range( - TSQueryCursor *self, - TSPoint start_point, - TSPoint end_point -) { - if (end_point.row == 0 && end_point.column == 0) { - end_point = POINT_MAX; - } - if (point_gt(start_point, end_point)) { - return false; - } - self->containing_range.start_point = start_point; - self->containing_range.end_point = end_point; - return true; + self->start_point = start_point; + self->end_point = end_point; } // Search through all of the in-progress states, and find the captured @@ -3332,14 +3115,14 @@ static bool ts_query_cursor__first_in_progress_capture( uint32_t *state_index, uint32_t *byte_offset, uint32_t *pattern_index, - bool *is_definite + bool *root_pattern_guaranteed ) { bool result = false; *state_index = UINT32_MAX; *byte_offset = UINT32_MAX; *pattern_index = UINT32_MAX; for (unsigned i = 0; i < self->states.size; i++) { - QueryState *state = array_get(&self->states, i); + QueryState *state = &self->states.contents[i]; if (state->dead) continue; const CaptureList *captures = capture_list_pool_get( @@ -3350,10 +3133,10 @@ static bool ts_query_cursor__first_in_progress_capture( continue; } - TSNode node = array_get(captures, state->consumed_capture_count)->node; + TSNode node = captures->contents[state->consumed_capture_count].node; if ( - ts_node_end_byte(node) <= self->included_range.start_byte || - point_lte(ts_node_end_point(node), self->included_range.start_point) + ts_node_end_byte(node) <= self->start_byte || + point_lte(ts_node_end_point(node), self->start_point) ) { state->consumed_capture_count++; i--; @@ -3366,12 +3149,9 @@ static bool ts_query_cursor__first_in_progress_capture( node_start_byte < *byte_offset || (node_start_byte == *byte_offset && state->pattern_index < *pattern_index) ) { - QueryStep *step = array_get(&self->query->steps, state->step_index); - if (is_definite) { - // We're being a bit conservative here by asserting that the following step - // is not immediate, because this capture might end up being discarded if the - // following symbol in the tree isn't the required symbol for this step. - *is_definite = step->root_pattern_guaranteed && !step->is_immediate; + QueryStep *step = &self->query->steps.contents[state->step_index]; + if (root_pattern_guaranteed) { + *root_pattern_guaranteed = step->root_pattern_guaranteed; } else if (step->root_pattern_guaranteed) { continue; } @@ -3422,8 +3202,8 @@ void ts_query_cursor__compare_captures( for (;;) { if (i < left_captures->size) { if (j < right_captures->size) { - TSQueryCapture *left = array_get(left_captures, i); - TSQueryCapture *right = array_get(right_captures, j); + TSQueryCapture *left = &left_captures->contents[i]; + TSQueryCapture *right = &right_captures->contents[j]; if (left->node.id == right->node.id && left->index == right->index) { i++; j++; @@ -3462,7 +3242,7 @@ static void ts_query_cursor__add_state( TSQueryCursor *self, const PatternEntry *pattern ) { - QueryStep *step = array_get(&self->query->steps, pattern->step_index); + QueryStep *step = &self->query->steps.contents[pattern->step_index]; uint32_t start_depth = self->depth - step->depth; // Keep the states array in ascending order of start_depth and pattern_index, @@ -3486,7 +3266,7 @@ static void ts_query_cursor__add_state( // need to execute in order to keep the states ordered by pattern_index. uint32_t index = self->states.size; while (index > 0) { - QueryState *prev_state = array_get(&self->states, index - 1); + QueryState *prev_state = &self->states.contents[index - 1]; if (prev_state->start_depth < start_depth) break; if (prev_state->start_depth == start_depth) { // Avoid inserting an unnecessary duplicate state, which would be @@ -3550,7 +3330,7 @@ static CaptureList *ts_query_cursor__prepare_to_capture( " abandon state. index:%u, pattern:%u, offset:%u.\n", state_index, pattern_index, byte_offset ); - QueryState *other_state = array_get(&self->states, state_index); + QueryState *other_state = &self->states.contents[state_index]; state->capture_list_id = other_state->capture_list_id; other_state->capture_list_id = NONE; other_state->dead = true; @@ -3620,8 +3400,8 @@ static QueryState *ts_query_cursor__copy_state( } array_insert(&self->states, state_index + 1, copy); - *state_ref = array_get(&self->states, state_index); - return array_get(&self->states, state_index + 1); + *state_ref = &self->states.contents[state_index]; + return &self->states.contents[state_index + 1]; } static inline bool ts_query_cursor__should_descend( @@ -3636,8 +3416,8 @@ static inline bool ts_query_cursor__should_descend( // If there are in-progress matches whose remaining steps occur // deeper in the tree, then descend. for (unsigned i = 0; i < self->states.size; i++) { - QueryState *state = array_get(&self->states, i); - QueryStep *next_step = array_get(&self->query->steps, state->step_index); + QueryState *state = &self->states.contents[i];; + QueryStep *next_step = &self->query->steps.contents[state->step_index]; if ( next_step->depth != PATTERN_DONE_MARKER && state->start_depth + next_step->depth > self->depth @@ -3678,31 +3458,6 @@ static inline bool ts_query_cursor__should_descend( return false; } -bool range_intersects(const TSRange *a, const TSRange *b) { - bool is_empty = a->start_byte == a->end_byte; - return ( - ( - a->end_byte > b->start_byte || - (is_empty && a->end_byte == b->start_byte) - ) && - ( - point_gt(a->end_point, b->start_point) || - (is_empty && point_eq(a->end_point, b->start_point)) - ) && - a->start_byte < b->end_byte && - point_lt(a->start_point, b->end_point) - ); -} - -bool range_within(const TSRange *a, const TSRange *b) { - return ( - a->start_byte >= b->start_byte && - point_gte(a->start_point, b->start_point) && - a->end_byte <= b->end_byte && - point_lte(a->end_point, b->end_point) - ); -} - // Walk the tree, processing patterns until at least one pattern finishes, // If one or more patterns finish, return `true` and store their states in the // `finished_states` array. Multiple patterns can finish on the same node. If @@ -3723,21 +3478,15 @@ static inline bool ts_query_cursor__advance( } } - if (++self->operation_count == OP_COUNT_PER_QUERY_CALLBACK_CHECK) { + if (++self->operation_count == OP_COUNT_PER_QUERY_TIMEOUT_CHECK) { self->operation_count = 0; } - - if (self->query_options && self->query_options->progress_callback) { - self->query_state.current_byte_offset = ts_node_start_byte(ts_tree_cursor_current_node(&self->cursor)); - } if ( did_match || self->halted || ( self->operation_count == 0 && - ( - (self->query_options && self->query_options->progress_callback && self->query_options->progress_callback(&self->query_state)) - ) + !clock_is_null(self->end_clock) && clock_is_gt(clock_now(), self->end_clock) ) ) { return did_match; @@ -3755,8 +3504,8 @@ static inline bool ts_query_cursor__advance( // After leaving a node, remove any states that cannot make further progress. uint32_t deleted_count = 0; for (unsigned i = 0, n = self->states.size; i < n; i++) { - QueryState *state = array_get(&self->states, i); - QueryStep *step = array_get(&self->query->steps, state->step_index); + QueryState *state = &self->states.contents[i]; + QueryStep *step = &self->query->steps.contents[state->step_index]; // If a state completed its pattern inside of this node, but was deferred from finishing // in order to search for longer matches, mark it as finished. @@ -3789,7 +3538,7 @@ static inline bool ts_query_cursor__advance( } else if (deleted_count > 0) { - *array_get(&self->states, i - deleted_count) = *state; + self->states.contents[i - deleted_count] = *state; } } self->states.size -= deleted_count; @@ -3823,34 +3572,41 @@ static inline bool ts_query_cursor__advance( // Enter a new node. else { + // Get the properties of the current node. TSNode node = ts_tree_cursor_current_node(&self->cursor); TSNode parent_node = ts_tree_cursor_parent_node(&self->cursor); - bool parent_intersects_range = - ts_node_is_null(parent_node) || - range_intersects(&(TSRange) { - .start_point = ts_node_start_point(parent_node), - .end_point = ts_node_end_point(parent_node), - .start_byte = ts_node_start_byte(parent_node), - .end_byte = ts_node_end_byte(parent_node), - }, &self->included_range); - TSRange node_range = (TSRange) { - .start_point = ts_node_start_point(node), - .end_point = ts_node_end_point(node), - .start_byte = ts_node_start_byte(node), - .end_byte = ts_node_end_byte(node), - }; - bool node_intersects_range = - parent_intersects_range && range_intersects(&node_range, &self->included_range); - bool node_intersects_containing_range = - range_intersects(&node_range, &self->containing_range); - bool node_within_containing_range = - range_within(&node_range, &self->containing_range); + uint32_t start_byte = ts_node_start_byte(node); + uint32_t end_byte = ts_node_end_byte(node); + TSPoint start_point = ts_node_start_point(node); + TSPoint end_point = ts_node_end_point(node); + bool is_empty = start_byte == end_byte; - if (node_within_containing_range && self->on_visible_node) { + bool parent_precedes_range = !ts_node_is_null(parent_node) && ( + ts_node_end_byte(parent_node) <= self->start_byte || + point_lte(ts_node_end_point(parent_node), self->start_point) + ); + bool parent_follows_range = !ts_node_is_null(parent_node) && ( + ts_node_start_byte(parent_node) >= self->end_byte || + point_gte(ts_node_start_point(parent_node), self->end_point) + ); + bool node_precedes_range = + parent_precedes_range || + end_byte < self->start_byte || + point_lt(end_point, self->start_point) || + (!is_empty && end_byte == self->start_byte) || + (!is_empty && point_eq(end_point, self->start_point)); + + bool node_follows_range = parent_follows_range || ( + start_byte >= self->end_byte || + point_gte(start_point, self->end_point) + ); + bool parent_intersects_range = !parent_precedes_range && !parent_follows_range; + bool node_intersects_range = !node_precedes_range && !node_follows_range; + + if (self->on_visible_node) { TSSymbol symbol = ts_node_symbol(node); bool is_named = ts_node_is_named(node); - bool is_missing = ts_node_is_missing(node); bool has_later_siblings; bool has_later_named_siblings; bool can_have_later_siblings_with_this_field; @@ -3884,11 +3640,11 @@ static inline bool ts_query_cursor__advance( // Add new states for any patterns whose root node is a wildcard. if (!node_is_error) { for (unsigned i = 0; i < self->query->wildcard_root_pattern_count; i++) { - PatternEntry *pattern = array_get(&self->query->pattern_map, i); + PatternEntry *pattern = &self->query->pattern_map.contents[i]; // If this node matches the first step of the pattern, then add a new // state at the start of this pattern. - QueryStep *step = array_get(&self->query->steps, pattern->step_index); + QueryStep *step = &self->query->steps.contents[pattern->step_index]; uint32_t start_depth = self->depth - step->depth; if ( (pattern->is_rooted ? @@ -3906,9 +3662,9 @@ static inline bool ts_query_cursor__advance( // Add new states for any patterns whose root node matches this node. unsigned i; if (ts_query__pattern_map_search(self->query, symbol, &i)) { - PatternEntry *pattern = array_get(&self->query->pattern_map, i); + PatternEntry *pattern = &self->query->pattern_map.contents[i]; - QueryStep *step = array_get(&self->query->steps, pattern->step_index); + QueryStep *step = &self->query->steps.contents[pattern->step_index]; uint32_t start_depth = self->depth - step->depth; do { // If this node matches the first step of the pattern, then add a new @@ -3926,15 +3682,15 @@ static inline bool ts_query_cursor__advance( // Advance to the next pattern whose root node matches this node. i++; if (i == self->query->pattern_map.size) break; - pattern = array_get(&self->query->pattern_map, i); - step = array_get(&self->query->steps, pattern->step_index); + pattern = &self->query->pattern_map.contents[i]; + step = &self->query->steps.contents[pattern->step_index]; } while (step->symbol == symbol); } // Update all of the in-progress states with current node. for (unsigned j = 0, copy_count = 0; j < self->states.size; j += 1 + copy_count) { - QueryState *state = array_get(&self->states, j); - QueryStep *step = array_get(&self->query->steps, state->step_index); + QueryState *state = &self->states.contents[j]; + QueryStep *step = &self->query->steps.contents[state->step_index]; state->has_in_progress_alternatives = false; copy_count = 0; @@ -3947,13 +3703,9 @@ static inline bool ts_query_cursor__advance( // pattern. bool node_does_match = false; if (step->symbol == WILDCARD_SYMBOL) { - if (step->is_missing) { - node_does_match = is_missing; - } else { - node_does_match = !node_is_error && (is_named || !step->is_named); - } + node_does_match = !node_is_error && (is_named || !step->is_named); } else { - node_does_match = symbol == step->symbol && (!step->is_missing || is_missing); + node_does_match = symbol == step->symbol; } bool later_sibling_can_match = has_later_siblings; if ((step->is_immediate && is_named) || state->seeking_immediate_match) { @@ -3983,7 +3735,7 @@ static inline bool ts_query_cursor__advance( } if (step->negated_field_list_id) { - TSFieldId *negated_field_ids = array_get(&self->query->negated_fields, step->negated_field_list_id); + TSFieldId *negated_field_ids = &self->query->negated_fields.contents[step->negated_field_list_id]; for (;;) { TSFieldId negated_field_id = *negated_field_ids; if (negated_field_id) { @@ -4078,28 +3830,14 @@ static inline bool ts_query_cursor__advance( // Advance this state to the next step of its pattern. state->step_index++; + state->seeking_immediate_match = false; LOG( " advance state. pattern:%u, step:%u\n", state->pattern_index, state->step_index ); - QueryStep *next_step = array_get(&self->query->steps, state->step_index); - - // For a given step, if the current symbol is the wildcard symbol, `_`, and it is **not** - // named, meaning it should capture anonymous nodes, **and** the next step is immediate, - // we reuse the `seeking_immediate_match` flag to indicate that we are looking for an - // immediate match due to an unnamed wildcard symbol. - // - // The reason for this is that typically, anchors will not consider anonymous nodes, - // but we're special casing the wildcard symbol to allow for any immediate matches, - // regardless of whether they are named or not. - if (step->symbol == WILDCARD_SYMBOL && !step->is_named && next_step->is_immediate) { - state->seeking_immediate_match = true; - } else { - state->seeking_immediate_match = false; - } - + QueryStep *next_step = &self->query->steps.contents[state->step_index]; if (stop_on_definite_step && next_step->root_pattern_guaranteed) did_match = true; // If this state's next step has an alternative step, then copy the state in order @@ -4107,8 +3845,8 @@ static inline bool ts_query_cursor__advance( // so this is an interactive process. unsigned end_index = j + 1; for (unsigned k = j; k < end_index; k++) { - QueryState *child_state = array_get(&self->states, k); - QueryStep *child_step = array_get(&self->query->steps, child_state->step_index); + QueryState *child_state = &self->states.contents[k]; + QueryStep *child_step = &self->query->steps.contents[child_state->step_index]; if (child_step->alternative_index != NONE) { // A "dead-end" step exists only to add a non-sequential jump into the step sequence, // via its alternative index. When a state reaches a dead-end step, it jumps straight @@ -4149,7 +3887,7 @@ static inline bool ts_query_cursor__advance( } for (unsigned j = 0; j < self->states.size; j++) { - QueryState *state = array_get(&self->states, j); + QueryState *state = &self->states.contents[j]; if (state->dead) { array_erase(&self->states, j); j--; @@ -4161,7 +3899,7 @@ static inline bool ts_query_cursor__advance( // one state has a strict subset of another state's captures. bool did_remove = false; for (unsigned k = j + 1; k < self->states.size; k++) { - QueryState *other_state = array_get(&self->states, k); + QueryState *other_state = &self->states.contents[k]; // Query states are kept in ascending order of start_depth and pattern_index. // Since the longest-match criteria is only used for deduping matches of the same @@ -4221,7 +3959,7 @@ static inline bool ts_query_cursor__advance( state->step_index, capture_list_pool_get(&self->capture_list_pool, state->capture_list_id)->size ); - QueryStep *next_step = array_get(&self->query->steps, state->step_index); + QueryStep *next_step = &self->query->steps.contents[state->step_index]; if (next_step->depth == PATTERN_DONE_MARKER) { if (state->has_in_progress_alternatives) { LOG(" defer finishing pattern %u\n", state->pattern_index); @@ -4237,7 +3975,7 @@ static inline bool ts_query_cursor__advance( } } - if (node_intersects_containing_range && ts_query_cursor__should_descend(self, node_intersects_range)) { + if (ts_query_cursor__should_descend(self, node_intersects_range)) { switch (ts_tree_cursor_goto_first_child_internal(&self->cursor)) { case TreeCursorStepVisible: self->depth++; @@ -4266,7 +4004,7 @@ bool ts_query_cursor_next_match( } } - QueryState *state = array_get(&self->finished_states, 0); + QueryState *state = &self->finished_states.contents[0]; if (state->id == UINT32_MAX) state->id = self->next_state_id++; match->id = state->id; match->pattern_index = state->pattern_index; @@ -4286,7 +4024,7 @@ void ts_query_cursor_remove_match( uint32_t match_id ) { for (unsigned i = 0; i < self->finished_states.size; i++) { - const QueryState *state = array_get(&self->finished_states, i); + const QueryState *state = &self->finished_states.contents[i]; if (state->id == match_id) { capture_list_pool_release( &self->capture_list_pool, @@ -4300,7 +4038,7 @@ void ts_query_cursor_remove_match( // Remove unfinished query states as well to prevent future // captures for a match being removed. for (unsigned i = 0; i < self->states.size; i++) { - const QueryState *state = array_get(&self->states, i); + const QueryState *state = &self->states.contents[i]; if (state->id == match_id) { capture_list_pool_release( &self->capture_list_pool, @@ -4326,7 +4064,7 @@ bool ts_query_cursor_next_capture( uint32_t first_unfinished_pattern_index; uint32_t first_unfinished_state_index; bool first_unfinished_state_is_definite = false; - bool found_unfinished_state = ts_query_cursor__first_in_progress_capture( + ts_query_cursor__first_in_progress_capture( self, &first_unfinished_state_index, &first_unfinished_capture_byte, @@ -4340,7 +4078,7 @@ bool ts_query_cursor_next_capture( uint32_t first_finished_capture_byte = first_unfinished_capture_byte; uint32_t first_finished_pattern_index = first_unfinished_pattern_index; for (unsigned i = 0; i < self->finished_states.size;) { - QueryState *state = array_get(&self->finished_states, i); + QueryState *state = &self->finished_states.contents[i]; const CaptureList *captures = capture_list_pool_get( &self->capture_list_pool, state->capture_list_id @@ -4356,15 +4094,15 @@ bool ts_query_cursor_next_capture( continue; } - TSNode node = array_get(captures, state->consumed_capture_count)->node; + TSNode node = captures->contents[state->consumed_capture_count].node; bool node_precedes_range = ( - ts_node_end_byte(node) <= self->included_range.start_byte || - point_lte(ts_node_end_point(node), self->included_range.start_point) + ts_node_end_byte(node) <= self->start_byte || + point_lte(ts_node_end_point(node), self->start_point) ); bool node_follows_range = ( - ts_node_start_byte(node) >= self->included_range.end_byte || - point_gte(ts_node_start_point(node), self->included_range.end_point) + ts_node_start_byte(node) >= self->end_byte || + point_gte(ts_node_start_point(node), self->end_point) ); bool node_outside_of_range = node_precedes_range || node_follows_range; @@ -4396,7 +4134,7 @@ bool ts_query_cursor_next_capture( if (first_finished_state) { state = first_finished_state; } else if (first_unfinished_state_is_definite) { - state = array_get(&self->states, first_unfinished_state_index); + state = &self->states.contents[first_unfinished_state_index]; } else { state = NULL; } @@ -4416,7 +4154,7 @@ bool ts_query_cursor_next_capture( return true; } - if (capture_list_pool_is_empty(&self->capture_list_pool) && found_unfinished_state) { + if (capture_list_pool_is_empty(&self->capture_list_pool)) { LOG( " abandon state. index:%u, pattern:%u, offset:%u.\n", first_unfinished_state_index, @@ -4425,7 +4163,7 @@ bool ts_query_cursor_next_capture( ); capture_list_pool_release( &self->capture_list_pool, - array_get(&self->states, first_unfinished_state_index)->capture_list_id + self->states.contents[first_unfinished_state_index].capture_list_id ); array_erase(&self->states, first_unfinished_state_index); } diff --git a/lib/src/stack.c b/lib/src/stack.c index 91420074..ac2f3bd6 100644 --- a/lib/src/stack.c +++ b/lib/src/stack.c @@ -1,9 +1,10 @@ -#include "./alloc.h" -#include "./language.h" -#include "./subtree.h" -#include "./array.h" #include "./stack.h" +#include "./alloc.h" +#include "./array.h" +#include "./language.h" #include "./length.h" +#include "./lexer.h" +#include "./subtree.h" #include #include #include @@ -18,895 +19,973 @@ #define forceinline static inline __attribute__((always_inline)) #endif +#define LOG(...) \ + if (self->lexer->logger.log || dot_graph_file) { \ + snprintf(self->lexer->debug_buffer, TREE_SITTER_SERIALIZATION_BUFFER_SIZE, __VA_ARGS__); \ + ts_stack__log(self, dot_graph_file); \ + } + +#define LOG_TREE(subtree) \ + if (dot_graph_file) { \ + printf("self->language:%p\n", (void *)self->language); \ + ts_subtree_print_dot_graph(subtree, self->language, dot_graph_file); \ + fputs("\n", dot_graph_file); \ + } + +#define LOG_LINKS() \ + for (uint32_t k = 0; k < node->link_count; k++) { \ + printf("link %d\n", k); \ + printf("node:%p\n", node->links[k].node); \ + printf("subtree:%p\n", node->links[k].subtree.ptr); \ + if (node->links[k].subtree.ptr) { \ + LOG("LINK TREE %d", k); \ + LOG_TREE(node->links[k].subtree); \ + } else { \ + LOG("LINK NO TREE %d", k); \ + } \ + } + typedef struct StackNode StackNode; typedef struct { - StackNode *node; - Subtree subtree; - bool is_pending; + StackNode *node; + Subtree subtree; + bool is_pending; } StackLink; struct StackNode { - TSStateId state; - Length position; - StackLink links[MAX_LINK_COUNT]; - short unsigned int link_count; - uint32_t ref_count; - unsigned error_cost; - unsigned node_count; - int dynamic_precedence; + TSStateId state; + Length position; + StackLink links[MAX_LINK_COUNT]; + short unsigned int link_count; + uint32_t ref_count; + unsigned error_cost; + unsigned node_count; + int dynamic_precedence; }; typedef struct { - StackNode *node; - SubtreeArray subtrees; - uint32_t subtree_count; - bool is_pending; + StackNode *node; + SubtreeArray subtrees; + uint32_t subtree_count; + bool is_pending; } StackIterator; typedef Array(StackNode *) StackNodeArray; typedef enum { - StackStatusActive, - StackStatusPaused, - StackStatusHalted, + StackStatusActive, + StackStatusPaused, + StackStatusHalted, } StackStatus; typedef struct { - StackNode *node; - StackSummary *summary; - unsigned node_count_at_last_error; - Subtree last_external_token; - Subtree lookahead_when_paused; - StackStatus status; + StackNode *node; + StackSummary *summary; + unsigned node_count_at_last_error; + Subtree last_external_token; + Subtree lookahead_when_paused; + StackStatus status; } StackHead; struct Stack { - Array(StackHead) heads; - StackSliceArray slices; - Array(StackIterator) iterators; - StackNodeArray node_pool; - StackNode *base_node; - SubtreePool *subtree_pool; + Array(StackHead) heads; + StackSliceArray slices; + Array(StackIterator) iterators; + StackNodeArray node_pool; + StackNode *base_node; + SubtreePool *subtree_pool; + const TSLanguage *language; + Lexer *lexer; }; typedef unsigned StackAction; + enum { - StackActionNone, - StackActionStop = 1, - StackActionPop = 2, + StackActionNone, + StackActionStop = 1, + StackActionPop = 2, }; typedef StackAction (*StackCallback)(void *, const StackIterator *); static void stack_node_retain(StackNode *self) { - if (!self) - return; - ts_assert(self->ref_count > 0); - self->ref_count++; - ts_assert(self->ref_count != 0); + if (!self) + return; + assert(self->ref_count > 0); + self->ref_count++; + assert(self->ref_count != 0); } -static void stack_node_release( - StackNode *self, - StackNodeArray *pool, - SubtreePool *subtree_pool -) { -recur: - ts_assert(self->ref_count != 0); - self->ref_count--; - if (self->ref_count > 0) return; - - StackNode *first_predecessor = NULL; - if (self->link_count > 0) { - for (unsigned i = self->link_count - 1; i > 0; i--) { - StackLink link = self->links[i]; - if (link.subtree.ptr) ts_subtree_release(subtree_pool, link.subtree); - stack_node_release(link.node, pool, subtree_pool); +static void ts_stack__log(Stack *self, FILE *dot_graph_file) { + if (self->lexer->logger.log) { + self->lexer->logger.log(self->lexer->logger.payload, TSLogTypeParse, self->lexer->debug_buffer); } - StackLink link = self->links[0]; - if (link.subtree.ptr) ts_subtree_release(subtree_pool, link.subtree); - first_predecessor = self->links[0].node; - } - if (pool->size < MAX_NODE_POOL_SIZE) { - array_push(pool, self); - } else { - ts_free(self); - } + if (dot_graph_file) { + fprintf(dot_graph_file, "graph {\nlabel=\""); + for (char *chr = &self->lexer->debug_buffer[0]; *chr != 0; chr++) { + if (*chr == '"' || *chr == '\\') + fputc('\\', dot_graph_file); + fputc(*chr, dot_graph_file); + } + fprintf(dot_graph_file, "\"\n}\n\n"); + } +} - if (first_predecessor) { - self = first_predecessor; - goto recur; - } +static void stack_node_release(StackNode *self, StackNodeArray *pool, SubtreePool *subtree_pool) { +recur: + assert(self->ref_count != 0); + self->ref_count--; + if (self->ref_count > 0) + return; + + StackNode *first_predecessor = NULL; + if (self->link_count > 0) { + for (unsigned i = self->link_count - 1; i > 0; i--) { + StackLink link = self->links[i]; + if (link.subtree.ptr) + ts_subtree_release(subtree_pool, link.subtree); + stack_node_release(link.node, pool, subtree_pool); + } + StackLink link = self->links[0]; + if (link.subtree.ptr) + ts_subtree_release(subtree_pool, link.subtree); + first_predecessor = self->links[0].node; + } + + if (pool->size < MAX_NODE_POOL_SIZE) { + array_push(pool, self); + } else { + ts_free(self); + } + + if (first_predecessor) { + self = first_predecessor; + goto recur; + } } /// Get the number of nodes in the subtree, for the purpose of measuring /// how much progress has been made by a given version of the stack. static uint32_t stack__subtree_node_count(Subtree subtree) { - uint32_t count = ts_subtree_visible_descendant_count(subtree); - if (ts_subtree_visible(subtree)) count++; + uint32_t count = ts_subtree_visible_descendant_count(subtree); + if (ts_subtree_visible(subtree)) + count++; - // Count intermediate error nodes even though they are not visible, - // because a stack version's node count is used to check whether it - // has made any progress since the last time it encountered an error. - if (ts_subtree_symbol(subtree) == ts_builtin_sym_error_repeat) count++; + // Count intermediate error nodes even though they are not visible, + // because a stack version's node count is used to check whether it + // has made any progress since the last time it encountered an error. + if (ts_subtree_symbol(subtree) == ts_builtin_sym_error_repeat) + count++; - return count; + return count; } -static StackNode *stack_node_new( - StackNode *previous_node, - Subtree subtree, - bool is_pending, - TSStateId state, - StackNodeArray *pool -) { - StackNode *node = pool->size > 0 - ? array_pop(pool) - : ts_malloc(sizeof(StackNode)); - *node = (StackNode) { - .ref_count = 1, - .link_count = 0, - .state = state - }; +static StackNode *stack_node_new(StackNode *previous_node, Subtree subtree, bool is_pending, TSStateId state, + StackNodeArray *pool) { + StackNode *node = pool->size > 0 ? array_pop(pool) : ts_malloc(sizeof(StackNode)); + *node = (StackNode){.ref_count = 1, .link_count = 0, .state = state}; - if (previous_node) { - node->link_count = 1; - node->links[0] = (StackLink) { - .node = previous_node, - .subtree = subtree, - .is_pending = is_pending, - }; + if (previous_node) { + node->link_count = 1; + node->links[0] = (StackLink){ + .node = previous_node, + .subtree = subtree, + .is_pending = is_pending, + }; - node->position = previous_node->position; - node->error_cost = previous_node->error_cost; - node->dynamic_precedence = previous_node->dynamic_precedence; - node->node_count = previous_node->node_count; + node->position = previous_node->position; + node->error_cost = previous_node->error_cost; + node->dynamic_precedence = previous_node->dynamic_precedence; + node->node_count = previous_node->node_count; - if (subtree.ptr) { - node->error_cost += ts_subtree_error_cost(subtree); - node->position = length_add(node->position, ts_subtree_total_size(subtree)); - node->node_count += stack__subtree_node_count(subtree); - node->dynamic_precedence += ts_subtree_dynamic_precedence(subtree); + if (subtree.ptr) { + node->error_cost += ts_subtree_error_cost(subtree); + node->position = length_add(node->position, ts_subtree_total_size(subtree)); + node->node_count += stack__subtree_node_count(subtree); + node->dynamic_precedence += ts_subtree_dynamic_precedence(subtree); + } + } else { + node->position = length_zero(); + // node->error_cost = 0; } - } else { - node->position = length_zero(); - node->error_cost = 0; - } - return node; + return node; } static bool stack__subtree_is_equivalent(Subtree left, Subtree right) { - if (left.ptr == right.ptr) return true; - if (!left.ptr || !right.ptr) return false; + if (left.ptr == right.ptr) + return true; + if (!left.ptr || !right.ptr) + return false; - // Symbols must match - if (ts_subtree_symbol(left) != ts_subtree_symbol(right)) return false; + // Symbols must match + if (ts_subtree_symbol(left) != ts_subtree_symbol(right)) + return false; - // If both have errors, don't bother keeping both. - if (ts_subtree_error_cost(left) > 0 && ts_subtree_error_cost(right) > 0) return true; + // If both have errors, don't bother keeping both. + if (ts_subtree_error_cost(left) > 0 && ts_subtree_error_cost(right) > 0) + return true; - return ( - ts_subtree_padding(left).bytes == ts_subtree_padding(right).bytes && - ts_subtree_size(left).bytes == ts_subtree_size(right).bytes && - ts_subtree_child_count(left) == ts_subtree_child_count(right) && - ts_subtree_extra(left) == ts_subtree_extra(right) && - ts_subtree_external_scanner_state_eq(left, right) - ); + return (ts_subtree_padding(left).bytes == ts_subtree_padding(right).bytes && + ts_subtree_size(left).bytes == ts_subtree_size(right).bytes && + ts_subtree_child_count(left) == ts_subtree_child_count(right) && + ts_subtree_extra(left) == ts_subtree_extra(right) && ts_subtree_external_scanner_state_eq(left, right)); } -static void stack_node_add_link( - StackNode *self, - StackLink link, - SubtreePool *subtree_pool -) { - if (link.node == self) return; - - for (int i = 0; i < self->link_count; i++) { - StackLink *existing_link = &self->links[i]; - if (stack__subtree_is_equivalent(existing_link->subtree, link.subtree)) { - // In general, we preserve ambiguities until they are removed from the stack - // during a pop operation where multiple paths lead to the same node. But in - // the special case where two links directly connect the same pair of nodes, - // we can safely remove the ambiguity ahead of time without changing behavior. - if (existing_link->node == link.node) { - if ( - ts_subtree_dynamic_precedence(link.subtree) > - ts_subtree_dynamic_precedence(existing_link->subtree) - ) { - ts_subtree_retain(link.subtree); - ts_subtree_release(subtree_pool, existing_link->subtree); - existing_link->subtree = link.subtree; - self->dynamic_precedence = - link.node->dynamic_precedence + ts_subtree_dynamic_precedence(link.subtree); - } +static void stack_node_add_link(StackNode *self, StackLink link, SubtreePool *subtree_pool) { + if (link.node == self) return; - } - // If the previous nodes are mergeable, merge them recursively. - if ( - existing_link->node->state == link.node->state && - existing_link->node->position.bytes == link.node->position.bytes && - existing_link->node->error_cost == link.node->error_cost - ) { - for (int j = 0; j < link.node->link_count; j++) { - stack_node_add_link(existing_link->node, link.node->links[j], subtree_pool); - } - int32_t dynamic_precedence = link.node->dynamic_precedence; - if (link.subtree.ptr) { - dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree); - } - if (dynamic_precedence > self->dynamic_precedence) { - self->dynamic_precedence = dynamic_precedence; - } - return; - } - } - } - - if (self->link_count == MAX_LINK_COUNT) return; - - stack_node_retain(link.node); - unsigned node_count = link.node->node_count; - int dynamic_precedence = link.node->dynamic_precedence; - self->links[self->link_count++] = link; - - if (link.subtree.ptr) { - ts_subtree_retain(link.subtree); - node_count += stack__subtree_node_count(link.subtree); - dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree); - } - - if (node_count > self->node_count) self->node_count = node_count; - if (dynamic_precedence > self->dynamic_precedence) self->dynamic_precedence = dynamic_precedence; -} - -static void stack_head_delete( - StackHead *self, - StackNodeArray *pool, - SubtreePool *subtree_pool -) { - if (self->node) { - if (self->last_external_token.ptr) { - ts_subtree_release(subtree_pool, self->last_external_token); - } - if (self->lookahead_when_paused.ptr) { - ts_subtree_release(subtree_pool, self->lookahead_when_paused); - } - if (self->summary) { - array_delete(self->summary); - ts_free(self->summary); - } - stack_node_release(self->node, pool, subtree_pool); - } -} - -static StackVersion ts_stack__add_version( - Stack *self, - StackVersion original_version, - StackNode *node -) { - StackHead head = { - .node = node, - .node_count_at_last_error = array_get(&self->heads, original_version)->node_count_at_last_error, - .last_external_token = array_get(&self->heads, original_version)->last_external_token, - .status = StackStatusActive, - .lookahead_when_paused = NULL_SUBTREE, - }; - array_push(&self->heads, head); - stack_node_retain(node); - if (head.last_external_token.ptr) ts_subtree_retain(head.last_external_token); - return (StackVersion)(self->heads.size - 1); -} - -static void ts_stack__add_slice( - Stack *self, - StackVersion original_version, - StackNode *node, - SubtreeArray *subtrees -) { - for (uint32_t i = self->slices.size - 1; i + 1 > 0; i--) { - StackVersion version = array_get(&self->slices, i)->version; - if (array_get(&self->heads, version)->node == node) { - StackSlice slice = {*subtrees, version}; - array_insert(&self->slices, i + 1, slice); - return; - } - } - - StackVersion version = ts_stack__add_version(self, original_version, node); - StackSlice slice = { *subtrees, version }; - array_push(&self->slices, slice); -} - -static StackSliceArray stack__iter( - Stack *self, - StackVersion version, - StackCallback callback, - void *payload, - int goal_subtree_count -) { - array_clear(&self->slices); - array_clear(&self->iterators); - - StackHead *head = array_get(&self->heads, version); - StackIterator new_iterator = { - .node = head->node, - .subtrees = array_new(), - .subtree_count = 0, - .is_pending = true, - }; - - bool include_subtrees = false; - if (goal_subtree_count >= 0) { - include_subtrees = true; - array_reserve(&new_iterator.subtrees, (uint32_t)ts_subtree_alloc_size(goal_subtree_count) / sizeof(Subtree)); - } - - array_push(&self->iterators, new_iterator); - - while (self->iterators.size > 0) { - for (uint32_t i = 0, size = self->iterators.size; i < size; i++) { - StackIterator *iterator = array_get(&self->iterators, i); - StackNode *node = iterator->node; - - StackAction action = callback(payload, iterator); - bool should_pop = action & StackActionPop; - bool should_stop = action & StackActionStop || node->link_count == 0; - - if (should_pop) { - SubtreeArray subtrees = iterator->subtrees; - if (!should_stop) { - ts_subtree_array_copy(subtrees, &subtrees); - } - ts_subtree_array_reverse(&subtrees); - ts_stack__add_slice( - self, - version, - node, - &subtrees - ); - } - - if (should_stop) { - if (!should_pop) { - ts_subtree_array_delete(self->subtree_pool, &iterator->subtrees); - } - array_erase(&self->iterators, i); - i--, size--; - continue; - } - - for (uint32_t j = 1; j <= node->link_count; j++) { - StackIterator *next_iterator; - StackLink link; - if (j == node->link_count) { - link = node->links[0]; - next_iterator = array_get(&self->iterators, i); - } else { - if (self->iterators.size >= MAX_ITERATOR_COUNT) continue; - link = node->links[j]; - StackIterator current_iterator = *array_get(&self->iterators, i); - array_push(&self->iterators, current_iterator); - next_iterator = array_back(&self->iterators); - ts_subtree_array_copy(next_iterator->subtrees, &next_iterator->subtrees); - } - - next_iterator->node = link.node; - if (link.subtree.ptr) { - if (include_subtrees) { - array_push(&next_iterator->subtrees, link.subtree); - ts_subtree_retain(link.subtree); - } - - if (!ts_subtree_extra(link.subtree)) { - next_iterator->subtree_count++; - if (!link.is_pending) { - next_iterator->is_pending = false; + for (int i = 0; i < self->link_count; i++) { + StackLink *existing_link = &self->links[i]; + if (stack__subtree_is_equivalent(existing_link->subtree, link.subtree)) { + // In general, we preserve ambiguities until they are removed from the stack + // during a pop operation where multiple paths lead to the same node. But in + // the special case where two links directly connect the same pair of nodes, + // we can safely remove the ambiguity ahead of time without changing behavior. + if (existing_link->node == link.node) { + if (ts_subtree_dynamic_precedence(link.subtree) > + ts_subtree_dynamic_precedence(existing_link->subtree)) { + ts_subtree_retain(link.subtree); + ts_subtree_release(subtree_pool, existing_link->subtree); + existing_link->subtree = link.subtree; + self->dynamic_precedence = + link.node->dynamic_precedence + ts_subtree_dynamic_precedence(link.subtree); + } + return; } - } - } else { - next_iterator->subtree_count++; - next_iterator->is_pending = false; - } - } - } - } - return self->slices; + // If the previous nodes are mergeable, merge them recursively. + if (existing_link->node->state == link.node->state && + existing_link->node->position.bytes == link.node->position.bytes && + existing_link->node->error_cost == link.node->error_cost) { + for (int j = 0; j < link.node->link_count; j++) { + stack_node_add_link(existing_link->node, link.node->links[j], subtree_pool); + } + int32_t dynamic_precedence = link.node->dynamic_precedence; + if (link.subtree.ptr) { + dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree); + } + if (dynamic_precedence > self->dynamic_precedence) { + self->dynamic_precedence = dynamic_precedence; + } + return; + } + } + } + + if (self->link_count == MAX_LINK_COUNT) + return; + + stack_node_retain(link.node); + unsigned node_count = link.node->node_count; + int dynamic_precedence = link.node->dynamic_precedence; + self->links[self->link_count++] = link; + + if (link.subtree.ptr) { + ts_subtree_retain(link.subtree); + node_count += stack__subtree_node_count(link.subtree); + dynamic_precedence += ts_subtree_dynamic_precedence(link.subtree); + } + + if (node_count > self->node_count) + self->node_count = node_count; + if (dynamic_precedence > self->dynamic_precedence) + self->dynamic_precedence = dynamic_precedence; } -Stack *ts_stack_new(SubtreePool *subtree_pool) { - Stack *self = ts_calloc(1, sizeof(Stack)); +static void stack_head_delete(StackHead *self, StackNodeArray *pool, SubtreePool *subtree_pool) { + if (self->node) { + if (self->last_external_token.ptr) { + ts_subtree_release(subtree_pool, self->last_external_token); + } + if (self->lookahead_when_paused.ptr) { + ts_subtree_release(subtree_pool, self->lookahead_when_paused); + } + if (self->summary) { + array_delete(self->summary); + ts_free(self->summary); + } + stack_node_release(self->node, pool, subtree_pool); + } +} - array_init(&self->heads); - array_init(&self->slices); - array_init(&self->iterators); - array_init(&self->node_pool); - array_reserve(&self->heads, 4); - array_reserve(&self->slices, 4); - array_reserve(&self->iterators, 4); - array_reserve(&self->node_pool, MAX_NODE_POOL_SIZE); +static StackVersion ts_stack__add_version(Stack *self, StackVersion original_version, StackNode *node) { + StackHead head = { + .node = node, + .node_count_at_last_error = self->heads.contents[original_version].node_count_at_last_error, + .last_external_token = self->heads.contents[original_version].last_external_token, + .status = StackStatusActive, + .lookahead_when_paused = NULL_SUBTREE, + }; + array_push(&self->heads, head); + stack_node_retain(node); + if (head.last_external_token.ptr) + ts_subtree_retain(head.last_external_token); + return (StackVersion)(self->heads.size - 1); +} - self->subtree_pool = subtree_pool; - self->base_node = stack_node_new(NULL, NULL_SUBTREE, false, 1, &self->node_pool); - ts_stack_clear(self); +static void ts_stack__add_slice(Stack *self, StackVersion original_version, StackNode *node, SubtreeArray *subtrees) { + for (uint32_t i = self->slices.size - 1; i + 1 > 0; i--) { + StackVersion version = self->slices.contents[i].version; + if (self->heads.contents[version].node == node) { + StackSlice slice = {*subtrees, version}; + array_insert(&self->slices, i + 1, slice); + return; + } + } - return self; + StackVersion version = ts_stack__add_version(self, original_version, node); + StackSlice slice = {*subtrees, version}; + array_push(&self->slices, slice); +} + +static StackSliceArray stack__iter(Stack *self, StackVersion version, StackCallback callback, void *payload, + int goal_subtree_count, FILE *dot_graph_file) { + array_clear(&self->slices); + array_clear(&self->iterators); + + StackHead *head = array_get(&self->heads, version); + StackIterator new_iterator = { + .node = head->node, + .subtrees = array_new(), + .subtree_count = 0, + .is_pending = true, + }; + + bool include_subtrees = false; + if (goal_subtree_count >= 0) { + include_subtrees = true; + array_reserve(&new_iterator.subtrees, + (uint32_t)ts_subtree_alloc_size(goal_subtree_count ? 1 : goal_subtree_count) / sizeof(Subtree)); + } + + printf("iterator len: %d\n", self->iterators.size); + array_push(&self->iterators, new_iterator); + printf("iterator len: %d\n", self->iterators.size); + + while (self->iterators.size > 0) { + for (uint32_t i = 0, size = self->iterators.size; i < size; i++) { + StackIterator *iterator = &self->iterators.contents[i]; + StackNode *node = iterator->node; + + StackAction action = callback(payload, iterator); + bool should_pop = action & StackActionPop; + bool should_stop = action & StackActionStop || node->link_count == 0; + printf("should_pop: %d\n", should_pop); + printf("should_stop: %d\n", should_stop); + + if (should_pop) { + SubtreeArray subtrees = iterator->subtrees; + for (uint32_t j = 0; j < subtrees.size; j++) { + LOG("TREE %d", j); + LOG_TREE(subtrees.contents[j]); + } + if (!should_stop) { + ts_subtree_array_copy(subtrees, &subtrees); + LOG("[0] PRE COPY LEN %d", subtrees.size); + for (uint32_t k = 0; k < subtrees.size; k++) { + LOG("[0] PRE COPY TREE %d", k); + LOG_TREE(subtrees.contents[k]); + } + LOG("[0] NEW PTR: %p\n", (void *)subtrees.contents) + LOG("[0] POST COPY LEN %d", subtrees.size); + for (uint32_t k = 0; k < subtrees.size; k++) { + LOG("[0] POST COPY TREE %d", k); + LOG_TREE(subtrees.contents[k]); + } + } + for (uint32_t k = 0; k < subtrees.size; k++) { + LOG("[0] PRE REVERSE TREE %d", k); + LOG_TREE(subtrees.contents[k]); + } + ts_subtree_array_reverse(&subtrees); + for (uint32_t k = 0; k < subtrees.size; k++) { + LOG("[0] POST REVERSE TREE %d", k); + LOG_TREE(subtrees.contents[k]); + } + ts_stack__add_slice(self, version, node, &subtrees); + printf("ADD SLICE\n"); + LOG("ADD SLICE\n"); + for (uint32_t j = 0; j < subtrees.size; j++) { + LOG("ADD SLICE TREE %d", j); + LOG_TREE(subtrees.contents[j]); + } + } + + if (should_stop) { + if (!should_pop) { + ts_subtree_array_delete(self->subtree_pool, &iterator->subtrees); + } + array_erase(&self->iterators, i); + i--, size--; + continue; + } + + for (uint32_t j = 1; j <= node->link_count; j++) { + StackIterator *next_iterator; + StackLink link; + if (j == node->link_count) { + printf("link set 1\n"); + link = node->links[0]; + LOG("# of links=%d", node->link_count); + for (uint32_t k = 0; k < node->link_count; k++) { + printf("link %d\n", k); + printf("node:%p\n", node->links[k].node); + printf("subtree:%p\n", node->links[k].subtree.ptr); + if (node->links[k].subtree.ptr) { + LOG("LINK TREE %d", k); + LOG_TREE(node->links[k].subtree); + } else { + LOG("LINK NO TREE %d", k); + } + } + next_iterator = &self->iterators.contents[i]; + } else { + if (self->iterators.size >= MAX_ITERATOR_COUNT) + continue; + link = node->links[j]; + StackIterator current_iterator = self->iterators.contents[i]; + array_push(&self->iterators, current_iterator); + next_iterator = array_back(&self->iterators); + ts_subtree_array_copy(next_iterator->subtrees, &next_iterator->subtrees); + LOG("[1] PRE COPY LEN %d", next_iterator->subtrees.size); + for (uint32_t k = 0; k < next_iterator->subtrees.size; k++) { + LOG("[1] PRE COPY TREE %d", k); + LOG_TREE(next_iterator->subtrees.contents[k]); + } + LOG("[1] NEW PTR: %p\n", (void *)next_iterator->subtrees.contents) + LOG("[1] POST COPY LEN %d", next_iterator->subtrees.size); + for (uint32_t k = 0; k < next_iterator->subtrees.size; k++) { + LOG("[1] POST COPY TREE %d", k); + LOG_TREE(next_iterator->subtrees.contents[k]); + } + } + + next_iterator->node = link.node; + if (link.subtree.ptr) { + if (include_subtrees) { + printf("PUSH INCLUDE SUBTREE\n"); + LOG("PUSH INCLUDING SUBTREE"); + LOG_TREE(link.subtree); + array_push(&next_iterator->subtrees, link.subtree); + + ts_subtree_retain(link.subtree); + } + + if (!ts_subtree_extra(link.subtree)) { + next_iterator->subtree_count++; + if (!link.is_pending) { + next_iterator->is_pending = false; + } + } + } else { + next_iterator->subtree_count++; + next_iterator->is_pending = false; + } + } + } + } + + return self->slices; +} + +Stack *ts_stack_new(SubtreePool *subtree_pool, const TSLanguage *language) { + Stack *self = ts_calloc(1, sizeof(Stack)); + + array_init(&self->heads); + array_init(&self->slices); + array_init(&self->iterators); + array_init(&self->node_pool); + array_reserve(&self->heads, 4); + array_reserve(&self->slices, 4); + array_reserve(&self->iterators, 4); + array_reserve(&self->node_pool, MAX_NODE_POOL_SIZE); + + self->subtree_pool = subtree_pool; + self->base_node = stack_node_new(NULL, NULL_SUBTREE, false, 1, &self->node_pool); + self->language = language; + printf("language:%p\n", language); + ts_stack_clear(self); + + return self; } void ts_stack_delete(Stack *self) { - if (self->slices.contents) - array_delete(&self->slices); - if (self->iterators.contents) - array_delete(&self->iterators); - stack_node_release(self->base_node, &self->node_pool, self->subtree_pool); - for (uint32_t i = 0; i < self->heads.size; i++) { - stack_head_delete(array_get(&self->heads, i), &self->node_pool, self->subtree_pool); - } - array_clear(&self->heads); - if (self->node_pool.contents) { - for (uint32_t i = 0; i < self->node_pool.size; i++) - ts_free(*array_get(&self->node_pool, i)); - array_delete(&self->node_pool); - } - array_delete(&self->heads); - ts_free(self); -} - -uint32_t ts_stack_version_count(const Stack *self) { - return self->heads.size; -} - -uint32_t ts_stack_halted_version_count(Stack *self) { - uint32_t count = 0; - for (uint32_t i = 0; i < self->heads.size; i++) { - StackHead *head = array_get(&self->heads, i); - if (head->status == StackStatusHalted) { - count++; + if (self->slices.contents) + array_delete(&self->slices); + if (self->iterators.contents) + array_delete(&self->iterators); + stack_node_release(self->base_node, &self->node_pool, self->subtree_pool); + for (uint32_t i = 0; i < self->heads.size; i++) { + stack_head_delete(&self->heads.contents[i], &self->node_pool, self->subtree_pool); } - } - return count; + array_clear(&self->heads); + if (self->node_pool.contents) { + for (uint32_t i = 0; i < self->node_pool.size; i++) + ts_free(self->node_pool.contents[i]); + array_delete(&self->node_pool); + } + array_delete(&self->heads); + ts_free(self); } +uint32_t ts_stack_version_count(const Stack *self) { return self->heads.size; } + TSStateId ts_stack_state(const Stack *self, StackVersion version) { - return array_get(&self->heads, version)->node->state; + return array_get(&self->heads, version)->node->state; } Length ts_stack_position(const Stack *self, StackVersion version) { - return array_get(&self->heads, version)->node->position; + return array_get(&self->heads, version)->node->position; } Subtree ts_stack_last_external_token(const Stack *self, StackVersion version) { - return array_get(&self->heads, version)->last_external_token; + return array_get(&self->heads, version)->last_external_token; } void ts_stack_set_last_external_token(Stack *self, StackVersion version, Subtree token) { - StackHead *head = array_get(&self->heads, version); - if (token.ptr) ts_subtree_retain(token); - if (head->last_external_token.ptr) ts_subtree_release(self->subtree_pool, head->last_external_token); - head->last_external_token = token; + StackHead *head = array_get(&self->heads, version); + if (token.ptr) + ts_subtree_retain(token); + if (head->last_external_token.ptr) + ts_subtree_release(self->subtree_pool, head->last_external_token); + head->last_external_token = token; } +void ts_stack_set_language(Stack *self, const TSLanguage *language) { self->language = language; } + +void ts_stack_set_lexer(Stack *self, Lexer *lexer) { self->lexer = lexer; } + unsigned ts_stack_error_cost(const Stack *self, StackVersion version) { - StackHead *head = array_get(&self->heads, version); - unsigned result = head->node->error_cost; - if ( - head->status == StackStatusPaused || - (head->node->state == ERROR_STATE && !head->node->links[0].subtree.ptr)) { - result += ERROR_COST_PER_RECOVERY; - } - return result; + StackHead *head = array_get(&self->heads, version); + unsigned result = head->node->error_cost; + if (head->status == StackStatusPaused || (head->node->state == ERROR_STATE && !head->node->links[0].subtree.ptr)) { + if (head->node->links[0].subtree.data.is_inline) { + printf("DID += FOR %s\n", + ts_language_symbol_name(self->language, ts_subtree_symbol(head->node->links[0].subtree))); + } + result += ERROR_COST_PER_RECOVERY; + } + return result; } unsigned ts_stack_node_count_since_error(const Stack *self, StackVersion version) { - StackHead *head = array_get(&self->heads, version); - if (head->node->node_count < head->node_count_at_last_error) { - head->node_count_at_last_error = head->node->node_count; - } - return head->node->node_count - head->node_count_at_last_error; + StackHead *head = array_get(&self->heads, version); + if (head->node->node_count < head->node_count_at_last_error) { + head->node_count_at_last_error = head->node->node_count; + } + return head->node->node_count - head->node_count_at_last_error; } -void ts_stack_push( - Stack *self, - StackVersion version, - Subtree subtree, - bool pending, - TSStateId state -) { - StackHead *head = array_get(&self->heads, version); - StackNode *new_node = stack_node_new(head->node, subtree, pending, state, &self->node_pool); - if (!subtree.ptr) head->node_count_at_last_error = new_node->node_count; - head->node = new_node; +void ts_stack_push(Stack *self, StackVersion version, Subtree subtree, bool pending, TSStateId state, + const TSLanguage *l) { + StackHead *head = array_get(&self->heads, version); + StackNode *new_node = stack_node_new(head->node, subtree, pending, state, &self->node_pool); + if (!subtree.ptr) + head->node_count_at_last_error = new_node->node_count; + else { + const char *s = ts_language_symbol_name(l, ts_subtree_symbol(subtree)); + printf("sym=%s\n", s); + if (strcmp(s, "ERROR") == 0) { + (void)s; + } + } + head->node = new_node; } forceinline StackAction pop_count_callback(void *payload, const StackIterator *iterator) { - unsigned *goal_subtree_count = payload; - if (iterator->subtree_count == *goal_subtree_count) { - return StackActionPop | StackActionStop; - } else { - return StackActionNone; - } + unsigned *goal_subtree_count = payload; + if (iterator->subtree_count == *goal_subtree_count) { + return StackActionPop | StackActionStop; + } else { + return StackActionNone; + } } StackSliceArray ts_stack_pop_count(Stack *self, StackVersion version, uint32_t count) { - return stack__iter(self, version, pop_count_callback, &count, (int)count); + return stack__iter(self, version, pop_count_callback, &count, (int)count, NULL); } - forceinline StackAction pop_pending_callback(void *payload, const StackIterator *iterator) { - (void)payload; - if (iterator->subtree_count >= 1) { - if (iterator->is_pending) { - return StackActionPop | StackActionStop; + (void)payload; + if (iterator->subtree_count >= 1) { + if (iterator->is_pending) { + return StackActionPop | StackActionStop; + } else { + return StackActionStop; + } } else { - return StackActionStop; + return StackActionNone; } - } else { - return StackActionNone; - } } StackSliceArray ts_stack_pop_pending(Stack *self, StackVersion version) { - StackSliceArray pop = stack__iter(self, version, pop_pending_callback, NULL, 0); - if (pop.size > 0) { - ts_stack_renumber_version(self, array_get(&pop, 0)->version, version); - array_get(&pop, 0)->version = version; - } - return pop; + StackSliceArray pop = stack__iter(self, version, pop_pending_callback, NULL, 0, NULL); + if (pop.size > 0) { + ts_stack_renumber_version(self, pop.contents[0].version, version); + pop.contents[0].version = version; + } + return pop; } forceinline StackAction pop_error_callback(void *payload, const StackIterator *iterator) { - if (iterator->subtrees.size > 0) { - bool *found_error = payload; - if (!*found_error && ts_subtree_is_error(*array_get(&iterator->subtrees, 0))) { - *found_error = true; - return StackActionPop | StackActionStop; + if (iterator->subtrees.size > 0) { + bool *found_error = payload; + if (!*found_error && ts_subtree_is_error(iterator->subtrees.contents[0])) { + *found_error = true; + return StackActionPop | StackActionStop; + } else { + return StackActionStop; + } } else { - return StackActionStop; + return StackActionNone; } - } else { - return StackActionNone; - } } SubtreeArray ts_stack_pop_error(Stack *self, StackVersion version) { - StackNode *node = array_get(&self->heads, version)->node; - for (unsigned i = 0; i < node->link_count; i++) { - if (node->links[i].subtree.ptr && ts_subtree_is_error(node->links[i].subtree)) { - bool found_error = false; - StackSliceArray pop = stack__iter(self, version, pop_error_callback, &found_error, 1); - if (pop.size > 0) { - ts_assert(pop.size == 1); - ts_stack_renumber_version(self, array_get(&pop, 0)->version, version); - return array_get(&pop, 0)->subtrees; - } - break; + StackNode *node = array_get(&self->heads, version)->node; + for (unsigned i = 0; i < node->link_count; i++) { + if (node->links[i].subtree.ptr && ts_subtree_is_error(node->links[i].subtree)) { + bool found_error = false; + StackSliceArray pop = stack__iter(self, version, pop_error_callback, &found_error, 1, NULL); + if (pop.size > 0) { + assert(pop.size == 1); + ts_stack_renumber_version(self, pop.contents[0].version, version); + return pop.contents[0].subtrees; + } + break; + } } - } - return (SubtreeArray) {.size = 0}; + return (SubtreeArray){.size = 0}; } forceinline StackAction pop_all_callback(void *payload, const StackIterator *iterator) { - (void)payload; - return iterator->node->link_count == 0 ? StackActionPop : StackActionNone; + (void)payload; + return iterator->node->link_count == 0 ? StackActionPop : StackActionNone; } -StackSliceArray ts_stack_pop_all(Stack *self, StackVersion version) { - return stack__iter(self, version, pop_all_callback, NULL, 0); +StackSliceArray ts_stack_pop_all(Stack *self, StackVersion version, FILE *dot_graph_file) { + return stack__iter(self, version, pop_all_callback, NULL, 0, dot_graph_file); } typedef struct { - StackSummary *summary; - unsigned max_depth; + StackSummary *summary; + unsigned max_depth; } SummarizeStackSession; forceinline StackAction summarize_stack_callback(void *payload, const StackIterator *iterator) { - SummarizeStackSession *session = payload; - TSStateId state = iterator->node->state; - unsigned depth = iterator->subtree_count; - if (depth > session->max_depth) return StackActionStop; - for (unsigned i = session->summary->size - 1; i + 1 > 0; i--) { - StackSummaryEntry entry = *array_get(session->summary, i); - if (entry.depth < depth) break; - if (entry.depth == depth && entry.state == state) return StackActionNone; - } - array_push(session->summary, ((StackSummaryEntry) { - .position = iterator->node->position, - .depth = depth, - .state = state, - })); - return StackActionNone; + SummarizeStackSession *session = payload; + TSStateId state = iterator->node->state; + unsigned depth = iterator->subtree_count; + if (depth > session->max_depth) + return StackActionStop; + for (unsigned i = session->summary->size - 1; i + 1 > 0; i--) { + StackSummaryEntry entry = session->summary->contents[i]; + if (entry.depth < depth) + break; + if (entry.depth == depth && entry.state == state) + return StackActionNone; + } + array_push(session->summary, ((StackSummaryEntry){ + .position = iterator->node->position, + .depth = depth, + .state = state, + })); + return StackActionNone; } void ts_stack_record_summary(Stack *self, StackVersion version, unsigned max_depth) { - SummarizeStackSession session = { - .summary = ts_malloc(sizeof(StackSummary)), - .max_depth = max_depth - }; - array_init(session.summary); - stack__iter(self, version, summarize_stack_callback, &session, -1); - StackHead *head = array_get(&self->heads, version); - if (head->summary) { - array_delete(head->summary); - ts_free(head->summary); - } - head->summary = session.summary; + SummarizeStackSession session = {.summary = ts_malloc(sizeof(StackSummary)), .max_depth = max_depth}; + array_init(session.summary); + stack__iter(self, version, summarize_stack_callback, &session, -1, NULL); + StackHead *head = &self->heads.contents[version]; + if (head->summary) { + array_delete(head->summary); + ts_free(head->summary); + } + head->summary = session.summary; } StackSummary *ts_stack_get_summary(Stack *self, StackVersion version) { - return array_get(&self->heads, version)->summary; + return array_get(&self->heads, version)->summary; } int ts_stack_dynamic_precedence(Stack *self, StackVersion version) { - return array_get(&self->heads, version)->node->dynamic_precedence; + return array_get(&self->heads, version)->node->dynamic_precedence; } bool ts_stack_has_advanced_since_error(const Stack *self, StackVersion version) { - const StackHead *head = array_get(&self->heads, version); - const StackNode *node = head->node; - if (node->error_cost == 0) return true; - while (node) { - if (node->link_count > 0) { - Subtree subtree = node->links[0].subtree; - if (subtree.ptr) { - if (ts_subtree_total_bytes(subtree) > 0) { - return true; - } else if ( - node->node_count > head->node_count_at_last_error && - ts_subtree_error_cost(subtree) == 0 - ) { - node = node->links[0].node; - continue; + const StackHead *head = array_get(&self->heads, version); + const StackNode *node = head->node; + if (node->error_cost == 0) + return true; + while (node) { + if (node->link_count > 0) { + Subtree subtree = node->links[0].subtree; + if (subtree.ptr) { + if (ts_subtree_total_bytes(subtree) > 0) { + return true; + } else if (node->node_count > head->node_count_at_last_error && ts_subtree_error_cost(subtree) == 0) { + node = node->links[0].node; + continue; + } + } } - } + break; } - break; - } - return false; + return false; } void ts_stack_remove_version(Stack *self, StackVersion version) { - stack_head_delete(array_get(&self->heads, version), &self->node_pool, self->subtree_pool); - array_erase(&self->heads, version); + stack_head_delete(array_get(&self->heads, version), &self->node_pool, self->subtree_pool); + array_erase(&self->heads, version); } void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2) { - if (v1 == v2) return; - ts_assert(v2 < v1); - ts_assert((uint32_t)v1 < self->heads.size); - StackHead *source_head = array_get(&self->heads, v1); - StackHead *target_head = array_get(&self->heads, v2); - if (target_head->summary && !source_head->summary) { - source_head->summary = target_head->summary; - target_head->summary = NULL; - } - stack_head_delete(target_head, &self->node_pool, self->subtree_pool); - *target_head = *source_head; - array_erase(&self->heads, v1); + if (v1 == v2) + return; + assert(v2 < v1); + assert((uint32_t)v1 < self->heads.size); + StackHead *source_head = &self->heads.contents[v1]; + StackHead *target_head = &self->heads.contents[v2]; + if (target_head->summary && !source_head->summary) { + source_head->summary = target_head->summary; + target_head->summary = NULL; + } + stack_head_delete(target_head, &self->node_pool, self->subtree_pool); + *target_head = *source_head; + array_erase(&self->heads, v1); } void ts_stack_swap_versions(Stack *self, StackVersion v1, StackVersion v2) { - StackHead temporary_head = *array_get(&self->heads, v1); - *array_get(&self->heads, v1) = *array_get(&self->heads, v2); - *array_get(&self->heads, v2) = temporary_head; + StackHead temporary_head = self->heads.contents[v1]; + self->heads.contents[v1] = self->heads.contents[v2]; + self->heads.contents[v2] = temporary_head; } StackVersion ts_stack_copy_version(Stack *self, StackVersion version) { - ts_assert(version < self->heads.size); - StackHead version_head = *array_get(&self->heads, version); - array_push(&self->heads, version_head); - StackHead *head = array_back(&self->heads); - stack_node_retain(head->node); - if (head->last_external_token.ptr) ts_subtree_retain(head->last_external_token); - head->summary = NULL; - return self->heads.size - 1; + assert(version < self->heads.size); + array_push(&self->heads, self->heads.contents[version]); + StackHead *head = array_back(&self->heads); + stack_node_retain(head->node); + if (head->last_external_token.ptr) + ts_subtree_retain(head->last_external_token); + head->summary = NULL; + return self->heads.size - 1; } bool ts_stack_merge(Stack *self, StackVersion version1, StackVersion version2) { - if (!ts_stack_can_merge(self, version1, version2)) return false; - StackHead *head1 = array_get(&self->heads, version1); - StackHead *head2 = array_get(&self->heads, version2); - for (uint32_t i = 0; i < head2->node->link_count; i++) { - stack_node_add_link(head1->node, head2->node->links[i], self->subtree_pool); - } - if (head1->node->state == ERROR_STATE) { - head1->node_count_at_last_error = head1->node->node_count; - } - ts_stack_remove_version(self, version2); - return true; + if (!ts_stack_can_merge(self, version1, version2)) + return false; + StackHead *head1 = &self->heads.contents[version1]; + StackHead *head2 = &self->heads.contents[version2]; + for (uint32_t i = 0; i < head2->node->link_count; i++) { + stack_node_add_link(head1->node, head2->node->links[i], self->subtree_pool); + } + if (head1->node->state == ERROR_STATE) { + head1->node_count_at_last_error = head1->node->node_count; + } + ts_stack_remove_version(self, version2); + return true; } bool ts_stack_can_merge(Stack *self, StackVersion version1, StackVersion version2) { - StackHead *head1 = array_get(&self->heads, version1); - StackHead *head2 = array_get(&self->heads, version2); - return - head1->status == StackStatusActive && - head2->status == StackStatusActive && - head1->node->state == head2->node->state && - head1->node->position.bytes == head2->node->position.bytes && - head1->node->error_cost == head2->node->error_cost && - ts_subtree_external_scanner_state_eq(head1->last_external_token, head2->last_external_token); + StackHead *head1 = &self->heads.contents[version1]; + StackHead *head2 = &self->heads.contents[version2]; + return head1->status == StackStatusActive && head2->status == StackStatusActive && + head1->node->state == head2->node->state && head1->node->position.bytes == head2->node->position.bytes && + head1->node->error_cost == head2->node->error_cost && + ts_subtree_external_scanner_state_eq(head1->last_external_token, head2->last_external_token); } -void ts_stack_halt(Stack *self, StackVersion version) { - array_get(&self->heads, version)->status = StackStatusHalted; -} +void ts_stack_halt(Stack *self, StackVersion version) { array_get(&self->heads, version)->status = StackStatusHalted; } void ts_stack_pause(Stack *self, StackVersion version, Subtree lookahead) { - StackHead *head = array_get(&self->heads, version); - head->status = StackStatusPaused; - head->lookahead_when_paused = lookahead; - head->node_count_at_last_error = head->node->node_count; + StackHead *head = array_get(&self->heads, version); + head->status = StackStatusPaused; + head->lookahead_when_paused = lookahead; + head->node_count_at_last_error = head->node->node_count; } bool ts_stack_is_active(const Stack *self, StackVersion version) { - return array_get(&self->heads, version)->status == StackStatusActive; + return array_get(&self->heads, version)->status == StackStatusActive; } bool ts_stack_is_halted(const Stack *self, StackVersion version) { - return array_get(&self->heads, version)->status == StackStatusHalted; + return array_get(&self->heads, version)->status == StackStatusHalted; } bool ts_stack_is_paused(const Stack *self, StackVersion version) { - return array_get(&self->heads, version)->status == StackStatusPaused; + return array_get(&self->heads, version)->status == StackStatusPaused; } Subtree ts_stack_resume(Stack *self, StackVersion version) { - StackHead *head = array_get(&self->heads, version); - ts_assert(head->status == StackStatusPaused); - Subtree result = head->lookahead_when_paused; - head->status = StackStatusActive; - head->lookahead_when_paused = NULL_SUBTREE; - return result; + StackHead *head = array_get(&self->heads, version); + assert(head->status == StackStatusPaused); + Subtree result = head->lookahead_when_paused; + head->status = StackStatusActive; + head->lookahead_when_paused = NULL_SUBTREE; + return result; } void ts_stack_clear(Stack *self) { - stack_node_retain(self->base_node); - for (uint32_t i = 0; i < self->heads.size; i++) { - stack_head_delete(array_get(&self->heads, i), &self->node_pool, self->subtree_pool); - } - array_clear(&self->heads); - array_push(&self->heads, ((StackHead) { - .node = self->base_node, - .status = StackStatusActive, - .last_external_token = NULL_SUBTREE, - .lookahead_when_paused = NULL_SUBTREE, - })); + stack_node_retain(self->base_node); + for (uint32_t i = 0; i < self->heads.size; i++) { + stack_head_delete(&self->heads.contents[i], &self->node_pool, self->subtree_pool); + } + array_clear(&self->heads); + array_push(&self->heads, ((StackHead){ + .node = self->base_node, + .status = StackStatusActive, + .last_external_token = NULL_SUBTREE, + .lookahead_when_paused = NULL_SUBTREE, + })); } bool ts_stack_print_dot_graph(Stack *self, const TSLanguage *language, FILE *f) { - array_reserve(&self->iterators, 32); - if (!f) f = stderr; + array_reserve(&self->iterators, 32); + if (!f) + f = stderr; - fprintf(f, "digraph stack {\n"); - fprintf(f, "rankdir=\"RL\";\n"); - fprintf(f, "edge [arrowhead=none]\n"); + fprintf(f, "digraph stack {\n"); + fprintf(f, "rankdir=\"RL\";\n"); + fprintf(f, "edge [arrowhead=none]\n"); - Array(StackNode *) visited_nodes = array_new(); + Array(StackNode *) visited_nodes = array_new(); - array_clear(&self->iterators); - for (uint32_t i = 0; i < self->heads.size; i++) { - StackHead *head = array_get(&self->heads, i); - if (head->status == StackStatusHalted) continue; + array_clear(&self->iterators); + for (uint32_t i = 0; i < self->heads.size; i++) { + StackHead *head = &self->heads.contents[i]; + if (head->status == StackStatusHalted) + continue; - fprintf(f, "node_head_%u [shape=none, label=\"\"]\n", i); - fprintf(f, "node_head_%u -> node_%p [", i, (void *)head->node); + fprintf(f, "node_head_%u [shape=none, label=\"\"]\n", i); + fprintf(f, "node_head_%u -> node_%p [", i, (void *)head->node); - if (head->status == StackStatusPaused) { - fprintf(f, "color=red "); - } - fprintf(f, - "label=%u, fontcolor=blue, weight=10000, labeltooltip=\"node_count: %u\nerror_cost: %u", - i, - ts_stack_node_count_since_error(self, i), - ts_stack_error_cost(self, i) - ); - - if (head->summary) { - fprintf(f, "\nsummary:"); - for (uint32_t j = 0; j < head->summary->size; j++) fprintf(f, " %u", array_get(head->summary, j)->state); - } - - if (head->last_external_token.ptr) { - const ExternalScannerState *state = &head->last_external_token.ptr->external_scanner_state; - const char *data = ts_external_scanner_state_data(state); - fprintf(f, "\nexternal_scanner_state:"); - for (uint32_t j = 0; j < state->length; j++) fprintf(f, " %2X", data[j]); - } - - fprintf(f, "\"]\n"); - array_push(&self->iterators, ((StackIterator) { - .node = head->node - })); - } - - bool all_iterators_done = false; - while (!all_iterators_done) { - all_iterators_done = true; - - for (uint32_t i = 0; i < self->iterators.size; i++) { - StackIterator iterator = *array_get(&self->iterators, i); - StackNode *node = iterator.node; - - for (uint32_t j = 0; j < visited_nodes.size; j++) { - if (*array_get(&visited_nodes, j) == node) { - node = NULL; - break; + if (head->status == StackStatusPaused) { + fprintf(f, "color=red "); } - } + fprintf(f, "label=%u, fontcolor=blue, weight=10000, labeltooltip=\"node_count: %u\nerror_cost: %u", i, + ts_stack_node_count_since_error(self, i), ts_stack_error_cost(self, i)); - if (!node) continue; - all_iterators_done = false; - - fprintf(f, "node_%p [", (void *)node); - if (node->state == ERROR_STATE) { - fprintf(f, "label=\"?\""); - } else if ( - node->link_count == 1 && - node->links[0].subtree.ptr && - ts_subtree_extra(node->links[0].subtree) - ) { - fprintf(f, "shape=point margin=0 label=\"\""); - } else { - fprintf(f, "label=\"%d\"", node->state); - } - - fprintf( - f, - " tooltip=\"position: %u,%u\nnode_count:%u\nerror_cost: %u\ndynamic_precedence: %d\"];\n", - node->position.extent.row + 1, - node->position.extent.column, - node->node_count, - node->error_cost, - node->dynamic_precedence - ); - - for (int j = 0; j < node->link_count; j++) { - StackLink link = node->links[j]; - fprintf(f, "node_%p -> node_%p [", (void *)node, (void *)link.node); - if (link.is_pending) fprintf(f, "style=dashed "); - if (link.subtree.ptr && ts_subtree_extra(link.subtree)) fprintf(f, "fontcolor=gray "); - - if (!link.subtree.ptr) { - fprintf(f, "color=red"); - } else { - fprintf(f, "label=\""); - bool quoted = ts_subtree_visible(link.subtree) && !ts_subtree_named(link.subtree); - if (quoted) fprintf(f, "'"); - ts_language_write_symbol_as_dot_string(language, f, ts_subtree_symbol(link.subtree)); - if (quoted) fprintf(f, "'"); - fprintf(f, "\""); - fprintf( - f, - "labeltooltip=\"error_cost: %u\ndynamic_precedence: %" PRId32 "\"", - ts_subtree_error_cost(link.subtree), - ts_subtree_dynamic_precedence(link.subtree) - ); + if (head->summary) { + fprintf(f, "\nsummary:"); + for (uint32_t j = 0; j < head->summary->size; j++) + fprintf(f, " %u", head->summary->contents[j].state); } - fprintf(f, "];\n"); - - StackIterator *next_iterator; - if (j == 0) { - next_iterator = array_get(&self->iterators, i); - } else { - array_push(&self->iterators, iterator); - next_iterator = array_back(&self->iterators); + if (head->last_external_token.ptr) { + const ExternalScannerState *state = &head->last_external_token.ptr->external_scanner_state; + const char *data = ts_external_scanner_state_data(state); + fprintf(f, "\nexternal_scanner_state:"); + for (uint32_t j = 0; j < state->length; j++) + fprintf(f, " %2X", data[j]); } - next_iterator->node = link.node; - } - array_push(&visited_nodes, node); + fprintf(f, "\"]\n"); + array_push(&self->iterators, ((StackIterator){.node = head->node})); } - } - fprintf(f, "}\n"); + bool all_iterators_done = false; + while (!all_iterators_done) { + all_iterators_done = true; - array_delete(&visited_nodes); - return true; + for (uint32_t i = 0; i < self->iterators.size; i++) { + StackIterator iterator = self->iterators.contents[i]; + StackNode *node = iterator.node; + + for (uint32_t j = 0; j < visited_nodes.size; j++) { + if (visited_nodes.contents[j] == node) { + node = NULL; + break; + } + } + + if (!node) + continue; + all_iterators_done = false; + + fprintf(f, "node_%p [", (void *)node); + if (node->state == ERROR_STATE) { + fprintf(f, "label=\"?\""); + } else if (node->link_count == 1 && node->links[0].subtree.ptr && + ts_subtree_extra(node->links[0].subtree)) { + fprintf(f, "shape=point margin=0 label=\"\""); + } else { + fprintf(f, "label=\"%d\"", node->state); + } + + fprintf(f, " tooltip=\"position: %u,%u\nnode_count:%u\nerror_cost: %u\ndynamic_precedence: %d\"];\n", + node->position.extent.row + 1, node->position.extent.column, node->node_count, node->error_cost, + node->dynamic_precedence); + + for (int j = 0; j < node->link_count; j++) { + StackLink link = node->links[j]; + fprintf(f, "node_%p -> node_%p [", (void *)node, (void *)link.node); + if (link.is_pending) + fprintf(f, "style=dashed "); + if (link.subtree.ptr && ts_subtree_extra(link.subtree)) + fprintf(f, "fontcolor=gray "); + + if (!link.subtree.ptr) { + fprintf(f, "color=red"); + } else { + fprintf(f, "label=\""); + bool quoted = ts_subtree_visible(link.subtree) && !ts_subtree_named(link.subtree); + if (quoted) + fprintf(f, "'"); + ts_language_write_symbol_as_dot_string(language, f, ts_subtree_symbol(link.subtree)); + printf("[1]ts_subtree_error_cost(link.subtree)=%u\n", ts_subtree_error_cost(link.subtree)); + if (quoted) + fprintf(f, "'"); + fprintf(f, "\""); + fprintf(f, "labeltooltip=\"ptr: %p\nerror_cost: %u\ndynamic_precedence: %" PRId32, + (void *)link.subtree.ptr, ts_subtree_error_cost(link.subtree), + ts_subtree_dynamic_precedence(link.subtree)); + if (ts_subtree_is_error(link.subtree) && ts_subtree_child_count(link.subtree) == 0 && + link.subtree.ptr->lookahead_char != 0) { + fprintf(f, "\ncharacter: '%c'", link.subtree.ptr->lookahead_char); + } else { + fprintf(f, "\nno character"); + } + if (link.subtree.data.is_inline) { + fprintf(f, "\nis_inline:%d", link.subtree.data.is_inline); + } else { + fprintf(f, "\nog_ptr:%p", (void *)link.subtree.ptr->og_ptr); + } + fprintf(f, "\""); + if (ts_subtree_error_cost(link.subtree) == 500 && + ts_language_symbol_name(language, ts_subtree_symbol(link.subtree)) != NULL) { + printf("ptr to target stack tree node: %p\n", (void *)link.subtree.ptr); + } else if (ts_subtree_error_cost(link.subtree) == 0 && + ts_language_symbol_name(language, ts_subtree_symbol(link.subtree)) != NULL) { + printf("ptr to bad target stack tree node: %p\n", (void *)link.subtree.ptr); + } + } + + fprintf(f, "];\n"); + + StackIterator *next_iterator; + if (j == 0) { + next_iterator = &self->iterators.contents[i]; + } else { + array_push(&self->iterators, iterator); + next_iterator = array_back(&self->iterators); + } + next_iterator->node = link.node; + } + + array_push(&visited_nodes, node); + } + } + + fprintf(f, "}\n"); + + array_delete(&visited_nodes); + return true; } #undef forceinline diff --git a/lib/src/stack.h b/lib/src/stack.h index 2619f1e8..c70f3c6e 100644 --- a/lib/src/stack.h +++ b/lib/src/stack.h @@ -7,6 +7,8 @@ extern "C" { #include "./array.h" #include "./subtree.h" +#include "./lexer.h" +#include "./error_costs.h" #include typedef struct Stack Stack; @@ -28,26 +30,27 @@ typedef struct { typedef Array(StackSummaryEntry) StackSummary; // Create a stack. -Stack *ts_stack_new(SubtreePool *subtree_pool); +Stack *ts_stack_new(SubtreePool *, const TSLanguage*); // Release the memory reserved for a given stack. -void ts_stack_delete(Stack *self); +void ts_stack_delete(Stack *); // Get the stack's current number of versions. -uint32_t ts_stack_version_count(const Stack *self); - -// Get the stack's current number of halted versions. -uint32_t ts_stack_halted_version_count(Stack *self); +uint32_t ts_stack_version_count(const Stack *); // Get the state at the top of the given version of the stack. If the stack is // empty, this returns the initial state, 0. -TSStateId ts_stack_state(const Stack *self, StackVersion version); +TSStateId ts_stack_state(const Stack *, StackVersion); // Get the last external token associated with a given version of the stack. -Subtree ts_stack_last_external_token(const Stack *self, StackVersion version); +Subtree ts_stack_last_external_token(const Stack *, StackVersion); // Set the last external token associated with a given version of the stack. -void ts_stack_set_last_external_token(Stack *self, StackVersion version, Subtree token); +void ts_stack_set_last_external_token(Stack *, StackVersion, Subtree ); + +void ts_stack_set_language(Stack *self, const TSLanguage *language); + +void ts_stack_set_lexer(Stack *self, Lexer *lexer); // Get the position of the given version of the stack within the document. Length ts_stack_position(const Stack *, StackVersion); @@ -57,74 +60,76 @@ Length ts_stack_position(const Stack *, StackVersion); // This transfers ownership of the tree to the Stack. Callers that // need to retain ownership of the tree for their own purposes should // first retain the tree. -void ts_stack_push(Stack *self, StackVersion version, Subtree subtree, bool pending, TSStateId state); +void ts_stack_push(Stack *, StackVersion, Subtree , bool, TSStateId, const TSLanguage*); // Pop the given number of entries from the given version of the stack. This // operation can increase the number of stack versions by revealing multiple // versions which had previously been merged. It returns an array that // specifies the index of each revealed version and the trees that were // removed from that version. -StackSliceArray ts_stack_pop_count(Stack *self, StackVersion version, uint32_t count); +StackSliceArray ts_stack_pop_count(Stack *, StackVersion, uint32_t count); // Remove an error at the top of the given version of the stack. -SubtreeArray ts_stack_pop_error(Stack *self, StackVersion version); +SubtreeArray ts_stack_pop_error(Stack *, StackVersion); // Remove any pending trees from the top of the given version of the stack. -StackSliceArray ts_stack_pop_pending(Stack *self, StackVersion version); +StackSliceArray ts_stack_pop_pending(Stack *, StackVersion); -// Remove all trees from the given version of the stack. -StackSliceArray ts_stack_pop_all(Stack *self, StackVersion version); +// Remove any all trees from the given version of the stack. +StackSliceArray ts_stack_pop_all(Stack *, StackVersion, FILE*); // Get the maximum number of tree nodes reachable from this version of the stack // since the last error was detected. -unsigned ts_stack_node_count_since_error(const Stack *self, StackVersion version); +unsigned ts_stack_node_count_since_error(const Stack *, StackVersion); -int ts_stack_dynamic_precedence(Stack *self, StackVersion version); +int ts_stack_dynamic_precedence(Stack *, StackVersion); -bool ts_stack_has_advanced_since_error(const Stack *self, StackVersion version); +bool ts_stack_has_advanced_since_error(const Stack *, StackVersion); // Compute a summary of all the parse states near the top of the given // version of the stack and store the summary for later retrieval. -void ts_stack_record_summary(Stack *self, StackVersion version, unsigned max_depth); +void ts_stack_record_summary(Stack *, StackVersion, unsigned max_depth); // Retrieve a summary of all the parse states near the top of the // given version of the stack. -StackSummary *ts_stack_get_summary(Stack *self, StackVersion version); +StackSummary *ts_stack_get_summary(Stack *, StackVersion); // Get the total cost of all errors on the given version of the stack. -unsigned ts_stack_error_cost(const Stack *self, StackVersion version); +unsigned ts_stack_error_cost(const Stack *, StackVersion version); // Merge the given two stack versions if possible, returning true // if they were successfully merged and false otherwise. -bool ts_stack_merge(Stack *self, StackVersion version1, StackVersion version2); +bool ts_stack_merge(Stack *, StackVersion, StackVersion); // Determine whether the given two stack versions can be merged. -bool ts_stack_can_merge(Stack *self, StackVersion version1, StackVersion version2); +bool ts_stack_can_merge(Stack *, StackVersion, StackVersion); -Subtree ts_stack_resume(Stack *self, StackVersion version); +Subtree ts_stack_resume(Stack *, StackVersion); -void ts_stack_pause(Stack *self, StackVersion version, Subtree lookahead); +void ts_stack_pause(Stack *, StackVersion, Subtree); -void ts_stack_halt(Stack *self, StackVersion version); +void ts_stack_halt(Stack *, StackVersion); -bool ts_stack_is_active(const Stack *self, StackVersion version); +bool ts_stack_is_active(const Stack *, StackVersion); -bool ts_stack_is_paused(const Stack *self, StackVersion version); +bool ts_stack_is_paused(const Stack *, StackVersion); -bool ts_stack_is_halted(const Stack *self, StackVersion version); +bool ts_stack_is_halted(const Stack *, StackVersion); -void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersion v2); +void ts_stack_renumber_version(Stack *, StackVersion, StackVersion); -void ts_stack_swap_versions(Stack *, StackVersion v1, StackVersion v2); +void ts_stack_swap_versions(Stack *, StackVersion, StackVersion); -StackVersion ts_stack_copy_version(Stack *self, StackVersion version); +StackVersion ts_stack_copy_version(Stack *, StackVersion); // Remove the given version from the stack. -void ts_stack_remove_version(Stack *self, StackVersion version); +void ts_stack_remove_version(Stack *, StackVersion); -void ts_stack_clear(Stack *self); +void ts_stack_clear(Stack *); -bool ts_stack_print_dot_graph(Stack *self, const TSLanguage *language, FILE *f); +bool ts_stack_print_dot_graph(Stack *, const TSLanguage *, FILE *); + +typedef void (*StackIterateCallback)(void *, TSStateId, uint32_t); #ifdef __cplusplus } diff --git a/lib/src/subtree.c b/lib/src/subtree.c index 97d55c86..be78af15 100644 --- a/lib/src/subtree.c +++ b/lib/src/subtree.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -10,7 +11,6 @@ #include "./length.h" #include "./language.h" #include "./error_costs.h" -#include "./ts_assert.h" #include typedef struct { @@ -22,6 +22,7 @@ typedef struct { #define TS_MAX_INLINE_TREE_LENGTH UINT8_MAX #define TS_MAX_TREE_POOL_SIZE 32 + // ExternalScannerState void ts_external_scanner_state_init(ExternalScannerState *self, const char *data, unsigned length) { @@ -73,14 +74,14 @@ void ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest) { dest->contents = ts_calloc(self.capacity, sizeof(Subtree)); memcpy(dest->contents, self.contents, self.size * sizeof(Subtree)); for (uint32_t i = 0; i < self.size; i++) { - ts_subtree_retain(*array_get(dest, i)); + ts_subtree_retain(dest->contents[i]); } } } void ts_subtree_array_clear(SubtreePool *pool, SubtreeArray *self) { for (uint32_t i = 0; i < self->size; i++) { - ts_subtree_release(pool, *array_get(self, i)); + ts_subtree_release(pool, self->contents[i]); } array_clear(self); } @@ -96,7 +97,7 @@ void ts_subtree_array_remove_trailing_extras( ) { array_clear(destination); while (self->size > 0) { - Subtree last = *array_get(self, self->size - 1); + Subtree last = self->contents[self->size - 1]; if (ts_subtree_extra(last)) { self->size--; array_push(destination, last); @@ -110,9 +111,9 @@ void ts_subtree_array_remove_trailing_extras( void ts_subtree_array_reverse(SubtreeArray *self) { for (uint32_t i = 0, limit = self->size / 2; i < limit; i++) { size_t reverse_index = self->size - 1 - i; - Subtree swap = *array_get(self, i); - *array_get(self, i) = *array_get(self, reverse_index); - *array_get(self, reverse_index) = swap; + Subtree swap = self->contents[i]; + self->contents[i] = self->contents[reverse_index]; + self->contents[reverse_index] = swap; } } @@ -127,7 +128,7 @@ SubtreePool ts_subtree_pool_new(uint32_t capacity) { void ts_subtree_pool_delete(SubtreePool *self) { if (self->free_trees.contents) { for (unsigned i = 0; i < self->free_trees.size; i++) { - ts_free(array_get(&self->free_trees, i)->ptr); + ts_free(self->free_trees.contents[i].ptr); } array_delete(&self->free_trees); } @@ -157,7 +158,6 @@ static inline bool ts_subtree_can_inline(Length padding, Length size, uint32_t l padding.bytes < TS_MAX_INLINE_TREE_LENGTH && padding.extent.row < 16 && padding.extent.column < TS_MAX_INLINE_TREE_LENGTH && - size.bytes < TS_MAX_INLINE_TREE_LENGTH && size.extent.row == 0 && size.extent.column < TS_MAX_INLINE_TREE_LENGTH && lookahead_bytes < 16; @@ -197,8 +197,10 @@ Subtree ts_subtree_new_leaf( }}; } else { SubtreeHeapData *data = ts_subtree_pool_allocate(pool); + printf("[1] ALLOCATED %p\n", (void *)data); *data = (SubtreeHeapData) { .ref_count = 1, + .og_ptr = (size_t)data, .padding = padding, .size = size, .lookahead_bytes = lookahead_bytes, @@ -230,7 +232,7 @@ void ts_subtree_set_symbol( ) { TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol); if (self->data.is_inline) { - ts_assert(symbol < UINT8_MAX); + assert(symbol < UINT8_MAX); self->data.symbol = symbol; self->data.named = metadata.named; self->data.visible = metadata.visible; @@ -273,6 +275,7 @@ MutableSubtree ts_subtree_clone(Subtree self) { ); } result->ref_count = 1; + printf("NEW SUBTREE: %p\n", result); return (MutableSubtree) {.ptr = result}; } @@ -289,7 +292,7 @@ MutableSubtree ts_subtree_make_mut(SubtreePool *pool, Subtree self) { return result; } -void ts_subtree_compress( +static void ts_subtree__compress( MutableSubtree self, unsigned count, const TSLanguage *language, @@ -335,16 +338,51 @@ void ts_subtree_compress( } } +void ts_subtree_balance(Subtree self, SubtreePool *pool, const TSLanguage *language) { + array_clear(&pool->tree_stack); + + if (ts_subtree_child_count(self) > 0 && self.ptr->ref_count == 1) { + array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(self)); + } + + while (pool->tree_stack.size > 0) { + MutableSubtree tree = array_pop(&pool->tree_stack); + + if (tree.ptr->repeat_depth > 0) { + Subtree child1 = ts_subtree_children(tree)[0]; + Subtree child2 = ts_subtree_children(tree)[tree.ptr->child_count - 1]; + long repeat_delta = (long)ts_subtree_repeat_depth(child1) - (long)ts_subtree_repeat_depth(child2); + if (repeat_delta > 0) { + unsigned n = (unsigned)repeat_delta; + for (unsigned i = n / 2; i > 0; i /= 2) { + ts_subtree__compress(tree, i, language, &pool->tree_stack); + n -= i; + } + } + } + + for (uint32_t i = 0; i < tree.ptr->child_count; i++) { + Subtree child = ts_subtree_children(tree)[i]; + if (ts_subtree_child_count(child) > 0 && child.ptr->ref_count == 1) { + array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(child)); + } + } + } +} + // Assign all of the node's properties that depend on its children. void ts_subtree_summarize_children( MutableSubtree self, const TSLanguage *language ) { - ts_assert(!self.data.is_inline); + assert(!self.data.is_inline); self.ptr->named_child_count = 0; self.ptr->visible_child_count = 0; - self.ptr->error_cost = 0; + if (!ts_subtree_is_error(ts_subtree_from_mut(self))) { + printf("SET 0: %s\n", ts_language_symbol_name(language, self.ptr->symbol)); + self.ptr->error_cost = 0; + } self.ptr->repeat_depth = 0; self.ptr->visible_descendant_count = 0; self.ptr->has_external_tokens = false; @@ -391,28 +429,34 @@ void ts_subtree_summarize_children( } uint32_t grandchild_count = ts_subtree_child_count(child); + printf("HI: %s\n", ts_language_symbol_name(language, self.ptr->symbol)); if ( self.ptr->symbol == ts_builtin_sym_error || self.ptr->symbol == ts_builtin_sym_error_repeat ) { + printf("THE FIRST BLOCK\n"); if (!ts_subtree_extra(child) && !(ts_subtree_is_error(child) && grandchild_count == 0)) { if (ts_subtree_visible(child)) { self.ptr->error_cost += ERROR_COST_PER_SKIPPED_TREE; } else if (grandchild_count > 0) { self.ptr->error_cost += ERROR_COST_PER_SKIPPED_TREE * child.ptr->visible_child_count; } + } else { + printf("FALSE BLOCK\n"); + } + + if (ts_subtree_is_error(child) && grandchild_count == 0) { + MutableSubtree child_mut = ts_subtree_to_mut_unsafe(child); + child_mut.ptr->error_cost = ERROR_COST_PER_RECOVERY + + ERROR_COST_PER_SKIPPED_CHAR * child.ptr->size.bytes + + ERROR_COST_PER_SKIPPED_LINE * child.ptr->size.extent.row; } } self.ptr->dynamic_precedence += ts_subtree_dynamic_precedence(child); self.ptr->visible_descendant_count += ts_subtree_visible_descendant_count(child); - if ( - !ts_subtree_extra(child) && - ts_subtree_symbol(child) != 0 && - alias_sequence && - alias_sequence[structural_index] != 0 - ) { + if (alias_sequence && alias_sequence[structural_index] != 0 && !ts_subtree_extra(child)) { self.ptr->visible_descendant_count++; self.ptr->visible_child_count++; if (ts_language_symbol_metadata(language, alias_sequence[structural_index]).named) { @@ -439,10 +483,13 @@ void ts_subtree_summarize_children( self.ptr->lookahead_bytes = lookahead_end_byte - self.ptr->size.bytes - self.ptr->padding.bytes; + printf("HI 2: %d\n", self.ptr->symbol); + printf("HI 2: %s\n", ts_language_symbol_name(language, self.ptr->symbol)); if ( self.ptr->symbol == ts_builtin_sym_error || self.ptr->symbol == ts_builtin_sym_error_repeat ) { + printf("HI 3\n"); self.ptr->error_cost += ERROR_COST_PER_RECOVERY + ERROR_COST_PER_SKIPPED_CHAR * self.ptr->size.bytes + @@ -493,9 +540,10 @@ MutableSubtree ts_subtree_new_node( children->capacity = (uint32_t)(new_byte_size / sizeof(Subtree)); } SubtreeHeapData *data = (SubtreeHeapData *)&children->contents[children->size]; - + printf("[0]ALLOCATED %p\n", (void *)data); *data = (SubtreeHeapData) { .ref_count = 1, + .og_ptr = (size_t)data, .symbol = symbol, .child_count = children->size, .visible = metadata.visible, @@ -512,6 +560,11 @@ MutableSubtree ts_subtree_new_node( }} }; MutableSubtree result = {.ptr = data}; + if (symbol == ts_builtin_sym_error_repeat) { + printf("ptr: %p\n", (void *)result.ptr); + } else if (symbol == ts_builtin_sym_error) { + printf("ptr: %p\n", (void *)result.ptr); + } ts_subtree_summarize_children(result, language); return result; } @@ -557,16 +610,16 @@ Subtree ts_subtree_new_missing_leaf( void ts_subtree_retain(Subtree self) { if (self.data.is_inline) return; - ts_assert(self.ptr->ref_count > 0); + assert(self.ptr->ref_count > 0); atomic_inc((volatile uint32_t *)&self.ptr->ref_count); - ts_assert(self.ptr->ref_count != 0); + assert(self.ptr->ref_count != 0); } void ts_subtree_release(SubtreePool *pool, Subtree self) { if (self.data.is_inline) return; array_clear(&pool->tree_stack); - ts_assert(self.ptr->ref_count > 0); + assert(self.ptr->ref_count > 0); if (atomic_dec((volatile uint32_t *)&self.ptr->ref_count) == 0) { array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(self)); } @@ -578,7 +631,7 @@ void ts_subtree_release(SubtreePool *pool, Subtree self) { for (uint32_t i = 0; i < tree.ptr->child_count; i++) { Subtree child = children[i]; if (child.data.is_inline) continue; - ts_assert(child.ptr->ref_count > 0); + assert(child.ptr->ref_count > 0); if (atomic_dec((volatile uint32_t *)&child.ptr->ref_count) == 0) { array_push(&pool->tree_stack, ts_subtree_to_mut_unsafe(child)); } @@ -651,8 +704,7 @@ Subtree ts_subtree_edit(Subtree self, const TSInputEdit *input_edit, SubtreePool Edit edit = entry.edit; bool is_noop = edit.old_end.bytes == edit.start.bytes && edit.new_end.bytes == edit.start.bytes; bool is_pure_insertion = edit.old_end.bytes == edit.start.bytes; - bool parent_depends_on_column = ts_subtree_depends_on_column(*entry.tree); - bool column_shifted = edit.new_end.extent.column != edit.old_end.extent.column; + bool invalidate_first_row = ts_subtree_depends_on_column(*entry.tree); Length size = ts_subtree_size(*entry.tree); Length padding = ts_subtree_padding(*entry.tree); @@ -674,6 +726,12 @@ Subtree ts_subtree_edit(Subtree self, const TSInputEdit *input_edit, SubtreePool padding = edit.new_end; } + // If the edit is a pure insertion right at the start of the subtree, + // shift the subtree over according to the insertion. + else if (edit.start.bytes == padding.bytes && is_pure_insertion) { + padding = edit.new_end; + } + // If the edit is within this subtree, resize the subtree to reflect the edit. else if ( edit.start.bytes < total_size.bytes || @@ -735,17 +793,13 @@ Subtree ts_subtree_edit(Subtree self, const TSInputEdit *input_edit, SubtreePool // Keep editing child nodes until a node is reached that starts after the edit. // Also, if this node's validity depends on its column position, then continue - // invalidating child nodes until reaching a line break. + // invaliditing child nodes until reaching a line break. if (( (child_left.bytes > edit.old_end.bytes) || (child_left.bytes == edit.old_end.bytes && child_size.bytes > 0 && i > 0) ) && ( - !parent_depends_on_column || - child_left.extent.row > padding.extent.row - ) && ( - !ts_subtree_depends_on_column(*child) || - !column_shifted || - child_left.extent.row > edit.old_end.extent.row + !invalidate_first_row || + child_left.extent.row > entry.tree->ptr->padding.extent.row )) { break; } @@ -954,11 +1008,11 @@ void ts_subtree__print_dot_graph(const Subtree *self, uint32_t start_offset, uint32_t end_offset = start_offset + ts_subtree_total_bytes(*self); fprintf(f, "tree_%p [label=\"", (void *)self); ts_language_write_symbol_as_dot_string(language, f, symbol); + printf("[0]ts_subtree_error_cost(link.subtree)=%u\n", ts_subtree_error_cost(*self)); fprintf(f, "\""); if (ts_subtree_child_count(*self) == 0) fprintf(f, ", shape=plaintext"); if (ts_subtree_extra(*self)) fprintf(f, ", fontcolor=gray"); - if (ts_subtree_has_changes(*self)) fprintf(f, ", color=green, penwidth=2"); fprintf(f, ", tooltip=\"" "range: %u - %u\n" @@ -968,7 +1022,8 @@ void ts_subtree__print_dot_graph(const Subtree *self, uint32_t start_offset, "depends-on-column: %u\n" "descendant-count: %u\n" "repeat-depth: %u\n" - "lookahead-bytes: %u", + "lookahead-bytes: %u\n" + "ptr: %p", start_offset, end_offset, ts_subtree_parse_state(*self), ts_subtree_error_cost(*self), @@ -976,11 +1031,23 @@ void ts_subtree__print_dot_graph(const Subtree *self, uint32_t start_offset, ts_subtree_depends_on_column(*self), ts_subtree_visible_descendant_count(*self), ts_subtree_repeat_depth(*self), - ts_subtree_lookahead_bytes(*self) + ts_subtree_lookahead_bytes(*self), + (void*)self->ptr ); + if (self->data.is_inline) { + fprintf(f, "\nis_inline: %d", self->data.is_inline); + } else { + fprintf(f, "\nog_ptr: %p", (void*)self->ptr->og_ptr); + } + if (ts_subtree_is_error(*self) && ts_subtree_child_count(*self) == 0 && self->ptr->lookahead_char != 0) { fprintf(f, "\ncharacter: '%c'", self->ptr->lookahead_char); + printf("ptr %p is error with an error cost of %d\n", (void*)self->ptr, ts_subtree_error_cost(*self)); + printf("branch [1] %d %p\n", ts_subtree_missing(*self), self->ptr); + printf("branch [2] %d\n", self->data.is_inline); + } else { + printf("no call!\n"); } fprintf(f, "\"]\n"); diff --git a/lib/src/subtree.h b/lib/src/subtree.h index ffc5fb7a..97608f98 100644 --- a/lib/src/subtree.h +++ b/lib/src/subtree.h @@ -110,6 +110,7 @@ struct SubtreeInlineData { // the inline representation. typedef struct { volatile uint32_t ref_count; + size_t og_ptr; Length padding; Length size; uint32_t lookahead_bytes; @@ -173,61 +174,44 @@ typedef struct { MutableSubtreeArray tree_stack; } SubtreePool; -void ts_external_scanner_state_init(ExternalScannerState *self, const char *data, unsigned length); -const char *ts_external_scanner_state_data(const ExternalScannerState *self); -bool ts_external_scanner_state_eq(const ExternalScannerState *self, const char *buffer, unsigned length); +void ts_external_scanner_state_init(ExternalScannerState *, const char *, unsigned); +const char *ts_external_scanner_state_data(const ExternalScannerState *); +bool ts_external_scanner_state_eq(const ExternalScannerState *self, const char *, unsigned); void ts_external_scanner_state_delete(ExternalScannerState *self); -void ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest); -void ts_subtree_array_clear(SubtreePool *pool, SubtreeArray *self); -void ts_subtree_array_delete(SubtreePool *pool, SubtreeArray *self); -void ts_subtree_array_remove_trailing_extras(SubtreeArray *self, SubtreeArray *destination); -void ts_subtree_array_reverse(SubtreeArray *self); +void ts_subtree_array_copy(SubtreeArray, SubtreeArray *); +void ts_subtree_array_clear(SubtreePool *, SubtreeArray *); +void ts_subtree_array_delete(SubtreePool *, SubtreeArray *); +void ts_subtree_array_remove_trailing_extras(SubtreeArray *, SubtreeArray *); +void ts_subtree_array_reverse(SubtreeArray *); SubtreePool ts_subtree_pool_new(uint32_t capacity); -void ts_subtree_pool_delete(SubtreePool *self); +void ts_subtree_pool_delete(SubtreePool *); Subtree ts_subtree_new_leaf( - SubtreePool *pool, TSSymbol symbol, Length padding, Length size, - uint32_t lookahead_bytes, TSStateId parse_state, - bool has_external_tokens, bool depends_on_column, - bool is_keyword, const TSLanguage *language + SubtreePool *, TSSymbol, Length, Length, uint32_t, + TSStateId, bool, bool, bool, const TSLanguage * ); Subtree ts_subtree_new_error( - SubtreePool *pool, int32_t lookahead_char, Length padding, Length size, - uint32_t bytes_scanned, TSStateId parse_state, const TSLanguage *language + SubtreePool *, int32_t, Length, Length, uint32_t, TSStateId, const TSLanguage * ); -MutableSubtree ts_subtree_new_node( - TSSymbol symbol, - SubtreeArray *chiildren, - unsigned production_id, - const TSLanguage *language -); -Subtree ts_subtree_new_error_node( - SubtreeArray *children, - bool extra, - const TSLanguage * language -); -Subtree ts_subtree_new_missing_leaf( - SubtreePool *pool, - TSSymbol symbol, - Length padding, - uint32_t lookahead_bytes, - const TSLanguage *language -); -MutableSubtree ts_subtree_make_mut(SubtreePool *pool, Subtree self); -void ts_subtree_retain(Subtree self); -void ts_subtree_release(SubtreePool *pool, Subtree self); -int ts_subtree_compare(Subtree left, Subtree right, SubtreePool *pool); -void ts_subtree_set_symbol(MutableSubtree *self, TSSymbol symbol, const TSLanguage *language); -void ts_subtree_compress(MutableSubtree self, unsigned count, const TSLanguage *language, MutableSubtreeArray *stack); -void ts_subtree_summarize_children(MutableSubtree self, const TSLanguage *language); -Subtree ts_subtree_edit(Subtree self, const TSInputEdit *edit, SubtreePool *pool); -char *ts_subtree_string(Subtree self, TSSymbol alias_symbol, bool alias_is_named, const TSLanguage *language, bool include_all); -void ts_subtree_print_dot_graph(Subtree self, const TSLanguage *language, FILE *f); -Subtree ts_subtree_last_external_token(Subtree tree); +MutableSubtree ts_subtree_new_node(TSSymbol, SubtreeArray *, unsigned, const TSLanguage *); +Subtree ts_subtree_new_error_node(SubtreeArray *, bool, const TSLanguage *); +Subtree ts_subtree_new_missing_leaf(SubtreePool *, TSSymbol, Length, uint32_t, const TSLanguage *); +MutableSubtree ts_subtree_make_mut(SubtreePool *, Subtree); +void ts_subtree_retain(Subtree); +void ts_subtree_release(SubtreePool *, Subtree); +int ts_subtree_compare(Subtree, Subtree, SubtreePool *); +void ts_subtree_set_symbol(MutableSubtree *, TSSymbol, const TSLanguage *); +void ts_subtree_summarize(MutableSubtree, const Subtree *, uint32_t, const TSLanguage *); +void ts_subtree_summarize_children(MutableSubtree, const TSLanguage *); +void ts_subtree_balance(Subtree, SubtreePool *, const TSLanguage *); +Subtree ts_subtree_edit(Subtree, const TSInputEdit *edit, SubtreePool *); +char *ts_subtree_string(Subtree, TSSymbol, bool, const TSLanguage *, bool include_all); +void ts_subtree_print_dot_graph(Subtree, const TSLanguage *, FILE *); +Subtree ts_subtree_last_external_token(Subtree); const ExternalScannerState *ts_subtree_external_scanner_state(Subtree self); -bool ts_subtree_external_scanner_state_eq(Subtree self, Subtree other); +bool ts_subtree_external_scanner_state_eq(Subtree, Subtree); #define SUBTREE_GET(self, name) ((self).data.is_inline ? (self).data.name : (self).ptr->name) diff --git a/lib/src/tree.c b/lib/src/tree.c index 6747fd6d..14936732 100644 --- a/lib/src/tree.c +++ b/lib/src/tree.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 200112L + #include "tree_sitter/api.h" #include "./array.h" #include "./get_changed_ranges.h" @@ -54,7 +56,37 @@ const TSLanguage *ts_tree_language(const TSTree *self) { void ts_tree_edit(TSTree *self, const TSInputEdit *edit) { for (unsigned i = 0; i < self->included_range_count; i++) { - ts_range_edit(&self->included_ranges[i], edit); + TSRange *range = &self->included_ranges[i]; + if (range->end_byte >= edit->old_end_byte) { + if (range->end_byte != UINT32_MAX) { + range->end_byte = edit->new_end_byte + (range->end_byte - edit->old_end_byte); + range->end_point = point_add( + edit->new_end_point, + point_sub(range->end_point, edit->old_end_point) + ); + if (range->end_byte < edit->new_end_byte) { + range->end_byte = UINT32_MAX; + range->end_point = POINT_MAX; + } + } + } else if (range->end_byte > edit->start_byte) { + range->end_byte = edit->start_byte; + range->end_point = edit->start_point; + } + if (range->start_byte >= edit->old_end_byte) { + range->start_byte = edit->new_end_byte + (range->start_byte - edit->old_end_byte); + range->start_point = point_add( + edit->new_end_point, + point_sub(range->start_point, edit->old_end_point) + ); + if (range->start_byte < edit->new_end_byte) { + range->start_byte = UINT32_MAX; + range->start_point = POINT_MAX; + } + } else if (range->start_byte > edit->start_byte) { + range->start_byte = edit->start_byte; + range->start_point = edit->start_point; + } } SubtreePool pool = ts_subtree_pool_new(0); @@ -116,7 +148,7 @@ void ts_tree_print_dot_graph(const TSTree *self, int fd) { fclose(file); } -#elif !defined(__wasm__) // Wasm doesn't support dup +#else #include @@ -130,11 +162,4 @@ void ts_tree_print_dot_graph(const TSTree *self, int file_descriptor) { fclose(file); } -#else - -void ts_tree_print_dot_graph(const TSTree *self, int file_descriptor) { - (void)self; - (void)file_descriptor; -} - #endif diff --git a/lib/src/tree.h b/lib/src/tree.h index 9328f55a..f012f888 100644 --- a/lib/src/tree.h +++ b/lib/src/tree.h @@ -21,8 +21,8 @@ struct TSTree { unsigned included_range_count; }; -TSTree *ts_tree_new(Subtree root, const TSLanguage *language, const TSRange *included_ranges, unsigned included_range_count); -TSNode ts_node_new(const TSTree *tree, const Subtree *subtree, Length position, TSSymbol alias); +TSTree *ts_tree_new(Subtree root, const TSLanguage *language, const TSRange *, unsigned); +TSNode ts_node_new(const TSTree *, const Subtree *, Length, TSSymbol); #ifdef __cplusplus } diff --git a/lib/src/tree_cursor.c b/lib/src/tree_cursor.c index 70ef5e39..24416663 100644 --- a/lib/src/tree_cursor.c +++ b/lib/src/tree_cursor.c @@ -1,4 +1,5 @@ #include "tree_sitter/api.h" +#include "./alloc.h" #include "./tree_cursor.h" #include "./language.h" #include "./tree.h" @@ -16,11 +17,11 @@ typedef struct { // CursorChildIterator static inline bool ts_tree_cursor_is_entry_visible(const TreeCursor *self, uint32_t index) { - TreeCursorEntry *entry = array_get(&self->stack, index); + TreeCursorEntry *entry = &self->stack.contents[index]; if (index == 0 || ts_subtree_visible(*entry->subtree)) { return true; } else if (!ts_subtree_extra(*entry->subtree)) { - TreeCursorEntry *parent_entry = array_get(&self->stack, index - 1); + TreeCursorEntry *parent_entry = &self->stack.contents[index - 1]; return ts_language_alias_at( self->tree->language, parent_entry->subtree->ptr->production_id, @@ -129,17 +130,14 @@ static inline bool ts_tree_cursor_child_iterator_previous( }; *visible = ts_subtree_visible(*child); bool extra = ts_subtree_extra(*child); + if (!extra && self->alias_sequence) { + *visible |= self->alias_sequence[self->structural_child_index]; + self->structural_child_index--; + } self->position = length_backtrack(self->position, ts_subtree_padding(*child)); self->child_index--; - if (!extra && self->alias_sequence) { - *visible |= self->alias_sequence[self->structural_child_index]; - if (self->structural_child_index > 0) { - self->structural_child_index--; - } - } - // unsigned can underflow so compare it to child_count if (self->child_index < self->parent.ptr->child_count) { Subtree previous_child = ts_subtree_children(self->parent)[self->child_index]; @@ -214,6 +212,7 @@ bool ts_tree_cursor_goto_first_child(TSTreeCursor *self) { return false; } } + return false; } TreeCursorStep ts_tree_cursor_goto_last_child_internal(TSTreeCursor *_self) { @@ -254,6 +253,7 @@ bool ts_tree_cursor_goto_last_child(TSTreeCursor *self) { return false; } } + return false; } static inline int64_t ts_tree_cursor_goto_first_child_for_byte_and_point( @@ -274,7 +274,7 @@ static inline int64_t ts_tree_cursor_goto_first_child_for_byte_and_point( CursorChildIterator iterator = ts_tree_cursor_iterate_children(self); while (ts_tree_cursor_child_iterator_next(&iterator, &entry, &visible)) { Length entry_end = length_add(entry.position, ts_subtree_size(*entry.subtree)); - bool at_goal = entry_end.bytes > goal_byte && point_gt(entry_end.extent, goal_point); + bool at_goal = entry_end.bytes >= goal_byte && point_gte(entry_end.extent, goal_point); uint32_t visible_child_count = ts_subtree_visible_child_count(*entry.subtree); if (at_goal) { if (visible) { @@ -307,9 +307,8 @@ int64_t ts_tree_cursor_goto_first_child_for_point(TSTreeCursor *self, TSPoint go } TreeCursorStep ts_tree_cursor_goto_sibling_internal( - TSTreeCursor *_self, - bool (*advance)(CursorChildIterator *, TreeCursorEntry *, bool *) -) { + TSTreeCursor *_self, + bool (*advance)(CursorChildIterator *, TreeCursorEntry *, bool *)) { TreeCursor *self = (TreeCursor *)_self; uint32_t initial_size = self->stack.size; @@ -374,7 +373,7 @@ TreeCursorStep ts_tree_cursor_goto_previous_sibling_internal(TSTreeCursor *_self return step; // restore position from the parent node - const TreeCursorEntry *parent = array_get(&self->stack, self->stack.size - 2); + const TreeCursorEntry *parent = &self->stack.contents[self->stack.size - 2]; Length position = parent->position; uint32_t child_index = array_back(&self->stack)->child_index; const Subtree *children = ts_subtree_children((*(parent->subtree))); @@ -425,7 +424,7 @@ void ts_tree_cursor_goto_descendant( // Ascend to the lowest ancestor that contains the goal node. for (;;) { uint32_t i = self->stack.size - 1; - TreeCursorEntry *entry = array_get(&self->stack, i); + TreeCursorEntry *entry = &self->stack.contents[i]; uint32_t next_descendant_index = entry->descendant_index + (ts_tree_cursor_is_entry_visible(self, i) ? 1 : 0) + @@ -479,7 +478,7 @@ TSNode ts_tree_cursor_current_node(const TSTreeCursor *_self) { bool is_extra = ts_subtree_extra(*last_entry->subtree); TSSymbol alias_symbol = is_extra ? 0 : self->root_alias_symbol; if (self->stack.size > 1 && !is_extra) { - TreeCursorEntry *parent_entry = array_get(&self->stack, self->stack.size - 2); + TreeCursorEntry *parent_entry = &self->stack.contents[self->stack.size - 2]; alias_symbol = ts_language_alias_at( self->tree->language, parent_entry->subtree->ptr->production_id, @@ -516,8 +515,8 @@ void ts_tree_cursor_current_status( // Walk up the tree, visiting the current node and its invisible ancestors, // because fields can refer to nodes through invisible *wrapper* nodes, for (unsigned i = self->stack.size - 1; i > 0; i--) { - TreeCursorEntry *entry = array_get(&self->stack, i); - TreeCursorEntry *parent_entry = array_get(&self->stack, i - 1); + TreeCursorEntry *entry = &self->stack.contents[i]; + TreeCursorEntry *parent_entry = &self->stack.contents[i - 1]; const TSSymbol *alias_sequence = ts_language_alias_sequence( self->tree->language, @@ -630,11 +629,11 @@ uint32_t ts_tree_cursor_current_depth(const TSTreeCursor *_self) { TSNode ts_tree_cursor_parent_node(const TSTreeCursor *_self) { const TreeCursor *self = (const TreeCursor *)_self; for (int i = (int)self->stack.size - 2; i >= 0; i--) { - TreeCursorEntry *entry = array_get(&self->stack, i); + TreeCursorEntry *entry = &self->stack.contents[i]; bool is_visible = true; TSSymbol alias_symbol = 0; if (i > 0) { - TreeCursorEntry *parent_entry = array_get(&self->stack, i - 1); + TreeCursorEntry *parent_entry = &self->stack.contents[i - 1]; alias_symbol = ts_language_alias_at( self->tree->language, parent_entry->subtree->ptr->production_id, @@ -659,8 +658,8 @@ TSFieldId ts_tree_cursor_current_field_id(const TSTreeCursor *_self) { // Walk up the tree, visiting the current node and its invisible ancestors. for (unsigned i = self->stack.size - 1; i > 0; i--) { - TreeCursorEntry *entry = array_get(&self->stack, i); - TreeCursorEntry *parent_entry = array_get(&self->stack, i - 1); + TreeCursorEntry *entry = &self->stack.contents[i]; + TreeCursorEntry *parent_entry = &self->stack.contents[i - 1]; // Stop walking up when another visible node is found. if ( diff --git a/lib/src/tree_cursor.h b/lib/src/tree_cursor.h index 7d4e7ef0..96a386df 100644 --- a/lib/src/tree_cursor.h +++ b/lib/src/tree_cursor.h @@ -23,19 +23,19 @@ typedef enum { TreeCursorStepVisible, } TreeCursorStep; -void ts_tree_cursor_init(TreeCursor *self, TSNode node); +void ts_tree_cursor_init(TreeCursor *, TSNode); void ts_tree_cursor_current_status( - const TSTreeCursor *_self, - TSFieldId *field_id, - bool *has_later_siblings, - bool *has_later_named_siblings, - bool *can_have_later_siblings_with_this_field, - TSSymbol *supertypes, - unsigned *supertype_count + const TSTreeCursor *, + TSFieldId *, + bool *, + bool *, + bool *, + TSSymbol *, + unsigned * ); -TreeCursorStep ts_tree_cursor_goto_first_child_internal(TSTreeCursor *_self); -TreeCursorStep ts_tree_cursor_goto_next_sibling_internal(TSTreeCursor *_self); +TreeCursorStep ts_tree_cursor_goto_first_child_internal(TSTreeCursor *); +TreeCursorStep ts_tree_cursor_goto_next_sibling_internal(TSTreeCursor *); static inline Subtree ts_tree_cursor_current_subtree(const TSTreeCursor *_self) { const TreeCursor *self = (const TreeCursor *)_self; @@ -43,6 +43,6 @@ static inline Subtree ts_tree_cursor_current_subtree(const TSTreeCursor *_self) return *last_entry->subtree; } -TSNode ts_tree_cursor_parent_node(const TSTreeCursor *_self); +TSNode ts_tree_cursor_parent_node(const TSTreeCursor *); #endif // TREE_SITTER_TREE_CURSOR_H_ diff --git a/lib/src/ts_assert.h b/lib/src/ts_assert.h deleted file mode 100644 index 4cb8f36a..00000000 --- a/lib/src/ts_assert.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef TREE_SITTER_ASSERT_H_ -#define TREE_SITTER_ASSERT_H_ - -#ifdef NDEBUG -#define ts_assert(e) ((void)(e)) -#else -#include -#define ts_assert(e) assert(e) -#endif - -#endif // TREE_SITTER_ASSERT_H_ diff --git a/lib/src/unicode.h b/lib/src/unicode.h index 0fba3f29..0fba56a6 100644 --- a/lib/src/unicode.h +++ b/lib/src/unicode.h @@ -12,32 +12,17 @@ extern "C" { #define U_EXPORT2 #include "unicode/utf8.h" #include "unicode/utf16.h" -#include "portable/endian.h" - -#define U16_NEXT_LE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \ - (c)=le16toh((s)[(i)++]); \ - if(U16_IS_LEAD(c)) { \ - uint16_t __c2; \ - if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \ - ++(i); \ - (c)=U16_GET_SUPPLEMENTARY((c), __c2); \ - } \ - } \ -} UPRV_BLOCK_MACRO_END - -#define U16_NEXT_BE(s, i, length, c) UPRV_BLOCK_MACRO_BEGIN { \ - (c)=be16toh((s)[(i)++]); \ - if(U16_IS_LEAD(c)) { \ - uint16_t __c2; \ - if((i)!=(length) && U16_IS_TRAIL(__c2=(s)[(i)])) { \ - ++(i); \ - (c)=U16_GET_SUPPLEMENTARY((c), __c2); \ - } \ - } \ -} UPRV_BLOCK_MACRO_END static const int32_t TS_DECODE_ERROR = U_SENTINEL; +// These functions read one unicode code point from the given string, +// returning the number of bytes consumed. +typedef uint32_t (*UnicodeDecodeFunction)( + const uint8_t *string, + uint32_t length, + int32_t *code_point +); + static inline uint32_t ts_decode_utf8( const uint8_t *string, uint32_t length, @@ -48,23 +33,13 @@ static inline uint32_t ts_decode_utf8( return i; } -static inline uint32_t ts_decode_utf16_le( +static inline uint32_t ts_decode_utf16( const uint8_t *string, uint32_t length, int32_t *code_point ) { uint32_t i = 0; - U16_NEXT_LE(((uint16_t *)string), i, length, *code_point); - return i * 2; -} - -static inline uint32_t ts_decode_utf16_be( - const uint8_t *string, - uint32_t length, - int32_t *code_point -) { - uint32_t i = 0; - U16_NEXT_BE(((uint16_t *)string), i, length, *code_point); + U16_NEXT(((uint16_t *)string), i, length, *code_point); return i * 2; } diff --git a/crates/language/wasm/src/stdlib.c b/lib/src/wasm/stdlib.c similarity index 72% rename from crates/language/wasm/src/stdlib.c rename to lib/src/wasm/stdlib.c index f50e1da9..cfe2e4b3 100644 --- a/crates/language/wasm/src/stdlib.c +++ b/lib/src/wasm/stdlib.c @@ -1,12 +1,10 @@ // This file implements a very simple allocator for external scanners running -// in Wasm. Allocation is just bumping a static pointer and growing the heap -// as needed, and freeing is just adding the freed region to a free list. -// When additional memory is allocated, the free list is searched first. -// If there is not a suitable region in the free list, the heap is -// grown as necessary, and the allocation is made at the end of the heap. -// When the heap is reset, all allocated memory is considered freed. +// in WASM. Allocation is just bumping a static pointer and growing the heap +// as needed, and freeing is mostly a noop. But in the special case of freeing +// the last-allocated pointer, we'll reuse that pointer again. -#include +#include +#include #include #include @@ -17,14 +15,12 @@ extern void tree_sitter_debug_message(const char *, size_t); typedef struct { size_t size; - struct Region *next; char data[0]; } Region; static Region *heap_end = NULL; static Region *heap_start = NULL; static Region *next = NULL; -static Region *free_list = NULL; // Get the region metadata for the given heap pointer. static inline Region *region_for_ptr(void *ptr) { @@ -53,27 +49,9 @@ void reset_heap(void *new_heap_start) { heap_start = new_heap_start; next = new_heap_start; heap_end = get_heap_end(); - free_list = NULL; } void *malloc(size_t size) { - if (size == 0) return NULL; - - Region *prev = NULL; - Region *curr = free_list; - while (curr != NULL) { - if (curr->size >= size) { - if (prev == NULL) { - free_list = curr->next; - } else { - prev->next = curr->next; - } - return &curr->data; - } - prev = curr; - curr = curr->next; - } - Region *region_end = region_after(next, size); if (region_end > heap_end) { @@ -101,9 +79,6 @@ void free(void *ptr) { // pointer for the next allocation. if (region_end == next) { next = region; - } else { - region->next = free_list; - free_list = region; } } @@ -132,7 +107,3 @@ void *realloc(void *ptr, size_t new_size) { memcpy(result, ®ion->data, region->size); return result; } - -__attribute__((noreturn)) void abort(void) { - __builtin_trap(); -} diff --git a/lib/src/wasm/wasm-stdlib.h b/lib/src/wasm/wasm-stdlib.h index 082ef4c2..c1f3bc08 100644 --- a/lib/src/wasm/wasm-stdlib.h +++ b/lib/src/wasm/wasm-stdlib.h @@ -1,942 +1,964 @@ unsigned char STDLIB_WASM[] = { - 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1a, 0x05, 0x60, - 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x06, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x00, - 0x02, 0x7c, 0x04, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, - 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, - 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, - 0x67, 0x65, 0x74, 0x00, 0x02, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, - 0x69, 0x74, 0x00, 0x03, 0x03, 0x65, 0x6e, 0x76, 0x06, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x1f, 0x1e, 0x04, 0x04, 0x04, - 0x03, 0x00, 0x03, 0x02, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, - 0x02, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x80, 0x04, - 0x0b, 0x07, 0xad, 0x02, 0x1c, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, - 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, - 0x03, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x00, 0x05, 0x0a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, - 0x65, 0x61, 0x70, 0x00, 0x06, 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x00, 0x07, 0x04, 0x66, 0x72, 0x65, 0x65, 0x00, 0x08, 0x06, 0x63, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x09, 0x07, 0x72, 0x65, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x00, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, 0x00, - 0x0c, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x00, 0x20, - 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x0d, 0x08, - 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x00, 0x1a, 0x08, 0x69, - 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x1b, 0x08, 0x69, 0x73, - 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, 0x18, 0x08, 0x69, 0x73, 0x77, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x00, 0x1f, 0x08, 0x69, 0x73, 0x77, 0x75, - 0x70, 0x70, 0x65, 0x72, 0x00, 0x15, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, - 0x69, 0x67, 0x69, 0x74, 0x00, 0x1e, 0x08, 0x74, 0x6f, 0x77, 0x6c, 0x6f, - 0x77, 0x65, 0x72, 0x00, 0x11, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, 0x70, - 0x65, 0x72, 0x00, 0x13, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, 0x00, - 0x0f, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x00, 0x0e, 0x06, 0x6d, - 0x65, 0x6d, 0x63, 0x70, 0x79, 0x00, 0x19, 0x07, 0x6d, 0x65, 0x6d, 0x6d, - 0x6f, 0x76, 0x65, 0x00, 0x16, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, - 0x00, 0x17, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x00, 0x10, 0x07, - 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x1c, 0x07, 0x73, 0x74, - 0x72, 0x6e, 0x63, 0x6d, 0x70, 0x00, 0x14, 0x07, 0x73, 0x74, 0x72, 0x6e, - 0x63, 0x70, 0x79, 0x00, 0x1d, 0x08, 0x01, 0x04, 0x0c, 0x01, 0x02, 0x0a, - 0x8d, 0x2a, 0x1e, 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x41, 0xec, 0xc2, 0x04, - 0x41, 0x00, 0x41, 0x84, 0x01, 0xfc, 0x0b, 0x00, 0x0b, 0xfd, 0x01, 0x01, - 0x03, 0x7f, 0x41, 0xec, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x45, 0x04, 0x40, - 0x41, 0xec, 0xc2, 0x04, 0x41, 0x01, 0x36, 0x02, 0x00, 0x41, 0x84, 0xc3, - 0x04, 0x41, 0x84, 0xc3, 0x04, 0x36, 0x02, 0x00, 0x41, 0xbc, 0xc3, 0x04, - 0x41, 0x00, 0x36, 0x02, 0x00, 0x41, 0xb8, 0xc3, 0x04, 0x41, 0x80, 0x80, - 0x04, 0x36, 0x02, 0x00, 0x41, 0xb4, 0xc3, 0x04, 0x41, 0x80, 0x80, 0x04, - 0x36, 0x02, 0x00, 0x41, 0x8c, 0xc3, 0x04, 0x41, 0x84, 0xc3, 0x04, 0x36, - 0x02, 0x00, 0x41, 0x88, 0xc3, 0x04, 0x41, 0x84, 0xc3, 0x04, 0x36, 0x02, - 0x00, 0x41, 0x90, 0xc3, 0x04, 0x41, 0x80, 0xc3, 0x04, 0x28, 0x02, 0x00, - 0x36, 0x02, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x41, 0x80, 0x80, 0x04, 0x36, - 0x02, 0x00, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x00, 0x02, - 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x08, 0x6a, - 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x01, 0x41, 0xff, 0xff, 0x03, 0x71, - 0x45, 0x04, 0x40, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, 0x01, 0x6a, 0x22, - 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, 0x10, 0x07, 0x22, - 0x02, 0x45, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x04, 0x10, 0x09, 0x22, 0x01, - 0x45, 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x00, 0x41, 0xff, 0xff, - 0x03, 0x71, 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x00, 0x0b, 0x41, - 0xc7, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, - 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x08, - 0x41, 0xc6, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x08, 0x20, - 0x01, 0x10, 0x08, 0x41, 0xc7, 0x00, 0x10, 0x0b, 0x00, 0x0b, 0x00, 0x0b, - 0x35, 0x01, 0x01, 0x7f, 0x41, 0xf4, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, - 0x00, 0x41, 0xf0, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x3f, 0x00, - 0x21, 0x00, 0x20, 0x01, 0x41, 0xfc, 0xc2, 0x04, 0x6a, 0x41, 0x00, 0x36, - 0x02, 0x00, 0x20, 0x01, 0x41, 0xf8, 0xc2, 0x04, 0x6a, 0x20, 0x00, 0x41, - 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, 0xde, 0x01, 0x01, 0x04, 0x7f, 0x02, - 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x41, 0xfc, 0xc2, 0x04, - 0x28, 0x02, 0x00, 0x22, 0x01, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, - 0x20, 0x01, 0x28, 0x02, 0x00, 0x4d, 0x04, 0x40, 0x20, 0x01, 0x21, 0x02, - 0x0c, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x02, - 0x45, 0x0d, 0x02, 0x20, 0x01, 0x21, 0x03, 0x20, 0x02, 0x22, 0x01, 0x28, - 0x02, 0x00, 0x20, 0x00, 0x49, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x28, - 0x02, 0x04, 0x21, 0x00, 0x02, 0x40, 0x20, 0x03, 0x45, 0x04, 0x40, 0x41, - 0xfc, 0xc2, 0x04, 0x20, 0x00, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, - 0x03, 0x20, 0x00, 0x36, 0x02, 0x04, 0x0b, 0x20, 0x02, 0x41, 0x08, 0x6a, - 0x0f, 0x0b, 0x41, 0xf4, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, - 0x08, 0x6a, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, - 0x71, 0x22, 0x02, 0x41, 0xf8, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x4b, 0x04, - 0x40, 0x20, 0x02, 0x41, 0xf0, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x6b, 0x41, - 0x80, 0x80, 0x80, 0x02, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6b, - 0x41, 0x10, 0x76, 0x41, 0x01, 0x6a, 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, - 0x01, 0x41, 0xf8, 0xc2, 0x04, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, - 0x00, 0x0b, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x41, 0xf4, 0xc2, - 0x04, 0x20, 0x02, 0x36, 0x02, 0x00, 0x20, 0x01, 0x21, 0x04, 0x0b, 0x20, - 0x04, 0x0b, 0x41, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x04, 0x40, 0x41, 0xf4, - 0xc2, 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, 0x6b, - 0x22, 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, 0x41, - 0x7c, 0x71, 0x47, 0x04, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6b, 0x41, 0xfc, - 0xc2, 0x04, 0x22, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x0b, 0x20, - 0x01, 0x20, 0x02, 0x36, 0x02, 0x00, 0x0b, 0x0b, 0x1d, 0x00, 0x20, 0x00, - 0x20, 0x01, 0x6c, 0x22, 0x00, 0x10, 0x07, 0x21, 0x01, 0x20, 0x00, 0x04, - 0x40, 0x20, 0x01, 0x41, 0x00, 0x20, 0x00, 0xfc, 0x0b, 0x00, 0x0b, 0x20, - 0x01, 0x0b, 0x56, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, - 0x00, 0x41, 0xf4, 0xc2, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x41, 0x08, - 0x6b, 0x22, 0x02, 0x28, 0x02, 0x00, 0x20, 0x00, 0x6a, 0x41, 0x03, 0x6a, - 0x41, 0x7c, 0x71, 0x46, 0x04, 0x40, 0x41, 0xf4, 0xc2, 0x04, 0x20, 0x02, - 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x07, 0x21, 0x01, - 0x20, 0x02, 0x28, 0x02, 0x00, 0x22, 0x02, 0x04, 0x40, 0x20, 0x01, 0x20, - 0x00, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0b, 0x20, 0x01, 0x0f, 0x0b, - 0x20, 0x01, 0x10, 0x07, 0x0b, 0x07, 0x00, 0x20, 0x00, 0x10, 0x02, 0x00, - 0x0b, 0xc5, 0x01, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, - 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, 0x0f, 0x0b, 0x20, 0x00, 0x41, 0x01, - 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x01, - 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, - 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, - 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, - 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x0d, 0x01, 0x0b, - 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x02, 0x20, 0x01, 0x41, 0x05, 0x6b, - 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x41, - 0x80, 0x82, 0x84, 0x08, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, - 0x02, 0x00, 0x22, 0x03, 0x6b, 0x20, 0x03, 0x72, 0x41, 0x80, 0x81, 0x82, - 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x46, 0x0d, 0x00, - 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, - 0x2d, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, 0x02, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, 0x0b, 0x38, 0x00, 0x20, 0x00, - 0x41, 0xff, 0xff, 0x07, 0x4d, 0x04, 0x40, 0x20, 0x00, 0x41, 0x03, 0x76, - 0x41, 0x1f, 0x71, 0x20, 0x00, 0x41, 0x08, 0x76, 0x2d, 0x00, 0x80, 0x80, - 0x04, 0x41, 0x05, 0x74, 0x72, 0x2d, 0x00, 0x80, 0x80, 0x04, 0x20, 0x00, - 0x41, 0x07, 0x71, 0x76, 0x41, 0x01, 0x71, 0x0f, 0x0b, 0x20, 0x00, 0x41, - 0xfe, 0xff, 0x0b, 0x49, 0x0b, 0x43, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x20, - 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, - 0x04, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x46, 0x04, 0x40, 0x20, - 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, - 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x01, 0x0c, 0x02, - 0x0b, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, - 0x0b, 0xe9, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, - 0x05, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, - 0x45, 0x20, 0x02, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x00, 0x2d, 0x00, - 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x04, 0x40, 0x20, 0x00, - 0x21, 0x03, 0x20, 0x02, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x02, 0x41, - 0x01, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, - 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, - 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, - 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x04, 0x41, - 0x00, 0x47, 0x21, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, - 0x03, 0x71, 0x45, 0x20, 0x04, 0x45, 0x72, 0x0d, 0x01, 0x20, 0x03, 0x2d, - 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, - 0x02, 0x41, 0x03, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, 0x05, 0x20, - 0x00, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x04, - 0x45, 0x72, 0x0d, 0x01, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, - 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, - 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x00, 0x47, 0x21, - 0x05, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, - 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, - 0x22, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x46, 0x20, 0x04, 0x41, 0x04, - 0x49, 0x72, 0x45, 0x04, 0x40, 0x20, 0x00, 0x41, 0x81, 0x82, 0x84, 0x08, - 0x6c, 0x21, 0x00, 0x03, 0x40, 0x41, 0x80, 0x82, 0x84, 0x08, 0x20, 0x03, - 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, 0x02, 0x6b, 0x20, 0x02, 0x72, - 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, - 0x78, 0x47, 0x0d, 0x02, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, - 0x04, 0x41, 0x04, 0x6b, 0x22, 0x04, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, - 0x71, 0x21, 0x00, 0x03, 0x40, 0x20, 0x00, 0x20, 0x03, 0x2d, 0x00, 0x00, - 0x46, 0x04, 0x40, 0x20, 0x03, 0x0f, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x6a, - 0x21, 0x03, 0x20, 0x04, 0x41, 0x01, 0x6b, 0x22, 0x04, 0x0d, 0x00, 0x0b, - 0x0b, 0x41, 0x00, 0x0b, 0x58, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, - 0x2d, 0x00, 0x00, 0x22, 0x02, 0x45, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x22, 0x03, 0x47, 0x72, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, - 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, - 0x01, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, - 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, - 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x20, 0x03, 0x46, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x0b, 0x08, 0x00, 0x20, - 0x00, 0x41, 0x00, 0x10, 0x12, 0x0b, 0x90, 0x02, 0x01, 0x07, 0x7f, 0x02, - 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, 0x00, 0x20, 0x00, - 0x20, 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, 0x05, 0x41, 0x03, 0x6e, 0x22, - 0x02, 0x41, 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, 0x41, 0x02, 0x74, - 0x28, 0x02, 0xc0, 0x9e, 0x04, 0x20, 0x02, 0x20, 0x00, 0x41, 0x08, 0x76, - 0x22, 0x02, 0x2d, 0x00, 0xa0, 0xa9, 0x04, 0x41, 0xd6, 0x00, 0x6c, 0x6a, - 0x2d, 0x00, 0xa0, 0xa9, 0x04, 0x6c, 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, - 0x20, 0x02, 0x2d, 0x00, 0x90, 0xbe, 0x04, 0x6a, 0x41, 0x02, 0x74, 0x28, - 0x02, 0xd0, 0x9e, 0x04, 0x22, 0x03, 0x41, 0x08, 0x75, 0x21, 0x02, 0x20, - 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, 0x04, 0x40, - 0x20, 0x02, 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x71, 0x20, - 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, - 0x45, 0x0d, 0x00, 0x20, 0x02, 0x41, 0x08, 0x76, 0x21, 0x02, 0x03, 0x40, - 0x20, 0x03, 0x41, 0x01, 0x76, 0x22, 0x06, 0x20, 0x02, 0x6a, 0x22, 0x04, - 0x41, 0x01, 0x74, 0x22, 0x07, 0x2d, 0x00, 0x90, 0xa6, 0x04, 0x22, 0x08, - 0x20, 0x05, 0x46, 0x04, 0x40, 0x20, 0x07, 0x41, 0x90, 0xa6, 0x04, 0x6a, - 0x2d, 0x00, 0x01, 0x41, 0x02, 0x74, 0x28, 0x02, 0xd0, 0x9e, 0x04, 0x22, - 0x02, 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x41, 0x01, 0x4d, 0x04, 0x40, - 0x41, 0x00, 0x20, 0x01, 0x20, 0x03, 0x73, 0x6b, 0x20, 0x02, 0x41, 0x08, - 0x75, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, - 0x01, 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x20, - 0x05, 0x20, 0x08, 0x49, 0x22, 0x04, 0x1b, 0x21, 0x02, 0x20, 0x06, 0x20, - 0x03, 0x20, 0x06, 0x6b, 0x20, 0x04, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x00, 0x0b, 0x08, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x12, - 0x0b, 0x75, 0x01, 0x02, 0x7f, 0x20, 0x02, 0x45, 0x04, 0x40, 0x41, 0x00, - 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, - 0x04, 0x40, 0x41, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x41, - 0x01, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x21, 0x02, 0x02, - 0x40, 0x03, 0x40, 0x20, 0x02, 0x45, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x22, 0x04, 0x47, 0x20, 0x04, 0x45, 0x72, 0x72, 0x0d, 0x01, 0x20, - 0x02, 0x41, 0x01, 0x6b, 0x21, 0x02, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, - 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x00, 0x41, 0x01, - 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x41, 0x00, 0x21, 0x03, - 0x0b, 0x0b, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x09, - 0x00, 0x20, 0x00, 0x10, 0x11, 0x20, 0x00, 0x47, 0x0b, 0x93, 0x0a, 0x01, - 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x21, 0x4f, 0x04, - 0x40, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, - 0x01, 0x46, 0x0d, 0x00, 0x20, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, - 0x04, 0x6b, 0x41, 0x00, 0x20, 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4d, 0x04, - 0x40, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, - 0x01, 0x73, 0x41, 0x03, 0x71, 0x21, 0x03, 0x02, 0x40, 0x02, 0x40, 0x20, - 0x00, 0x20, 0x01, 0x49, 0x04, 0x40, 0x20, 0x03, 0x04, 0x40, 0x20, 0x02, - 0x21, 0x04, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x00, 0x41, - 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x04, 0x20, 0x00, 0x21, - 0x03, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, - 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x01, 0x6b, - 0x21, 0x04, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, - 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, - 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x21, 0x04, 0x20, - 0x00, 0x41, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, - 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, - 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, - 0x02, 0x20, 0x02, 0x41, 0x03, 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x03, - 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x41, - 0x03, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x03, - 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, - 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, - 0x20, 0x02, 0x41, 0x04, 0x6b, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x02, 0x40, - 0x20, 0x03, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, - 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, - 0x01, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, - 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, - 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, - 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x03, 0x6a, - 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, + 0x60, 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x00, 0x01, 0x7f, 0x60, 0x03, 0x7f, + 0x7f, 0x7f, 0x01, 0x7f, 0x02, 0x9e, 0x01, 0x05, 0x03, 0x65, 0x6e, 0x76, + 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x03, 0x65, + 0x6e, 0x76, 0x19, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x01, 0x70, 0x00, 0x01, 0x16, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x08, 0x61, 0x72, 0x67, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x0e, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x67, 0x65, 0x74, 0x00, 0x00, 0x16, 0x77, + 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x31, 0x09, 0x70, 0x72, + 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x00, 0x01, 0x03, 0x2a, 0x29, + 0x02, 0x00, 0x02, 0x02, 0x01, 0x03, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x05, 0x05, 0x03, 0x03, 0x05, 0x05, 0x00, 0x03, + 0x00, 0x03, 0x05, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, + 0x03, 0x03, 0x00, 0x03, 0x03, 0x06, 0x0d, 0x02, 0x7f, 0x01, 0x41, 0x80, + 0x80, 0x04, 0x0b, 0x7f, 0x00, 0x41, 0x00, 0x0b, 0x07, 0xad, 0x02, 0x1c, + 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x03, 0x0f, 0x5f, 0x5f, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x03, 0x00, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x06, 0x0a, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x00, 0x07, + 0x06, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x08, 0x04, 0x66, 0x72, + 0x65, 0x65, 0x00, 0x09, 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, + 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x73, 0x65, 0x74, 0x00, 0x14, 0x07, 0x72, + 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x00, 0x0b, 0x06, 0x6d, 0x65, 0x6d, + 0x63, 0x70, 0x79, 0x00, 0x13, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, + 0x00, 0x15, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x00, + 0x2b, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x00, 0x16, + 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x00, 0x22, 0x08, + 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x23, 0x08, 0x69, + 0x73, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x00, 0x20, 0x08, 0x69, 0x73, + 0x77, 0x73, 0x70, 0x61, 0x63, 0x65, 0x00, 0x2a, 0x08, 0x69, 0x73, 0x77, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x00, 0x1e, 0x09, 0x69, 0x73, 0x77, 0x78, + 0x64, 0x69, 0x67, 0x69, 0x74, 0x00, 0x27, 0x08, 0x74, 0x6f, 0x77, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x00, 0x1a, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, + 0x70, 0x65, 0x72, 0x00, 0x1c, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x68, 0x72, + 0x00, 0x18, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x00, 0x17, 0x07, + 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x00, 0x1f, 0x06, 0x73, 0x74, + 0x72, 0x63, 0x6d, 0x70, 0x00, 0x19, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, + 0x61, 0x74, 0x00, 0x24, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, 0x70, + 0x00, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x70, 0x79, 0x00, 0x26, + 0x08, 0x01, 0x05, 0x0a, 0xe8, 0x2b, 0x29, 0x02, 0x00, 0x0b, 0x03, 0x00, + 0x00, 0x0b, 0x0d, 0x00, 0x41, 0xe8, 0xc2, 0x04, 0x41, 0x00, 0x41, 0x10, + 0xfc, 0x0b, 0x00, 0x0b, 0x52, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x02, 0x40, + 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xe8, 0xc2, 0x84, 0x80, 0x00, + 0x6a, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xe8, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x41, 0x01, 0x36, 0x02, 0x00, + 0x10, 0x83, 0x80, 0x80, 0x80, 0x00, 0x10, 0x8d, 0x80, 0x80, 0x80, 0x00, + 0x21, 0x00, 0x10, 0x92, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x0d, 0x01, + 0x0f, 0x0b, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x37, 0x01, 0x01, 0x7f, 0x23, 0x81, 0x80, 0x80, 0x80, + 0x00, 0x22, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x00, + 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, 0x6a, + 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0xf4, 0xc2, 0x84, 0x80, + 0x00, 0x6a, 0x3f, 0x00, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x0b, 0xb4, + 0x01, 0x01, 0x03, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x22, 0x01, 0x41, 0xf4, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, + 0x02, 0x00, 0x20, 0x01, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, + 0x02, 0x00, 0x22, 0x01, 0x20, 0x00, 0x6a, 0x41, 0x07, 0x6a, 0x41, 0x7c, + 0x71, 0x22, 0x02, 0x4f, 0x0d, 0x00, 0x41, 0x00, 0x21, 0x01, 0x20, 0x02, + 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xec, 0xc2, 0x84, 0x80, 0x00, + 0x6a, 0x28, 0x02, 0x00, 0x6b, 0x41, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x0d, + 0x01, 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x41, 0x10, 0x76, 0x41, 0x01, 0x6a, + 0x40, 0x00, 0x41, 0x7f, 0x46, 0x0d, 0x01, 0x3f, 0x00, 0x21, 0x01, 0x23, + 0x81, 0x80, 0x80, 0x80, 0x00, 0x22, 0x03, 0x41, 0xf4, 0xc2, 0x84, 0x80, + 0x00, 0x6a, 0x20, 0x01, 0x41, 0x10, 0x74, 0x36, 0x02, 0x00, 0x20, 0x03, + 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x21, 0x01, + 0x0b, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x00, 0x23, 0x81, 0x80, 0x80, + 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x02, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x01, + 0x0b, 0x48, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x45, 0x0d, 0x00, + 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x22, 0x01, 0x28, 0x02, 0x00, 0x21, 0x02, + 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, + 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x41, 0x03, 0x6a, + 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, + 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x20, 0x01, 0x36, 0x02, 0x00, + 0x0b, 0x0b, 0x19, 0x00, 0x20, 0x01, 0x20, 0x00, 0x6c, 0x22, 0x00, 0x10, + 0x88, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x20, 0x00, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x6b, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x00, + 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x28, 0x02, + 0x00, 0x21, 0x03, 0x02, 0x40, 0x23, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, + 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x20, 0x00, 0x20, + 0x03, 0x6a, 0x41, 0x03, 0x6a, 0x41, 0x7c, 0x71, 0x47, 0x0d, 0x00, 0x23, + 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xf0, 0xc2, 0x84, 0x80, 0x00, 0x6a, + 0x20, 0x02, 0x36, 0x02, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, 0x10, 0x88, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x20, 0x02, 0x28, 0x02, 0x00, 0x10, + 0x93, 0x80, 0x80, 0x80, 0x00, 0x0f, 0x0b, 0x20, 0x01, 0x10, 0x88, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x90, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x0b, 0xd5, 0x01, 0x01, 0x03, 0x7f, 0x23, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x41, 0x08, 0x6a, 0x20, 0x00, 0x41, 0x0c, 0x6a, 0x10, 0x8f, + 0x80, 0x80, 0x80, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x28, 0x02, 0x08, 0x41, + 0x01, 0x6a, 0x22, 0x01, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x28, 0x02, 0x0c, + 0x10, 0x88, 0x80, 0x80, 0x80, 0x00, 0x22, 0x02, 0x45, 0x0d, 0x02, 0x20, + 0x01, 0x41, 0x04, 0x10, 0x8a, 0x80, 0x80, 0x80, 0x00, 0x22, 0x01, 0x45, + 0x0d, 0x03, 0x20, 0x01, 0x20, 0x02, 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, + 0x0d, 0x04, 0x20, 0x00, 0x28, 0x02, 0x08, 0x20, 0x01, 0x10, 0x84, 0x80, + 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a, 0x24, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0f, 0x0b, 0x41, 0xc7, 0x00, 0x10, + 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x0b, 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, + 0x00, 0x41, 0xc6, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, + 0x20, 0x02, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x10, 0x89, + 0x80, 0x80, 0x80, 0x00, 0x41, 0xc7, 0x00, 0x10, 0x8c, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, 0x03, 0x71, 0x0b, 0x11, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x41, 0xff, 0xff, + 0x03, 0x71, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x10, 0x82, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x0b, 0x02, 0x00, 0x0b, 0x0e, 0x00, 0x10, 0x91, 0x80, 0x80, + 0x80, 0x00, 0x10, 0x91, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xe6, 0x07, 0x01, + 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, 0x20, + 0x4b, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, + 0x02, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x01, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x05, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02, 0x41, 0x7e, + 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x01, + 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, + 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, + 0x00, 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, + 0x03, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x05, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x02, 0x20, 0x03, 0x45, 0x0d, 0x02, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x7c, + 0x6a, 0x21, 0x03, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x01, + 0x41, 0x04, 0x6a, 0x21, 0x05, 0x0c, 0x02, 0x0b, 0x20, 0x00, 0x20, 0x01, + 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x20, 0x02, + 0x21, 0x03, 0x20, 0x00, 0x21, 0x04, 0x20, 0x01, 0x21, 0x05, 0x0b, 0x02, + 0x40, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x0d, 0x00, + 0x02, 0x40, 0x02, 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, + 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x70, + 0x6a, 0x22, 0x02, 0x41, 0x10, 0x71, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, + 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, + 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, + 0x05, 0x41, 0x10, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x21, 0x03, 0x0b, 0x20, + 0x02, 0x41, 0x10, 0x49, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x03, 0x40, + 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, + 0x20, 0x05, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, 0x04, 0x20, 0x05, + 0x29, 0x02, 0x10, 0x37, 0x02, 0x10, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, + 0x18, 0x37, 0x02, 0x18, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, 0x20, + 0x05, 0x41, 0x20, 0x6a, 0x21, 0x05, 0x20, 0x02, 0x41, 0x60, 0x6a, 0x22, + 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x02, 0x40, 0x20, 0x02, + 0x41, 0x08, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x29, 0x02, 0x00, + 0x37, 0x02, 0x00, 0x20, 0x05, 0x41, 0x08, 0x6a, 0x21, 0x05, 0x20, 0x04, + 0x41, 0x08, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x04, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x36, + 0x02, 0x00, 0x20, 0x05, 0x41, 0x04, 0x6a, 0x21, 0x05, 0x20, 0x04, 0x41, + 0x04, 0x6a, 0x21, 0x04, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, 0x00, 0x3b, 0x00, + 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x02, + 0x6a, 0x21, 0x05, 0x0b, 0x20, 0x02, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x01, + 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, + 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x03, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x0e, 0x03, 0x03, 0x00, 0x01, 0x07, 0x0b, 0x20, + 0x04, 0x20, 0x05, 0x28, 0x02, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x20, + 0x05, 0x41, 0x02, 0x6a, 0x28, 0x01, 0x00, 0x36, 0x02, 0x02, 0x20, 0x04, + 0x20, 0x05, 0x41, 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, 0x20, + 0x04, 0x41, 0x12, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x12, 0x6a, 0x21, + 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0e, 0x6a, 0x28, 0x01, + 0x00, 0x21, 0x05, 0x41, 0x0e, 0x21, 0x03, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, + 0x41, 0x01, 0x6a, 0x28, 0x00, 0x00, 0x36, 0x02, 0x01, 0x20, 0x04, 0x20, + 0x05, 0x41, 0x05, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, + 0x41, 0x11, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x11, 0x6a, 0x21, 0x01, + 0x41, 0x0d, 0x21, 0x06, 0x20, 0x05, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, + 0x21, 0x05, 0x41, 0x0f, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x02, 0x40, 0x02, + 0x40, 0x20, 0x03, 0x41, 0x10, 0x4f, 0x0d, 0x00, 0x20, 0x04, 0x21, 0x02, + 0x20, 0x05, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x05, 0x2d, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x20, 0x05, 0x28, 0x00, 0x01, + 0x36, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x29, 0x00, 0x05, 0x37, 0x00, + 0x05, 0x20, 0x04, 0x20, 0x05, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, + 0x04, 0x20, 0x05, 0x2d, 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, + 0x10, 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x0b, + 0x20, 0x03, 0x41, 0x08, 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, + 0x20, 0x05, 0x28, 0x02, 0x00, 0x22, 0x02, 0x3a, 0x00, 0x00, 0x20, 0x04, + 0x20, 0x02, 0x41, 0x10, 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x02, + 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, 0x04, 0x20, 0x05, 0x41, 0x03, + 0x6a, 0x28, 0x00, 0x00, 0x36, 0x02, 0x03, 0x20, 0x04, 0x20, 0x05, 0x41, + 0x07, 0x6a, 0x29, 0x00, 0x00, 0x37, 0x02, 0x07, 0x20, 0x04, 0x41, 0x13, + 0x6a, 0x21, 0x02, 0x20, 0x05, 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, + 0x21, 0x06, 0x20, 0x05, 0x41, 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x05, + 0x41, 0x0d, 0x21, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x6a, 0x20, 0x05, + 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, 0x00, 0x37, + 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, + 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x04, 0x71, + 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, + 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, + 0x6a, 0x21, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x03, 0x41, 0x02, 0x71, 0x45, + 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, + 0x20, 0x02, 0x41, 0x02, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, + 0x21, 0x01, 0x0b, 0x20, 0x03, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, + 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, + 0x0b, 0x88, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, 0x02, + 0x41, 0x21, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, + 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x20, 0x00, + 0x6a, 0x22, 0x03, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, + 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, + 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x03, 0x41, 0x7d, + 0x6a, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x7e, 0x6a, 0x20, + 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x07, 0x49, 0x0d, 0x00, 0x20, + 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x20, + 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, + 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, 0x41, 0x03, 0x71, 0x22, 0x04, 0x6a, + 0x22, 0x05, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, + 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, 0x05, 0x20, 0x02, 0x20, + 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x22, 0x01, 0x6a, 0x22, 0x02, 0x41, 0x7c, + 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x09, 0x49, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x08, 0x20, 0x05, 0x20, 0x03, + 0x36, 0x02, 0x04, 0x20, 0x02, 0x41, 0x78, 0x6a, 0x20, 0x03, 0x36, 0x02, + 0x00, 0x20, 0x02, 0x41, 0x74, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, + 0x01, 0x41, 0x19, 0x49, 0x0d, 0x00, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, + 0x18, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x14, 0x20, 0x05, 0x20, 0x03, + 0x36, 0x02, 0x10, 0x20, 0x05, 0x20, 0x03, 0x36, 0x02, 0x0c, 0x20, 0x02, + 0x41, 0x70, 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x6c, + 0x6a, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x68, 0x6a, 0x20, + 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x64, 0x6a, 0x20, 0x03, 0x36, + 0x02, 0x00, 0x20, 0x01, 0x20, 0x05, 0x41, 0x04, 0x71, 0x41, 0x18, 0x72, + 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x20, 0x49, 0x0d, 0x00, 0x20, 0x03, + 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, 0x10, 0x7e, 0x21, 0x06, 0x20, 0x05, + 0x20, 0x02, 0x6a, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x37, + 0x03, 0x18, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x10, 0x20, 0x02, 0x20, + 0x06, 0x37, 0x03, 0x08, 0x20, 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, + 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x60, 0x6a, 0x22, + 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0xcc, + 0x01, 0x01, 0x03, 0x7f, 0x20, 0x00, 0x21, 0x01, 0x02, 0x40, 0x02, 0x40, + 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x00, 0x6b, 0x0f, 0x0b, + 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, + 0x02, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, + 0x01, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x41, 0x03, + 0x71, 0x0d, 0x01, 0x0b, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, 0x02, 0x20, + 0x01, 0x41, 0x7b, 0x6a, 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, + 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x28, 0x02, + 0x00, 0x22, 0x03, 0x41, 0x7f, 0x73, 0x20, 0x03, 0x41, 0xff, 0xfd, 0xfb, + 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x45, 0x0d, + 0x00, 0x0b, 0x03, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, + 0x02, 0x2d, 0x00, 0x00, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x21, + 0x02, 0x20, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x6b, + 0x0b, 0x44, 0x00, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, + 0x0d, 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x41, 0x80, 0x80, 0x84, 0x80, + 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x05, 0x74, 0x20, 0x00, 0x41, 0x03, + 0x76, 0x41, 0x1f, 0x71, 0x72, 0x41, 0x80, 0x80, 0x84, 0x80, 0x00, 0x6a, + 0x2d, 0x00, 0x00, 0x20, 0x00, 0x41, 0x07, 0x71, 0x76, 0x41, 0x01, 0x71, + 0x0f, 0x0b, 0x20, 0x00, 0x41, 0xfe, 0xff, 0x0b, 0x49, 0x0b, 0x49, 0x01, + 0x03, 0x7f, 0x41, 0x00, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x45, 0x0d, + 0x00, 0x02, 0x40, 0x03, 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x04, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x47, 0x0d, 0x01, 0x20, 0x01, + 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, + 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0c, 0x02, 0x0b, + 0x0b, 0x20, 0x04, 0x20, 0x05, 0x6b, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x0b, + 0xf2, 0x02, 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x00, 0x47, 0x21, 0x03, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, + 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x00, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, + 0x00, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, + 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, + 0x20, 0x00, 0x41, 0x01, 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7e, + 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x02, + 0x6a, 0x22, 0x04, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, + 0x0d, 0x01, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, + 0x00, 0x47, 0x21, 0x03, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x22, 0x04, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x05, 0x45, 0x0d, 0x01, 0x20, 0x04, + 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x02, + 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x7c, 0x6a, + 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, + 0x21, 0x05, 0x20, 0x00, 0x21, 0x04, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x01, + 0x02, 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x01, 0x41, 0xff, 0x01, + 0x71, 0x46, 0x0d, 0x00, 0x20, 0x05, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0xff, 0x01, 0x71, 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x21, + 0x00, 0x03, 0x40, 0x20, 0x04, 0x28, 0x02, 0x00, 0x20, 0x00, 0x73, 0x22, + 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02, 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, + 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x0d, 0x02, 0x20, 0x04, + 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x05, + 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x01, + 0x0b, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, 0x21, 0x02, 0x03, 0x40, 0x02, + 0x40, 0x20, 0x04, 0x2d, 0x00, 0x00, 0x20, 0x02, 0x47, 0x0d, 0x00, 0x20, + 0x04, 0x0f, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x05, + 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x0b, + 0x67, 0x01, 0x02, 0x7f, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x02, 0x02, + 0x40, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, + 0x03, 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x47, 0x0d, 0x00, 0x20, 0x00, + 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, + 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x21, 0x02, 0x20, 0x00, 0x2d, + 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x01, 0x20, 0x00, 0x41, 0x01, 0x6a, + 0x21, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x20, + 0x02, 0x41, 0xff, 0x01, 0x71, 0x46, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x03, + 0x20, 0x02, 0x41, 0xff, 0x01, 0x71, 0x6b, 0x0b, 0x0c, 0x00, 0x20, 0x00, + 0x41, 0x00, 0x10, 0x9b, 0x80, 0x80, 0x80, 0x00, 0x0b, 0xbc, 0x02, 0x01, + 0x06, 0x7f, 0x02, 0x40, 0x20, 0x00, 0x41, 0xff, 0xff, 0x07, 0x4b, 0x0d, + 0x00, 0x20, 0x00, 0x20, 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, 0x02, 0x41, + 0x03, 0x6e, 0x22, 0x03, 0x41, 0x03, 0x6c, 0x6b, 0x41, 0xff, 0x01, 0x71, + 0x41, 0x02, 0x74, 0x41, 0xc0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, + 0x00, 0x20, 0x00, 0x41, 0x08, 0x76, 0x22, 0x04, 0x41, 0xa0, 0xa9, 0x84, + 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0xd6, 0x00, 0x6c, 0x20, 0x03, + 0x6a, 0x41, 0xa0, 0xa9, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x6c, + 0x41, 0x0b, 0x76, 0x41, 0x06, 0x70, 0x20, 0x04, 0x41, 0x90, 0xbe, 0x84, + 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x6a, 0x41, 0x02, 0x74, 0x41, 0xd0, + 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, 0x41, 0x08, + 0x75, 0x21, 0x04, 0x02, 0x40, 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x22, + 0x03, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, 0x04, 0x41, 0x00, 0x20, 0x03, + 0x20, 0x01, 0x73, 0x6b, 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, + 0x41, 0xff, 0x01, 0x71, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x04, 0x41, + 0x08, 0x76, 0x21, 0x04, 0x03, 0x40, 0x02, 0x40, 0x20, 0x02, 0x20, 0x03, + 0x41, 0x01, 0x76, 0x22, 0x05, 0x20, 0x04, 0x6a, 0x22, 0x06, 0x41, 0x01, + 0x74, 0x41, 0x90, 0xa6, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x22, + 0x07, 0x47, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x06, 0x41, 0x01, 0x74, 0x41, + 0x91, 0xa6, 0x84, 0x80, 0x00, 0x6a, 0x2d, 0x00, 0x00, 0x41, 0x02, 0x74, + 0x41, 0xd0, 0x9e, 0x84, 0x80, 0x00, 0x6a, 0x28, 0x02, 0x00, 0x22, 0x03, + 0x41, 0xff, 0x01, 0x71, 0x22, 0x04, 0x41, 0x01, 0x4b, 0x0d, 0x00, 0x20, + 0x03, 0x41, 0x08, 0x75, 0x41, 0x00, 0x20, 0x04, 0x20, 0x01, 0x73, 0x6b, + 0x71, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x41, 0x7f, 0x41, 0x01, 0x20, 0x01, + 0x1b, 0x20, 0x00, 0x6a, 0x0f, 0x0b, 0x20, 0x04, 0x20, 0x06, 0x20, 0x02, + 0x20, 0x07, 0x49, 0x22, 0x07, 0x1b, 0x21, 0x04, 0x20, 0x05, 0x20, 0x03, + 0x20, 0x05, 0x6b, 0x20, 0x07, 0x1b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x0b, 0x0c, 0x00, 0x20, 0x00, 0x41, 0x01, 0x10, 0x9b, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x7b, 0x01, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, + 0x0d, 0x00, 0x41, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, + 0x2d, 0x00, 0x00, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x01, + 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x03, 0x40, + 0x20, 0x03, 0x41, 0xff, 0x01, 0x71, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, + 0x04, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x41, + 0x00, 0x46, 0x0d, 0x02, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x02, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x00, 0x2d, 0x00, 0x00, 0x21, + 0x03, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x00, 0x20, 0x03, 0x0d, 0x00, + 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x03, 0x0b, 0x20, 0x03, 0x41, 0xff, 0x01, + 0x71, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x6b, 0x0b, 0x0d, 0x00, 0x20, 0x00, + 0x10, 0x9a, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x47, 0x0b, 0xbf, 0x09, + 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x20, 0x02, 0x41, + 0x21, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x46, 0x0d, 0x02, 0x20, + 0x01, 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x6b, 0x41, 0x00, 0x20, + 0x02, 0x41, 0x01, 0x74, 0x6b, 0x4b, 0x0d, 0x01, 0x0b, 0x20, 0x00, 0x20, + 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x01, + 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x00, 0x20, 0x01, 0x4f, 0x0d, 0x00, 0x02, 0x40, 0x20, + 0x04, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, + 0x0c, 0x03, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x71, 0x0d, 0x00, + 0x20, 0x02, 0x21, 0x05, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x02, 0x0b, 0x20, + 0x02, 0x45, 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, + 0x00, 0x41, 0x01, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, + 0x0d, 0x03, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, + 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, + 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, + 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, + 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, + 0x41, 0x7d, 0x6a, 0x21, 0x05, 0x02, 0x40, 0x20, 0x00, 0x41, 0x03, 0x6a, + 0x22, 0x03, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x03, 0x6a, + 0x21, 0x01, 0x0c, 0x02, 0x0b, 0x20, 0x05, 0x45, 0x0d, 0x03, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x00, 0x41, 0x04, + 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, + 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, 0x04, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, + 0x20, 0x02, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7f, 0x6a, + 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, + 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, + 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, 0x03, 0x6a, 0x22, + 0x04, 0x20, 0x01, 0x20, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x02, 0x40, 0x20, 0x04, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, - 0x02, 0x41, 0x03, 0x6b, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, - 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x41, 0x03, - 0x71, 0x45, 0x04, 0x40, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, - 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, - 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x02, 0x41, - 0x04, 0x6b, 0x22, 0x04, 0x41, 0x0c, 0x71, 0x41, 0x0c, 0x47, 0x04, 0x40, - 0x20, 0x04, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x03, 0x71, 0x21, - 0x03, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x05, 0x20, 0x00, 0x41, 0x04, - 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x6a, 0x20, 0x02, - 0x20, 0x05, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, - 0x04, 0x6b, 0x21, 0x02, 0x20, 0x03, 0x41, 0x01, 0x6b, 0x22, 0x03, 0x0d, - 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, 0x0c, 0x49, 0x0d, 0x00, 0x20, 0x01, - 0x41, 0x10, 0x6b, 0x21, 0x05, 0x20, 0x00, 0x41, 0x10, 0x6b, 0x21, 0x06, - 0x03, 0x40, 0x20, 0x02, 0x20, 0x06, 0x6a, 0x22, 0x03, 0x41, 0x0c, 0x6a, - 0x20, 0x02, 0x20, 0x05, 0x6a, 0x22, 0x04, 0x41, 0x0c, 0x6a, 0x28, 0x02, - 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x04, 0x41, - 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, - 0x6a, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, - 0x20, 0x03, 0x20, 0x04, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x02, - 0x41, 0x10, 0x6b, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, - 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, 0x02, 0x22, 0x03, 0x41, 0x03, 0x71, - 0x22, 0x05, 0x04, 0x40, 0x20, 0x01, 0x41, 0x01, 0x6b, 0x21, 0x04, 0x20, - 0x00, 0x41, 0x01, 0x6b, 0x21, 0x06, 0x03, 0x40, 0x20, 0x03, 0x20, 0x06, - 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x01, 0x6b, 0x21, 0x03, 0x20, 0x05, 0x41, 0x01, 0x6b, - 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, - 0x02, 0x20, 0x01, 0x41, 0x04, 0x6b, 0x21, 0x04, 0x20, 0x00, 0x41, 0x04, - 0x6b, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, 0x20, 0x05, 0x6a, 0x22, 0x01, - 0x41, 0x03, 0x6a, 0x20, 0x03, 0x20, 0x04, 0x6a, 0x22, 0x02, 0x41, 0x03, - 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x02, 0x6a, - 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, - 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x03, 0x41, 0x04, 0x6b, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0c, - 0x02, 0x0b, 0x20, 0x04, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x41, - 0x04, 0x6b, 0x22, 0x05, 0x41, 0x1c, 0x71, 0x41, 0x1c, 0x47, 0x04, 0x40, - 0x20, 0x04, 0x20, 0x05, 0x41, 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x07, - 0x71, 0x22, 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x04, 0x03, 0x40, 0x20, - 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, - 0x04, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, - 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, - 0x41, 0x1c, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, - 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, - 0x41, 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, - 0x08, 0x6a, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x01, 0x41, 0x0c, 0x6a, 0x28, - 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x20, 0x01, - 0x41, 0x10, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, - 0x14, 0x6a, 0x20, 0x01, 0x41, 0x14, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, - 0x00, 0x20, 0x03, 0x41, 0x18, 0x6a, 0x20, 0x01, 0x41, 0x18, 0x6a, 0x28, - 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x1c, 0x6a, 0x20, 0x01, - 0x41, 0x1c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, - 0x20, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, - 0x04, 0x41, 0x20, 0x6b, 0x22, 0x04, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, - 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x00, 0x02, 0x40, 0x20, 0x04, 0x41, 0x07, - 0x71, 0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x04, 0x21, 0x05, 0x0c, 0x01, - 0x0b, 0x20, 0x04, 0x41, 0x78, 0x71, 0x21, 0x05, 0x03, 0x40, 0x20, 0x03, - 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, - 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, - 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x04, 0x41, - 0x08, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, - 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x02, - 0x6a, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x03, 0x6a, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x01, 0x41, - 0x04, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x05, - 0x6a, 0x20, 0x01, 0x41, 0x05, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, - 0x20, 0x03, 0x41, 0x06, 0x6a, 0x20, 0x01, 0x41, 0x06, 0x6a, 0x2d, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x20, 0x01, 0x41, - 0x07, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x08, - 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x20, 0x05, - 0x41, 0x08, 0x6b, 0x22, 0x05, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0f, - 0x0b, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, - 0x00, 0x0b, 0x94, 0x03, 0x02, 0x03, 0x7f, 0x01, 0x7e, 0x02, 0x40, 0x20, - 0x02, 0x41, 0x21, 0x4f, 0x04, 0x40, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x20, - 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0b, 0x00, 0x20, 0x00, 0x0f, 0x0b, - 0x20, 0x02, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, - 0x20, 0x00, 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x01, 0x6b, 0x20, 0x01, - 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x03, 0x49, 0x0d, 0x00, 0x20, 0x00, - 0x20, 0x01, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x01, - 0x20, 0x03, 0x41, 0x03, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x03, - 0x41, 0x02, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x07, - 0x49, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x03, 0x20, 0x03, - 0x41, 0x04, 0x6b, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x02, 0x41, 0x09, - 0x49, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x6b, 0x41, 0x03, - 0x71, 0x22, 0x05, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x41, 0xff, 0x01, 0x71, - 0x41, 0x81, 0x82, 0x84, 0x08, 0x6c, 0x22, 0x03, 0x36, 0x02, 0x00, 0x20, - 0x04, 0x20, 0x02, 0x20, 0x05, 0x6b, 0x41, 0x3c, 0x71, 0x22, 0x02, 0x6a, - 0x22, 0x01, 0x41, 0x04, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, - 0x41, 0x09, 0x49, 0x0d, 0x00, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x08, - 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x04, 0x20, 0x01, 0x41, 0x08, 0x6b, - 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x6b, 0x20, 0x03, - 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x19, 0x49, 0x0d, 0x00, 0x20, 0x04, - 0x20, 0x03, 0x36, 0x02, 0x18, 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x14, - 0x20, 0x04, 0x20, 0x03, 0x36, 0x02, 0x10, 0x20, 0x04, 0x20, 0x03, 0x36, - 0x02, 0x0c, 0x20, 0x01, 0x41, 0x10, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, - 0x20, 0x01, 0x41, 0x14, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, - 0x41, 0x18, 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x01, 0x41, 0x1c, - 0x6b, 0x20, 0x03, 0x36, 0x02, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x04, - 0x71, 0x41, 0x18, 0x72, 0x22, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x20, 0x49, - 0x0d, 0x00, 0x20, 0x03, 0xad, 0x42, 0x81, 0x80, 0x80, 0x80, 0x10, 0x7e, - 0x21, 0x06, 0x20, 0x02, 0x20, 0x04, 0x6a, 0x21, 0x02, 0x03, 0x40, 0x20, - 0x02, 0x20, 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x18, 0x6a, 0x20, - 0x06, 0x37, 0x03, 0x00, 0x20, 0x02, 0x41, 0x10, 0x6a, 0x20, 0x06, 0x37, - 0x03, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x20, 0x06, 0x37, 0x03, 0x00, - 0x20, 0x02, 0x41, 0x20, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x20, 0x6b, - 0x22, 0x01, 0x41, 0x1f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, - 0x09, 0x00, 0x20, 0x00, 0x10, 0x13, 0x20, 0x00, 0x47, 0x0b, 0xd5, 0x07, - 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x02, 0x40, 0x20, 0x02, 0x41, - 0x20, 0x4d, 0x04, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, - 0x45, 0x72, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, - 0x00, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x20, 0x01, 0x41, 0x01, 0x6a, - 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, - 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, 0x2d, 0x00, - 0x01, 0x3a, 0x00, 0x01, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x20, 0x01, 0x41, - 0x02, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, 0x41, 0x02, - 0x6b, 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, 0x20, 0x01, - 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x20, - 0x01, 0x41, 0x03, 0x6a, 0x22, 0x03, 0x41, 0x03, 0x71, 0x45, 0x20, 0x02, - 0x41, 0x03, 0x6b, 0x22, 0x05, 0x45, 0x72, 0x0d, 0x02, 0x1a, 0x20, 0x00, - 0x20, 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x02, 0x41, 0x04, - 0x6b, 0x21, 0x05, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x00, - 0x41, 0x04, 0x6a, 0x0c, 0x02, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x02, 0x20, - 0x00, 0x20, 0x01, 0x20, 0x02, 0xfc, 0x0a, 0x00, 0x00, 0x20, 0x00, 0x0f, - 0x0b, 0x20, 0x02, 0x21, 0x05, 0x20, 0x01, 0x21, 0x03, 0x20, 0x00, 0x0b, - 0x22, 0x04, 0x41, 0x03, 0x71, 0x22, 0x02, 0x45, 0x04, 0x40, 0x02, 0x40, - 0x20, 0x05, 0x41, 0x10, 0x49, 0x04, 0x40, 0x20, 0x05, 0x21, 0x02, 0x0c, - 0x01, 0x0b, 0x20, 0x05, 0x41, 0x10, 0x6b, 0x22, 0x02, 0x41, 0x10, 0x71, - 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, 0x02, - 0x00, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x08, 0x37, 0x02, 0x08, 0x20, - 0x04, 0x41, 0x10, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, - 0x03, 0x20, 0x02, 0x21, 0x05, 0x0b, 0x20, 0x02, 0x41, 0x10, 0x49, 0x0d, - 0x00, 0x20, 0x05, 0x21, 0x02, 0x03, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, - 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x20, 0x03, - 0x41, 0x08, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, - 0x10, 0x6a, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x29, 0x02, 0x00, 0x37, 0x02, - 0x00, 0x20, 0x04, 0x41, 0x18, 0x6a, 0x20, 0x03, 0x41, 0x18, 0x6a, 0x29, - 0x02, 0x00, 0x37, 0x02, 0x00, 0x20, 0x04, 0x41, 0x20, 0x6a, 0x21, 0x04, - 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x20, 0x6b, - 0x22, 0x02, 0x41, 0x0f, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x41, - 0x08, 0x4f, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, 0x29, 0x02, 0x00, 0x37, - 0x02, 0x00, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, - 0x08, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x71, 0x04, 0x40, - 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x04, - 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, - 0x0b, 0x20, 0x02, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x04, 0x20, 0x03, - 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x04, 0x41, 0x02, 0x6a, 0x21, - 0x04, 0x20, 0x03, 0x41, 0x02, 0x6a, 0x21, 0x03, 0x0b, 0x20, 0x02, 0x41, - 0x01, 0x71, 0x45, 0x0d, 0x01, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x02, 0x40, 0x02, - 0x7f, 0x02, 0x40, 0x20, 0x05, 0x41, 0x20, 0x4f, 0x04, 0x40, 0x20, 0x04, - 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x02, 0x40, - 0x02, 0x40, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x0e, 0x02, 0x00, 0x01, 0x03, - 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, 0x00, 0x01, 0x20, - 0x04, 0x20, 0x03, 0x41, 0x06, 0x6a, 0x29, 0x01, 0x00, 0x37, 0x02, 0x06, - 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x10, 0x74, 0x20, 0x01, - 0x41, 0x10, 0x76, 0x72, 0x36, 0x02, 0x02, 0x20, 0x03, 0x41, 0x12, 0x6a, - 0x21, 0x01, 0x41, 0x0e, 0x21, 0x06, 0x20, 0x03, 0x41, 0x0e, 0x6a, 0x28, - 0x01, 0x00, 0x21, 0x03, 0x41, 0x0e, 0x21, 0x05, 0x20, 0x04, 0x41, 0x12, - 0x6a, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x41, 0x05, 0x6a, 0x29, - 0x00, 0x00, 0x37, 0x02, 0x05, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, - 0x41, 0x18, 0x74, 0x20, 0x01, 0x41, 0x08, 0x76, 0x72, 0x36, 0x02, 0x01, - 0x20, 0x03, 0x41, 0x11, 0x6a, 0x21, 0x01, 0x41, 0x0d, 0x21, 0x06, 0x20, - 0x03, 0x41, 0x0d, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0f, 0x21, - 0x05, 0x20, 0x04, 0x41, 0x11, 0x6a, 0x0c, 0x02, 0x0b, 0x02, 0x7f, 0x20, - 0x05, 0x41, 0x10, 0x49, 0x04, 0x40, 0x20, 0x04, 0x21, 0x02, 0x20, 0x03, - 0x0c, 0x01, 0x0b, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x3a, 0x00, - 0x00, 0x20, 0x04, 0x20, 0x03, 0x28, 0x00, 0x01, 0x36, 0x00, 0x01, 0x20, - 0x04, 0x20, 0x03, 0x29, 0x00, 0x05, 0x37, 0x00, 0x05, 0x20, 0x04, 0x20, - 0x03, 0x2f, 0x00, 0x0d, 0x3b, 0x00, 0x0d, 0x20, 0x04, 0x20, 0x03, 0x2d, - 0x00, 0x0f, 0x3a, 0x00, 0x0f, 0x20, 0x04, 0x41, 0x10, 0x6a, 0x21, 0x02, - 0x20, 0x03, 0x41, 0x10, 0x6a, 0x0b, 0x21, 0x01, 0x20, 0x05, 0x41, 0x08, - 0x71, 0x0d, 0x02, 0x0c, 0x03, 0x0b, 0x20, 0x04, 0x20, 0x01, 0x41, 0x10, - 0x76, 0x3a, 0x00, 0x02, 0x20, 0x04, 0x20, 0x01, 0x41, 0x08, 0x76, 0x3a, - 0x00, 0x01, 0x20, 0x04, 0x20, 0x03, 0x41, 0x07, 0x6a, 0x29, 0x00, 0x00, - 0x37, 0x02, 0x07, 0x20, 0x04, 0x20, 0x03, 0x28, 0x02, 0x04, 0x41, 0x08, - 0x74, 0x20, 0x01, 0x41, 0x18, 0x76, 0x72, 0x36, 0x02, 0x03, 0x20, 0x03, - 0x41, 0x13, 0x6a, 0x21, 0x01, 0x41, 0x0f, 0x21, 0x06, 0x20, 0x03, 0x41, - 0x0f, 0x6a, 0x28, 0x00, 0x00, 0x21, 0x03, 0x41, 0x0d, 0x21, 0x05, 0x20, - 0x04, 0x41, 0x13, 0x6a, 0x0b, 0x21, 0x02, 0x20, 0x04, 0x20, 0x06, 0x6a, - 0x20, 0x03, 0x36, 0x02, 0x00, 0x0b, 0x20, 0x02, 0x20, 0x01, 0x29, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x20, 0x02, 0x41, 0x08, 0x6a, 0x21, 0x02, 0x20, - 0x01, 0x41, 0x08, 0x6a, 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x71, - 0x04, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x00, 0x00, 0x36, 0x00, 0x00, - 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, - 0x21, 0x01, 0x0b, 0x20, 0x05, 0x41, 0x02, 0x71, 0x04, 0x40, 0x20, 0x02, - 0x20, 0x01, 0x2f, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x20, 0x02, 0x41, 0x02, - 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0b, 0x20, - 0x05, 0x41, 0x01, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x02, 0x20, 0x01, 0x2d, - 0x00, 0x00, 0x3a, 0x00, 0x00, 0x0b, 0x20, 0x00, 0x0b, 0x0d, 0x00, 0x20, - 0x00, 0x41, 0x20, 0x46, 0x20, 0x00, 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, - 0x00, 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x0b, 0x49, 0x01, - 0x02, 0x7f, 0x20, 0x00, 0x10, 0x0c, 0x20, 0x00, 0x6a, 0x21, 0x03, 0x02, - 0x40, 0x20, 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, - 0x00, 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, - 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, - 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, 0x00, - 0x0b, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, - 0xeb, 0x03, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, - 0x40, 0x20, 0x00, 0x20, 0x01, 0x22, 0x03, 0x73, 0x41, 0x03, 0x71, 0x04, - 0x40, 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, - 0x47, 0x21, 0x06, 0x02, 0x40, 0x20, 0x03, 0x41, 0x03, 0x71, 0x45, 0x04, - 0x40, 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x45, 0x04, - 0x40, 0x20, 0x00, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x03, - 0x2d, 0x00, 0x00, 0x22, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x45, 0x04, - 0x40, 0x20, 0x00, 0x21, 0x04, 0x20, 0x02, 0x21, 0x01, 0x0c, 0x05, 0x0b, - 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x01, 0x6b, - 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x01, 0x6a, - 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, - 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, - 0x00, 0x20, 0x05, 0x45, 0x0d, 0x05, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x21, - 0x04, 0x20, 0x02, 0x41, 0x02, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, - 0x06, 0x20, 0x03, 0x41, 0x02, 0x6a, 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, - 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, - 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x06, - 0x20, 0x00, 0x41, 0x03, 0x6a, 0x21, 0x04, 0x20, 0x02, 0x41, 0x03, 0x6b, - 0x22, 0x01, 0x41, 0x00, 0x47, 0x21, 0x06, 0x20, 0x03, 0x41, 0x03, 0x6a, - 0x22, 0x05, 0x41, 0x03, 0x71, 0x45, 0x20, 0x01, 0x45, 0x72, 0x45, 0x04, - 0x40, 0x20, 0x04, 0x20, 0x05, 0x2d, 0x00, 0x00, 0x22, 0x05, 0x3a, 0x00, - 0x00, 0x20, 0x05, 0x45, 0x0d, 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, - 0x04, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, - 0x6b, 0x22, 0x02, 0x41, 0x00, 0x47, 0x21, 0x06, 0x0c, 0x03, 0x0b, 0x20, - 0x05, 0x21, 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x05, - 0x21, 0x03, 0x20, 0x01, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x05, 0x21, - 0x03, 0x20, 0x01, 0x21, 0x02, 0x0b, 0x20, 0x06, 0x45, 0x0d, 0x02, 0x20, - 0x03, 0x2d, 0x00, 0x00, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, - 0x04, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x41, - 0x80, 0x82, 0x84, 0x08, 0x20, 0x03, 0x28, 0x02, 0x00, 0x22, 0x01, 0x6b, - 0x20, 0x01, 0x72, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x41, 0x80, - 0x81, 0x82, 0x84, 0x78, 0x47, 0x0d, 0x02, 0x20, 0x04, 0x20, 0x01, 0x36, - 0x02, 0x00, 0x20, 0x04, 0x41, 0x04, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, - 0x04, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x04, 0x6b, 0x22, 0x02, 0x41, - 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, - 0x03, 0x40, 0x20, 0x04, 0x20, 0x03, 0x2d, 0x00, 0x00, 0x22, 0x01, 0x3a, - 0x00, 0x00, 0x20, 0x01, 0x45, 0x04, 0x40, 0x20, 0x02, 0x21, 0x01, 0x0c, - 0x03, 0x0b, 0x20, 0x04, 0x41, 0x01, 0x6a, 0x21, 0x04, 0x20, 0x03, 0x41, - 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x01, 0x6b, 0x22, 0x02, 0x0d, - 0x00, 0x0b, 0x0b, 0x41, 0x00, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x04, 0x40, - 0x20, 0x04, 0x41, 0x00, 0x20, 0x01, 0xfc, 0x0b, 0x00, 0x0b, 0x20, 0x00, - 0x0b, 0x17, 0x00, 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, 0x49, 0x20, - 0x00, 0x41, 0x20, 0x72, 0x41, 0xe1, 0x00, 0x6b, 0x41, 0x06, 0x49, 0x72, - 0x0b, 0x67, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x45, 0x04, 0x40, 0x41, 0x00, - 0x0f, 0x0b, 0x02, 0x7f, 0x20, 0x00, 0x04, 0x40, 0x41, 0x8c, 0xc2, 0x04, - 0x21, 0x01, 0x03, 0x40, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x01, 0x28, - 0x02, 0x00, 0x22, 0x02, 0x41, 0x00, 0x20, 0x00, 0x20, 0x02, 0x47, 0x1b, - 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0c, 0x01, - 0x0b, 0x41, 0x00, 0x21, 0x00, 0x03, 0x40, 0x20, 0x00, 0x41, 0x90, 0xc2, - 0x04, 0x6a, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x00, 0x28, 0x02, 0x00, - 0x0d, 0x00, 0x0b, 0x20, 0x00, 0x41, 0x04, 0x6b, 0x41, 0x7c, 0x71, 0x41, - 0x90, 0xc2, 0x04, 0x6a, 0x0b, 0x41, 0x00, 0x47, 0x0b, 0x1d, 0x01, 0x01, - 0x7f, 0x41, 0x01, 0x21, 0x01, 0x20, 0x00, 0x41, 0x30, 0x6b, 0x41, 0x0a, - 0x4f, 0x04, 0x7f, 0x20, 0x00, 0x10, 0x0d, 0x41, 0x00, 0x47, 0x05, 0x20, - 0x01, 0x0b, 0x0b, 0x0b, 0xfc, 0x42, 0x02, 0x00, 0x41, 0x80, 0x80, 0x04, - 0x0b, 0xe8, 0x42, 0x12, 0x11, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, - 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, - 0x11, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, - 0x2f, 0x10, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, - 0x32, 0x33, 0x10, 0x34, 0x35, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x03, 0x6a, 0x22, 0x04, 0x20, 0x01, 0x20, + 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x04, + 0x41, 0x03, 0x71, 0x0d, 0x00, 0x20, 0x03, 0x21, 0x02, 0x0c, 0x01, 0x0b, + 0x20, 0x03, 0x45, 0x0d, 0x04, 0x20, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, + 0x22, 0x02, 0x6a, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x2d, 0x00, 0x00, 0x3a, + 0x00, 0x00, 0x0b, 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x02, 0x40, + 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x06, 0x41, 0x02, 0x76, 0x41, 0x01, + 0x6a, 0x41, 0x03, 0x71, 0x22, 0x03, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x41, + 0x7c, 0x6a, 0x21, 0x04, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, + 0x40, 0x20, 0x05, 0x20, 0x02, 0x6a, 0x20, 0x04, 0x20, 0x02, 0x6a, 0x28, + 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x21, 0x02, + 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x06, 0x41, 0x0c, 0x49, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x70, 0x6a, 0x21, + 0x05, 0x20, 0x00, 0x41, 0x70, 0x6a, 0x21, 0x06, 0x03, 0x40, 0x20, 0x06, + 0x20, 0x02, 0x6a, 0x22, 0x03, 0x41, 0x0c, 0x6a, 0x20, 0x05, 0x20, 0x02, + 0x6a, 0x22, 0x04, 0x41, 0x0c, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, + 0x20, 0x03, 0x41, 0x08, 0x6a, 0x20, 0x04, 0x41, 0x08, 0x6a, 0x28, 0x02, + 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x20, 0x04, 0x41, + 0x04, 0x6a, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x04, + 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x02, 0x41, 0x70, 0x6a, 0x22, + 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x45, 0x0d, + 0x02, 0x20, 0x02, 0x21, 0x03, 0x02, 0x40, 0x20, 0x02, 0x41, 0x03, 0x71, + 0x22, 0x04, 0x45, 0x0d, 0x00, 0x20, 0x01, 0x41, 0x7f, 0x6a, 0x21, 0x05, + 0x20, 0x00, 0x41, 0x7f, 0x6a, 0x21, 0x06, 0x20, 0x02, 0x21, 0x03, 0x03, + 0x40, 0x20, 0x06, 0x20, 0x03, 0x6a, 0x20, 0x05, 0x20, 0x03, 0x6a, 0x2d, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x7f, 0x6a, 0x21, 0x03, + 0x20, 0x04, 0x41, 0x7f, 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, 0x20, + 0x02, 0x41, 0x04, 0x49, 0x0d, 0x02, 0x20, 0x01, 0x41, 0x7c, 0x6a, 0x21, + 0x04, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x05, 0x03, 0x40, 0x20, 0x05, + 0x20, 0x03, 0x6a, 0x22, 0x01, 0x41, 0x03, 0x6a, 0x20, 0x04, 0x20, 0x03, + 0x6a, 0x22, 0x02, 0x41, 0x03, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, + 0x20, 0x01, 0x41, 0x02, 0x6a, 0x20, 0x02, 0x41, 0x02, 0x6a, 0x2d, 0x00, + 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x20, 0x02, 0x41, + 0x01, 0x6a, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x20, 0x02, + 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, + 0x03, 0x0d, 0x00, 0x0c, 0x03, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x04, 0x49, + 0x0d, 0x00, 0x02, 0x40, 0x20, 0x05, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x41, + 0x02, 0x76, 0x41, 0x01, 0x6a, 0x41, 0x07, 0x71, 0x22, 0x02, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x20, 0x02, 0x41, 0x02, 0x74, 0x6b, 0x21, 0x05, 0x03, + 0x40, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, + 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x03, 0x41, 0x04, 0x6a, 0x21, + 0x03, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x04, 0x41, 0x1c, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x04, 0x36, 0x02, 0x04, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x08, + 0x36, 0x02, 0x08, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, + 0x0c, 0x20, 0x03, 0x20, 0x01, 0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, + 0x03, 0x20, 0x01, 0x28, 0x02, 0x14, 0x36, 0x02, 0x14, 0x20, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x18, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x1c, 0x36, 0x02, 0x1c, 0x20, 0x01, 0x41, 0x20, 0x6a, 0x21, 0x01, + 0x20, 0x03, 0x41, 0x20, 0x6a, 0x21, 0x03, 0x20, 0x05, 0x41, 0x60, 0x6a, + 0x22, 0x05, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x45, + 0x0d, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x05, 0x41, 0x07, 0x71, 0x22, + 0x02, 0x0d, 0x00, 0x20, 0x05, 0x21, 0x04, 0x0c, 0x01, 0x0b, 0x20, 0x05, + 0x41, 0x78, 0x71, 0x21, 0x04, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, + 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, + 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x05, 0x41, 0x08, 0x49, 0x0d, + 0x00, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, + 0x03, 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x03, 0x20, + 0x01, 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x03, 0x20, 0x01, 0x2d, + 0x00, 0x04, 0x3a, 0x00, 0x04, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x05, + 0x3a, 0x00, 0x05, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x06, 0x3a, 0x00, + 0x06, 0x20, 0x03, 0x20, 0x01, 0x2d, 0x00, 0x07, 0x3a, 0x00, 0x07, 0x20, + 0x03, 0x41, 0x08, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x08, 0x6a, 0x21, + 0x01, 0x20, 0x04, 0x41, 0x78, 0x6a, 0x22, 0x04, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x00, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x9c, 0x80, 0x80, 0x80, + 0x00, 0x20, 0x00, 0x47, 0x0b, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x20, 0x46, + 0x20, 0x00, 0x41, 0x09, 0x46, 0x72, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x10, + 0xa1, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x0a, 0x00, 0x20, 0x00, 0x41, 0x50, + 0x6a, 0x41, 0x0a, 0x49, 0x0b, 0x4d, 0x01, 0x02, 0x7f, 0x20, 0x00, 0x20, + 0x00, 0x10, 0x95, 0x80, 0x80, 0x80, 0x00, 0x6a, 0x21, 0x03, 0x02, 0x40, + 0x20, 0x02, 0x45, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x00, + 0x22, 0x04, 0x45, 0x0d, 0x01, 0x20, 0x03, 0x20, 0x04, 0x3a, 0x00, 0x00, + 0x20, 0x03, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, + 0x21, 0x01, 0x20, 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, + 0x0b, 0x20, 0x03, 0x41, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x0b, 0xef, + 0x03, 0x01, 0x04, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x20, 0x01, 0x20, 0x00, 0x73, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x41, 0x00, + 0x47, 0x21, 0x04, 0x02, 0x40, 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x71, + 0x0d, 0x00, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x02, 0x40, 0x20, + 0x02, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x03, 0x0c, 0x01, 0x0b, 0x20, 0x00, + 0x20, 0x01, 0x2d, 0x00, 0x00, 0x22, 0x03, 0x3a, 0x00, 0x00, 0x02, 0x40, + 0x20, 0x03, 0x0d, 0x00, 0x20, 0x00, 0x21, 0x03, 0x20, 0x02, 0x21, 0x05, + 0x0c, 0x05, 0x0b, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x21, 0x03, 0x20, 0x02, + 0x41, 0x7f, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, + 0x20, 0x01, 0x41, 0x01, 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, + 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, + 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x05, 0x20, + 0x00, 0x41, 0x02, 0x6a, 0x21, 0x03, 0x20, 0x02, 0x41, 0x7e, 0x6a, 0x22, + 0x05, 0x41, 0x00, 0x47, 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x02, + 0x6a, 0x22, 0x06, 0x41, 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, + 0x0d, 0x00, 0x20, 0x03, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, + 0x00, 0x00, 0x20, 0x04, 0x45, 0x0d, 0x06, 0x20, 0x00, 0x41, 0x03, 0x6a, + 0x21, 0x03, 0x20, 0x02, 0x41, 0x7d, 0x6a, 0x22, 0x05, 0x41, 0x00, 0x47, + 0x21, 0x04, 0x02, 0x40, 0x20, 0x01, 0x41, 0x03, 0x6a, 0x22, 0x06, 0x41, + 0x03, 0x71, 0x45, 0x0d, 0x00, 0x20, 0x05, 0x45, 0x0d, 0x00, 0x20, 0x03, + 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x04, 0x3a, 0x00, 0x00, 0x20, 0x04, + 0x45, 0x0d, 0x07, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x21, 0x03, 0x20, 0x01, + 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x7c, 0x6a, 0x22, 0x02, + 0x41, 0x00, 0x47, 0x21, 0x04, 0x0c, 0x03, 0x0b, 0x20, 0x06, 0x21, 0x01, + 0x20, 0x05, 0x21, 0x02, 0x0c, 0x02, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, + 0x05, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x06, 0x21, 0x01, 0x20, 0x05, + 0x21, 0x02, 0x0b, 0x20, 0x04, 0x45, 0x0d, 0x02, 0x02, 0x40, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x04, 0x0b, + 0x20, 0x02, 0x41, 0x04, 0x49, 0x0d, 0x00, 0x03, 0x40, 0x20, 0x01, 0x28, + 0x02, 0x00, 0x22, 0x00, 0x41, 0x7f, 0x73, 0x20, 0x00, 0x41, 0xff, 0xfd, + 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84, 0x78, 0x71, 0x0d, + 0x02, 0x20, 0x03, 0x20, 0x00, 0x36, 0x02, 0x00, 0x20, 0x03, 0x41, 0x04, + 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, + 0x41, 0x7c, 0x6a, 0x22, 0x02, 0x41, 0x03, 0x4b, 0x0d, 0x00, 0x0b, 0x0b, + 0x20, 0x02, 0x45, 0x0d, 0x01, 0x0b, 0x03, 0x40, 0x20, 0x03, 0x20, 0x01, + 0x2d, 0x00, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x00, 0x02, 0x40, 0x20, 0x00, + 0x0d, 0x00, 0x20, 0x02, 0x21, 0x05, 0x0c, 0x03, 0x0b, 0x20, 0x03, 0x41, + 0x01, 0x6a, 0x21, 0x03, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, + 0x02, 0x41, 0x7f, 0x6a, 0x22, 0x02, 0x0d, 0x00, 0x0b, 0x0b, 0x41, 0x00, + 0x21, 0x05, 0x0b, 0x20, 0x03, 0x41, 0x00, 0x20, 0x05, 0x10, 0x94, 0x80, + 0x80, 0x80, 0x00, 0x0b, 0x11, 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, + 0x10, 0xa5, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x20, 0x00, 0x0b, 0x17, 0x00, + 0x20, 0x00, 0x41, 0x50, 0x6a, 0x41, 0x0a, 0x49, 0x20, 0x00, 0x41, 0x20, + 0x72, 0x41, 0x9f, 0x7f, 0x6a, 0x41, 0x06, 0x49, 0x72, 0x0b, 0x2a, 0x01, + 0x03, 0x7f, 0x41, 0x00, 0x21, 0x01, 0x03, 0x40, 0x20, 0x00, 0x20, 0x01, + 0x6a, 0x21, 0x02, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x22, 0x03, 0x21, 0x01, + 0x20, 0x02, 0x28, 0x02, 0x00, 0x0d, 0x00, 0x0b, 0x20, 0x03, 0x41, 0x7c, + 0x6a, 0x41, 0x02, 0x75, 0x0b, 0x45, 0x01, 0x01, 0x7f, 0x02, 0x40, 0x20, + 0x01, 0x45, 0x0d, 0x00, 0x20, 0x00, 0x41, 0x7c, 0x6a, 0x21, 0x00, 0x02, + 0x40, 0x03, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6a, 0x22, 0x00, 0x28, 0x02, + 0x00, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02, 0x20, 0x01, 0x47, 0x0d, + 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x41, 0x00, 0x20, 0x02, 0x1b, 0x0f, 0x0b, + 0x20, 0x00, 0x20, 0x00, 0x10, 0xa8, 0x80, 0x80, 0x80, 0x00, 0x41, 0x02, + 0x74, 0x6a, 0x0b, 0x1d, 0x00, 0x02, 0x40, 0x20, 0x00, 0x0d, 0x00, 0x41, + 0x00, 0x0f, 0x0b, 0x41, 0x90, 0xc2, 0x84, 0x80, 0x00, 0x20, 0x00, 0x10, + 0xa9, 0x80, 0x80, 0x80, 0x00, 0x41, 0x00, 0x47, 0x0b, 0x24, 0x01, 0x01, + 0x7f, 0x41, 0x01, 0x21, 0x01, 0x02, 0x40, 0x20, 0x00, 0x41, 0x50, 0x6a, + 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x96, 0x80, 0x80, 0x80, + 0x00, 0x41, 0x00, 0x47, 0x21, 0x01, 0x0b, 0x20, 0x01, 0x0b, 0x0b, 0xf1, + 0x42, 0x01, 0x00, 0x41, 0x80, 0x80, 0x04, 0x0b, 0xe8, 0x42, 0x12, 0x11, + 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, + 0x1f, 0x20, 0x21, 0x11, 0x22, 0x23, 0x24, 0x11, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x11, 0x2d, 0x2e, 0x2f, 0x10, 0x10, 0x30, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x31, 0x32, 0x33, 0x10, 0x34, 0x35, + 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x36, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, - 0x11, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x37, 0x11, 0x11, 0x11, 0x11, 0x38, 0x11, 0x39, 0x3a, 0x3b, 0x3c, + 0x3d, 0x3e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x11, 0x40, 0x41, 0x11, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x11, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, - 0x5f, 0x60, 0x10, 0x11, 0x11, 0x11, 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x40, 0x41, 0x11, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x11, 0x4b, 0x4c, 0x4d, + 0x4e, 0x4f, 0x50, 0x51, 0x10, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x10, 0x5e, 0x5f, 0x60, 0x10, 0x11, 0x11, + 0x11, 0x61, 0x62, 0x63, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x64, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, + 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x11, 0x11, 0x65, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x11, 0x11, 0x66, 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, + 0x66, 0x67, 0x10, 0x10, 0x68, 0x69, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, - 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x6b, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x11, 0x6c, 0x6d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x6c, + 0x6d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x6f, 0x70, 0x71, 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x73, 0x74, 0x75, 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, - 0x77, 0x10, 0x10, 0x10, 0x10, 0x78, 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x6f, 0x70, + 0x71, 0x72, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x73, 0x74, + 0x75, 0x10, 0x10, 0x10, 0x10, 0x10, 0x76, 0x77, 0x10, 0x10, 0x10, 0x10, + 0x78, 0x10, 0x10, 0x79, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x04, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, - 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x20, 0x04, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0x03, 0x00, 0x1f, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, 0xd7, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, - 0xff, 0x03, 0x00, 0x1f, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xbc, 0x40, - 0xd7, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, - 0x00, 0xff, 0xff, 0xff, 0x87, 0x07, 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, - 0xe1, 0xff, 0x9f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, - 0x00, 0xf0, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xef, 0xff, 0xdf, 0xe1, 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, - 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xc5, 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, - 0xff, 0x03, 0x10, 0xee, 0x87, 0xf9, 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, - 0x19, 0x02, 0x5e, 0xc0, 0xff, 0x3f, 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, - 0xfd, 0xed, 0xe3, 0xbf, 0x1b, 0x01, 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, - 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, - 0xff, 0x02, 0x00, 0xec, 0xc7, 0x3d, 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, - 0x1d, 0x81, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, - 0xfd, 0xff, 0xe3, 0xdf, 0x1d, 0x60, 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, - 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xef, 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, - 0xff, 0x06, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, - 0x5d, 0xf0, 0x80, 0xcf, 0xff, 0x00, 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, - 0xff, 0xfb, 0x2f, 0x7f, 0x80, 0x5f, 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0xd6, 0xf7, 0xff, 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, - 0x20, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, - 0x03, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, - 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, - 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xbf, 0xb6, 0x00, 0xff, 0xff, 0xff, 0x87, + 0x07, 0x00, 0x00, 0x00, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0x1f, 0xfe, 0xe1, 0xff, 0x9f, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x30, 0x04, 0xff, 0xff, 0xff, 0xfc, 0xff, 0x1f, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x00, 0xf0, 0xff, 0xf8, 0x03, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf, + 0xe1, 0xff, 0xcf, 0xff, 0xfe, 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, + 0xc5, 0xe3, 0x9f, 0x59, 0x80, 0xb0, 0xcf, 0xff, 0x03, 0x10, 0xee, 0x87, + 0xf9, 0xff, 0xff, 0xfd, 0x6d, 0xc3, 0x87, 0x19, 0x02, 0x5e, 0xc0, 0xff, + 0x3f, 0x00, 0xee, 0xbf, 0xfb, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0xbf, 0x1b, + 0x01, 0x00, 0xcf, 0xff, 0x00, 0x1e, 0xee, 0x9f, 0xf9, 0xff, 0xff, 0xfd, + 0xed, 0xe3, 0x9f, 0x19, 0xc0, 0xb0, 0xcf, 0xff, 0x02, 0x00, 0xec, 0xc7, + 0x3d, 0xd6, 0x18, 0xc7, 0xff, 0xc3, 0xc7, 0x1d, 0x81, 0x00, 0xc0, 0xff, + 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0xff, 0xe3, 0xdf, 0x1d, + 0x60, 0x07, 0xcf, 0xff, 0x00, 0x00, 0xef, 0xdf, 0xfd, 0xff, 0xff, 0xfd, + 0xef, 0xe3, 0xdf, 0x1d, 0x60, 0x40, 0xcf, 0xff, 0x06, 0x00, 0xef, 0xdf, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xdf, 0x5d, 0xf0, 0x80, 0xcf, 0xff, + 0x00, 0xfc, 0xec, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0x2f, 0x7f, 0x80, + 0x5f, 0xff, 0xc0, 0xff, 0x0c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0x07, 0x3f, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf7, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0x3b, 0x5f, 0x20, 0xff, 0xf3, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0x03, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf9, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0x7f, 0x3d, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x9f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, - 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, - 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0x0f, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0x1f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, - 0x03, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, - 0x03, 0xff, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, - 0x0f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xde, 0x6f, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0xff, 0x01, 0xff, 0xdf, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, + 0x0f, 0x00, 0xff, 0xdf, 0x0d, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0x01, 0x80, 0x10, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x0f, + 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x03, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0x00, 0xff, 0x03, 0xff, 0x03, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef, 0x0f, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x01, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, + 0x6f, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0x1f, 0x00, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, - 0x3f, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0x5f, 0xdc, 0x1f, 0xcf, 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, - 0xbd, 0xff, 0xf3, 0xe0, 0x43, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1f, 0x78, 0x0c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, - 0xff, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x00, 0x00, 0x00, 0xfe, 0x03, 0x3e, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x00, 0x80, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, - 0x00, 0xfc, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, - 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0xff, 0x00, 0x80, 0xff, 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, - 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, - 0x00, 0x00, 0x38, 0xff, 0xff, 0x3c, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x07, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0x00, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, - 0xfd, 0x7f, 0x5f, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, - 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xef, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, - 0x3f, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x1f, 0x00, 0xff, 0xff, + 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x3f, 0xff, 0xaa, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x5f, 0xdc, 0x1f, + 0xcf, 0x0f, 0xff, 0x1f, 0xdc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x84, 0xfc, 0x2f, 0x3e, 0x50, 0xbd, 0xff, 0xf3, 0xe0, 0x43, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, - 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x78, + 0x0c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xfe, 0x03, + 0x3e, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, - 0xff, 0x3f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, - 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x37, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, - 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x6f, 0xf0, 0xef, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, - 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0x1f, 0x80, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, - 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x47, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x1e, 0x00, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7f, 0xbd, 0xff, 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, - 0xfd, 0xed, 0xe3, 0x9f, 0x19, 0x81, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, - 0x07, 0xff, 0x83, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb3, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, - 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7f, 0x11, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, - 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, - 0x00, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xb4, 0xcb, 0x00, 0xff, 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, - 0x7f, 0x7b, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, - 0xff, 0xff, 0x7f, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, - 0xff, 0xff, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2f, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xe8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x80, + 0xff, 0x03, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, 0x00, 0x00, 0x38, 0xff, 0xff, + 0x3c, 0x00, 0x7e, 0x7e, 0x7e, 0x00, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x03, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x00, 0xf8, 0xe0, 0xff, 0xfd, 0x7f, 0x5f, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, + 0xff, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xfc, 0xfc, 0xfc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xb7, 0xff, 0x3f, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, + 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0x91, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x37, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf0, + 0xef, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, + 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0x70, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x47, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x00, + 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbd, + 0xff, 0xbf, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0xff, 0x03, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfd, 0xed, 0xe3, 0x9f, 0x19, + 0x81, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0x07, 0xff, 0x83, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x7f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x11, 0x00, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x01, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xe7, 0xff, 0x07, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x7f, 0x01, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xb4, 0xcb, 0x00, + 0xff, 0x03, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0x01, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x0f, 0x00, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x07, 0x00, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, - 0x01, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, - 0xde, 0xff, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, - 0xe7, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0xff, 0x1f, 0xff, 0x01, 0xff, 0x43, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x64, 0xde, 0xff, 0xeb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe7, 0xdf, 0xdf, 0xff, 0xff, + 0xff, 0x7b, 0x5f, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x3f, 0xff, 0x43, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, - 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, - 0xfd, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x08, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, + 0xff, 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, 0xea, 0x96, 0xaa, 0x96, 0xf7, + 0xf7, 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x1f, 0x80, 0x3f, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x03, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0x08, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0x96, 0xfe, 0xf7, 0x0a, 0x84, - 0xea, 0x96, 0xaa, 0x96, 0xf7, 0xf7, 0x5e, 0xff, 0xfb, 0xff, 0x0f, 0xee, - 0xfb, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, - 0x03, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, - 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, - 0xbf, 0x1d, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, - 0x24, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, - 0x39, 0xff, 0xff, 0x00, 0x18, 0xff, 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, - 0xd4, 0xfe, 0xff, 0x00, 0xc3, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, - 0xce, 0x00, 0x00, 0x01, 0xcd, 0x00, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, - 0xca, 0x00, 0x00, 0x01, 0xcb, 0x00, 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, - 0x61, 0x00, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, - 0xa3, 0x00, 0x00, 0x01, 0xd5, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, - 0xd6, 0x00, 0x00, 0x01, 0xda, 0x00, 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, - 0xdb, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, - 0xb1, 0xff, 0xff, 0x01, 0x9f, 0xff, 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, - 0x28, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x00, 0x33, 0xff, 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, - 0x7e, 0xff, 0xff, 0x01, 0x2b, 0x2a, 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, - 0x28, 0x2a, 0x00, 0x00, 0x3f, 0x2a, 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, - 0x45, 0x00, 0x00, 0x01, 0x47, 0x00, 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, - 0x1c, 0x2a, 0x00, 0x00, 0x1e, 0x2a, 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, - 0x32, 0xff, 0xff, 0x00, 0x36, 0xff, 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, - 0x4f, 0xa5, 0x00, 0x00, 0x4b, 0xa5, 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, - 0x28, 0xa5, 0x00, 0x00, 0x44, 0xa5, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, - 0x2d, 0xff, 0xff, 0x00, 0xf7, 0x29, 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, - 0xfd, 0x29, 0x00, 0x00, 0x2b, 0xff, 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, - 0xe7, 0x29, 0x00, 0x00, 0x43, 0xa5, 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, - 0xbb, 0xff, 0xff, 0x00, 0x27, 0xff, 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, - 0x25, 0xff, 0xff, 0x00, 0x15, 0xa5, 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, - 0x24, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, - 0xe0, 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, - 0x54, 0x00, 0x00, 0x01, 0x74, 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, - 0x25, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, - 0xda, 0xff, 0xff, 0x00, 0xdb, 0xff, 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, - 0xc0, 0xff, 0xff, 0x00, 0xc1, 0xff, 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, - 0xc2, 0xff, 0xff, 0x00, 0xc7, 0xff, 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, - 0xca, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, - 0xb0, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, - 0xc4, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, - 0x1a, 0x70, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, - 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, - 0x0f, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, - 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, - 0x08, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x40, 0xf4, 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, - 0xc2, 0x89, 0x00, 0x00, 0xdb, 0xe7, 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, - 0x93, 0xe7, 0xff, 0x00, 0x9c, 0xe7, 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, - 0xa4, 0xe7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, - 0x04, 0x8a, 0x00, 0x00, 0xe6, 0x0e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, - 0x41, 0xe2, 0xff, 0x02, 0x1d, 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, - 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, - 0xaa, 0xff, 0xff, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x01, 0xb6, 0xff, 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, - 0xdb, 0xe3, 0xff, 0x01, 0x9c, 0xff, 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, - 0x80, 0xff, 0xff, 0x01, 0x82, 0xff, 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, - 0x1c, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, - 0x41, 0xdf, 0xff, 0x01, 0xba, 0xdf, 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, - 0x0b, 0xb1, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, - 0x30, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x09, 0xd6, 0xff, 0x01, 0x1a, 0xf1, 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, - 0xd5, 0xd5, 0xff, 0x00, 0xd8, 0xd5, 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, - 0x03, 0xd6, 0xff, 0x01, 0xe1, 0xd5, 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, - 0xc1, 0xd5, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, - 0x0c, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0x01, 0xbc, 0x5a, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, - 0xfc, 0x75, 0xff, 0x01, 0xd8, 0x5a, 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, - 0xb1, 0x5a, 0xff, 0x01, 0xb5, 0x5a, 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, - 0xee, 0x5a, 0xff, 0x01, 0xd6, 0x5a, 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, - 0xd0, 0xff, 0xff, 0x01, 0xbd, 0x5a, 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x28, 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, - 0x0c, 0x31, 0x0d, 0x78, 0x0e, 0x7f, 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, - 0x12, 0x89, 0x13, 0x8a, 0x13, 0x8e, 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, - 0x13, 0x94, 0x17, 0x95, 0x18, 0x96, 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, - 0x19, 0x9d, 0x1c, 0x9e, 0x1d, 0x9f, 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, - 0x1f, 0xb1, 0x20, 0xb2, 0x20, 0xb7, 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, - 0x23, 0xcb, 0x23, 0xdd, 0x24, 0xf2, 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, - 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, 0x3e, 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, - 0x32, 0x44, 0x33, 0x45, 0x34, 0x50, 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, - 0x38, 0x54, 0x39, 0x59, 0x3a, 0x5b, 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, - 0x3e, 0x65, 0x3f, 0x66, 0x40, 0x68, 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, - 0x43, 0x6c, 0x44, 0x6f, 0x42, 0x71, 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, - 0x48, 0x82, 0x49, 0x87, 0x4a, 0x89, 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, - 0x4d, 0x92, 0x4e, 0x9d, 0x4f, 0x9e, 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, - 0x1d, 0x7d, 0x1d, 0x7f, 0x58, 0x86, 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, - 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, 0x8f, 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, - 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, 0xcc, 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, - 0x62, 0xd0, 0x63, 0xd1, 0x64, 0xd5, 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, - 0x68, 0xf1, 0x69, 0xf2, 0x6a, 0xf3, 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, - 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, 0xff, 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, - 0x69, 0x53, 0x69, 0x54, 0x69, 0x55, 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, - 0x69, 0x59, 0x69, 0x5a, 0x69, 0x5b, 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, - 0x69, 0x5f, 0x69, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, - 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, - 0x89, 0x81, 0x8a, 0x82, 0x8b, 0x85, 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, - 0x9d, 0x76, 0x9e, 0x77, 0x9e, 0x78, 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, - 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, 0xb3, 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, - 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, 0xcc, 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, - 0x6a, 0xea, 0xa7, 0xeb, 0xa7, 0xec, 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, - 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, 0xfc, 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, - 0xb2, 0x4e, 0xb3, 0x84, 0x08, 0x62, 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, - 0xbd, 0x66, 0xbe, 0x6d, 0xbf, 0x6e, 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, - 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, 0x8d, 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, - 0xd3, 0xad, 0xd4, 0xb0, 0xd5, 0xb1, 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, - 0xd9, 0xc6, 0xda, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, - 0x13, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, - 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0xbf, 0x1d, 0x00, 0x00, 0xe7, + 0x02, 0x00, 0x00, 0x79, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x39, 0xff, 0xff, 0x00, 0x18, + 0xff, 0xff, 0x01, 0x87, 0xff, 0xff, 0x00, 0xd4, 0xfe, 0xff, 0x00, 0xc3, + 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xce, 0x00, 0x00, 0x01, 0xcd, + 0x00, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0xca, 0x00, 0x00, 0x01, 0xcb, + 0x00, 0x00, 0x01, 0xcf, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x01, 0xd3, + 0x00, 0x00, 0x01, 0xd1, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x01, 0xd5, + 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x01, 0xd6, 0x00, 0x00, 0x01, 0xda, + 0x00, 0x00, 0x01, 0xd9, 0x00, 0x00, 0x01, 0xdb, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xb1, 0xff, 0xff, 0x01, 0x9f, + 0xff, 0xff, 0x01, 0xc8, 0xff, 0xff, 0x02, 0x28, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x33, + 0xff, 0xff, 0x00, 0x26, 0xff, 0xff, 0x01, 0x7e, 0xff, 0xff, 0x01, 0x2b, + 0x2a, 0x00, 0x01, 0x5d, 0xff, 0xff, 0x01, 0x28, 0x2a, 0x00, 0x00, 0x3f, + 0x2a, 0x00, 0x01, 0x3d, 0xff, 0xff, 0x01, 0x45, 0x00, 0x00, 0x01, 0x47, + 0x00, 0x00, 0x00, 0x1f, 0x2a, 0x00, 0x00, 0x1c, 0x2a, 0x00, 0x00, 0x1e, + 0x2a, 0x00, 0x00, 0x2e, 0xff, 0xff, 0x00, 0x32, 0xff, 0xff, 0x00, 0x36, + 0xff, 0xff, 0x00, 0x35, 0xff, 0xff, 0x00, 0x4f, 0xa5, 0x00, 0x00, 0x4b, + 0xa5, 0x00, 0x00, 0x31, 0xff, 0xff, 0x00, 0x28, 0xa5, 0x00, 0x00, 0x44, + 0xa5, 0x00, 0x00, 0x2f, 0xff, 0xff, 0x00, 0x2d, 0xff, 0xff, 0x00, 0xf7, + 0x29, 0x00, 0x00, 0x41, 0xa5, 0x00, 0x00, 0xfd, 0x29, 0x00, 0x00, 0x2b, + 0xff, 0xff, 0x00, 0x2a, 0xff, 0xff, 0x00, 0xe7, 0x29, 0x00, 0x00, 0x43, + 0xa5, 0x00, 0x00, 0x2a, 0xa5, 0x00, 0x00, 0xbb, 0xff, 0xff, 0x00, 0x27, + 0xff, 0xff, 0x00, 0xb9, 0xff, 0xff, 0x00, 0x25, 0xff, 0xff, 0x00, 0x15, + 0xa5, 0x00, 0x00, 0x12, 0xa5, 0x00, 0x02, 0x24, 0x4c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x01, 0x74, + 0x00, 0x00, 0x01, 0x26, 0x00, 0x00, 0x01, 0x25, 0x00, 0x00, 0x01, 0x40, + 0x00, 0x00, 0x01, 0x3f, 0x00, 0x00, 0x00, 0xda, 0xff, 0xff, 0x00, 0xdb, + 0xff, 0xff, 0x00, 0xe1, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc1, + 0xff, 0xff, 0x01, 0x08, 0x00, 0x00, 0x00, 0xc2, 0xff, 0xff, 0x00, 0xc7, + 0xff, 0xff, 0x00, 0xd1, 0xff, 0xff, 0x00, 0xca, 0xff, 0xff, 0x00, 0xf8, + 0xff, 0xff, 0x00, 0xaa, 0xff, 0xff, 0x00, 0xb0, 0xff, 0xff, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x8c, 0xff, 0xff, 0x01, 0xc4, 0xff, 0xff, 0x00, 0xa0, + 0xff, 0xff, 0x01, 0xf9, 0xff, 0xff, 0x02, 0x1a, 0x70, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x20, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0x01, 0x50, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0xf1, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, + 0xff, 0xff, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xd0, 0x97, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0x02, 0x05, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, + 0xf4, 0xff, 0x00, 0x9e, 0xe7, 0xff, 0x00, 0xc2, 0x89, 0x00, 0x00, 0xdb, + 0xe7, 0xff, 0x00, 0x92, 0xe7, 0xff, 0x00, 0x93, 0xe7, 0xff, 0x00, 0x9c, + 0xe7, 0xff, 0x00, 0x9d, 0xe7, 0xff, 0x00, 0xa4, 0xe7, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x8a, 0x00, 0x00, 0x04, 0x8a, 0x00, 0x00, 0xe6, + 0x0e, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc5, 0xff, 0xff, 0x01, 0x41, 0xe2, 0xff, 0x02, 0x1d, + 0x8f, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xf8, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x01, 0xaa, 0xff, 0xff, 0x00, 0x4a, + 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0xb6, + 0xff, 0xff, 0x01, 0xf7, 0xff, 0xff, 0x00, 0xdb, 0xe3, 0xff, 0x01, 0x9c, + 0xff, 0xff, 0x01, 0x90, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x82, + 0xff, 0xff, 0x02, 0x05, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, + 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x01, 0xa3, 0xe2, 0xff, 0x01, 0x41, 0xdf, 0xff, 0x01, 0xba, + 0xdf, 0xff, 0x00, 0xe4, 0xff, 0xff, 0x02, 0x0b, 0xb1, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x30, 0x00, 0x00, 0x00, 0xd0, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0xd6, 0xff, 0x01, 0x1a, + 0xf1, 0xff, 0x01, 0x19, 0xd6, 0xff, 0x00, 0xd5, 0xd5, 0xff, 0x00, 0xd8, + 0xd5, 0xff, 0x01, 0xe4, 0xd5, 0xff, 0x01, 0x03, 0xd6, 0xff, 0x01, 0xe1, + 0xd5, 0xff, 0x01, 0xe2, 0xd5, 0xff, 0x01, 0xc1, 0xd5, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa0, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x02, 0x0c, 0xbc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0xbc, + 0x5a, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0xfc, 0x75, 0xff, 0x01, 0xd8, + 0x5a, 0xff, 0x00, 0x30, 0x00, 0x00, 0x01, 0xb1, 0x5a, 0xff, 0x01, 0xb5, + 0x5a, 0xff, 0x01, 0xbf, 0x5a, 0xff, 0x01, 0xee, 0x5a, 0xff, 0x01, 0xd6, + 0x5a, 0xff, 0x01, 0xeb, 0x5a, 0xff, 0x01, 0xd0, 0xff, 0xff, 0x01, 0xbd, + 0x5a, 0xff, 0x01, 0xc8, 0x75, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x68, 0xff, 0x00, 0x60, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x28, + 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, + 0x00, 0x00, 0x00, 0xde, 0xff, 0xff, 0x30, 0x0c, 0x31, 0x0d, 0x78, 0x0e, + 0x7f, 0x0f, 0x80, 0x10, 0x81, 0x11, 0x86, 0x12, 0x89, 0x13, 0x8a, 0x13, + 0x8e, 0x14, 0x8f, 0x15, 0x90, 0x16, 0x93, 0x13, 0x94, 0x17, 0x95, 0x18, + 0x96, 0x19, 0x97, 0x1a, 0x9a, 0x1b, 0x9c, 0x19, 0x9d, 0x1c, 0x9e, 0x1d, + 0x9f, 0x1e, 0xa6, 0x1f, 0xa9, 0x1f, 0xae, 0x1f, 0xb1, 0x20, 0xb2, 0x20, + 0xb7, 0x21, 0xbf, 0x22, 0xc5, 0x23, 0xc8, 0x23, 0xcb, 0x23, 0xdd, 0x24, + 0xf2, 0x23, 0xf6, 0x25, 0xf7, 0x26, 0x20, 0x2d, 0x3a, 0x2e, 0x3d, 0x2f, + 0x3e, 0x30, 0x3f, 0x31, 0x40, 0x31, 0x43, 0x32, 0x44, 0x33, 0x45, 0x34, + 0x50, 0x35, 0x51, 0x36, 0x52, 0x37, 0x53, 0x38, 0x54, 0x39, 0x59, 0x3a, + 0x5b, 0x3b, 0x5c, 0x3c, 0x61, 0x3d, 0x63, 0x3e, 0x65, 0x3f, 0x66, 0x40, + 0x68, 0x41, 0x69, 0x42, 0x6a, 0x40, 0x6b, 0x43, 0x6c, 0x44, 0x6f, 0x42, + 0x71, 0x45, 0x72, 0x46, 0x75, 0x47, 0x7d, 0x48, 0x82, 0x49, 0x87, 0x4a, + 0x89, 0x4b, 0x8a, 0x4c, 0x8b, 0x4c, 0x8c, 0x4d, 0x92, 0x4e, 0x9d, 0x4f, + 0x9e, 0x50, 0x45, 0x57, 0x7b, 0x1d, 0x7c, 0x1d, 0x7d, 0x1d, 0x7f, 0x58, + 0x86, 0x59, 0x88, 0x5a, 0x89, 0x5a, 0x8a, 0x5a, 0x8c, 0x5b, 0x8e, 0x5c, + 0x8f, 0x5c, 0xac, 0x5d, 0xad, 0x5e, 0xae, 0x5e, 0xaf, 0x5e, 0xc2, 0x5f, + 0xcc, 0x60, 0xcd, 0x61, 0xce, 0x61, 0xcf, 0x62, 0xd0, 0x63, 0xd1, 0x64, + 0xd5, 0x65, 0xd6, 0x66, 0xd7, 0x67, 0xf0, 0x68, 0xf1, 0x69, 0xf2, 0x6a, + 0xf3, 0x6b, 0xf4, 0x6c, 0xf5, 0x6d, 0xf9, 0x6e, 0xfd, 0x2d, 0xfe, 0x2d, + 0xff, 0x2d, 0x50, 0x69, 0x51, 0x69, 0x52, 0x69, 0x53, 0x69, 0x54, 0x69, + 0x55, 0x69, 0x56, 0x69, 0x57, 0x69, 0x58, 0x69, 0x59, 0x69, 0x5a, 0x69, + 0x5b, 0x69, 0x5c, 0x69, 0x5d, 0x69, 0x5e, 0x69, 0x5f, 0x69, 0x82, 0x00, + 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, 0x88, 0x00, + 0x89, 0x00, 0xc0, 0x75, 0xcf, 0x76, 0x80, 0x89, 0x81, 0x8a, 0x82, 0x8b, + 0x85, 0x8c, 0x86, 0x8d, 0x70, 0x9d, 0x71, 0x9d, 0x76, 0x9e, 0x77, 0x9e, + 0x78, 0x9f, 0x79, 0x9f, 0x7a, 0xa0, 0x7b, 0xa0, 0x7c, 0xa1, 0x7d, 0xa1, + 0xb3, 0xa2, 0xba, 0xa3, 0xbb, 0xa3, 0xbc, 0xa4, 0xbe, 0xa5, 0xc3, 0xa2, + 0xcc, 0xa4, 0xda, 0xa6, 0xdb, 0xa6, 0xe5, 0x6a, 0xea, 0xa7, 0xeb, 0xa7, + 0xec, 0x6e, 0xf3, 0xa2, 0xf8, 0xa8, 0xf9, 0xa8, 0xfa, 0xa9, 0xfb, 0xa9, + 0xfc, 0xa4, 0x26, 0xb0, 0x2a, 0xb1, 0x2b, 0xb2, 0x4e, 0xb3, 0x84, 0x08, + 0x62, 0xba, 0x63, 0xbb, 0x64, 0xbc, 0x65, 0xbd, 0x66, 0xbe, 0x6d, 0xbf, + 0x6e, 0xc0, 0x6f, 0xc1, 0x70, 0xc2, 0x7e, 0xc3, 0x7f, 0xc3, 0x7d, 0xcf, + 0x8d, 0xd0, 0x94, 0xd1, 0xab, 0xd2, 0xac, 0xd3, 0xad, 0xd4, 0xb0, 0xd5, + 0xb1, 0xd6, 0xb2, 0xd7, 0xc4, 0xd8, 0xc5, 0xd9, 0xc6, 0xda, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x0d, 0x06, 0x06, 0x0e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x0f, 0x10, 0x11, 0x12, 0x06, 0x13, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x14, 0x15, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -946,23 +968,24 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x16, 0x17, 0x06, 0x06, 0x06, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x16, 0x17, 0x06, 0x06, + 0x06, 0x18, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x19, 0x06, 0x06, 0x06, 0x06, 0x1a, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x1b, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, @@ -972,9 +995,9 @@ unsigned char STDLIB_WASM[] = { 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x1e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -983,182 +1006,182 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x54, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, - 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x4a, 0x56, 0x56, 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, - 0x50, 0x79, 0x31, 0x50, 0x31, 0x50, 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, - 0x31, 0x02, 0x4e, 0x0d, 0x0d, 0x4e, 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, - 0x4e, 0x31, 0x26, 0x6e, 0x51, 0x4e, 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, - 0x1b, 0x1d, 0x1d, 0x53, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x1b, 0x53, 0x24, 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x2d, 0x2b, 0x49, 0x03, 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, - 0x00, 0x96, 0x0a, 0x01, 0x2b, 0x28, 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, - 0x2a, 0x2b, 0x07, 0xbb, 0xb5, 0x2b, 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, - 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0xcd, 0x46, 0xcd, 0x2b, 0x00, 0x25, 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x55, 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x15, 0x81, 0x81, 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, - 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, - 0x00, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xac, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x02, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, - 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, - 0x00, 0x0c, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x6c, 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, + 0x18, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, + 0x2b, 0x2b, 0x5b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x4a, 0x56, + 0x56, 0x05, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x24, 0x50, 0x79, 0x31, 0x50, 0x31, + 0x50, 0x31, 0x38, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x02, 0x4e, 0x0d, 0x0d, + 0x4e, 0x03, 0x4e, 0x00, 0x24, 0x6e, 0x00, 0x4e, 0x31, 0x26, 0x6e, 0x51, + 0x4e, 0x24, 0x50, 0x4e, 0x39, 0x14, 0x81, 0x1b, 0x1d, 0x1d, 0x53, 0x31, + 0x50, 0x31, 0x50, 0x0d, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x1b, 0x53, + 0x24, 0x50, 0x31, 0x02, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, + 0x5c, 0x7b, 0x14, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x49, + 0x03, 0x48, 0x03, 0x78, 0x5c, 0x7b, 0x14, 0x00, 0x96, 0x0a, 0x01, 0x2b, + 0x28, 0x06, 0x06, 0x00, 0x2a, 0x06, 0x2a, 0x2a, 0x2b, 0x07, 0xbb, 0xb5, + 0x2b, 0x1e, 0x00, 0x2b, 0x07, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x07, 0x6c, 0x03, 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, - 0x56, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x56, 0x7a, 0x9e, 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, - 0x25, 0x06, 0x01, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, - 0x56, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, - 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x81, 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, - 0x2b, 0x4f, 0x56, 0x56, 0x02, 0xac, 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, - 0x55, 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, - 0x56, 0x32, 0x13, 0x81, 0x57, 0x00, 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, - 0x2d, 0x81, 0x81, 0x0e, 0x7e, 0x39, 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, - 0x7e, 0x15, 0x00, 0x7e, 0x03, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, - 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, - 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, - 0xac, 0xac, 0xd0, 0x0d, 0x00, 0x4e, 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, - 0xd7, 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, - 0xd7, 0x53, 0xc1, 0x47, 0xd4, 0xd7, 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, - 0x50, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x79, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, - 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, 0x79, 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, - 0x2a, 0x5c, 0x27, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, - 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, 0x4f, 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x07, 0x00, 0x48, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0xcd, 0x46, 0xcd, 0x2b, 0x00, + 0x25, 0x2b, 0x07, 0x01, 0x06, 0x01, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x55, 0x56, 0x56, 0x02, 0x24, 0x81, 0x81, 0x81, 0x81, 0x81, 0x15, 0x81, + 0x81, 0x81, 0x00, 0x00, 0x2b, 0x00, 0xb2, 0xd1, 0xb2, 0xd1, 0xb2, 0xd1, + 0xb2, 0xd1, 0x00, 0x00, 0xcd, 0xcc, 0x01, 0x00, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0x83, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x02, 0x00, 0x00, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x4e, 0x31, 0x50, 0x31, 0x50, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x02, 0x87, 0xa6, + 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, 0x87, 0xa6, + 0x87, 0xa6, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, - 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0c, 0x00, 0x0c, 0x2a, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, + 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, - 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, + 0x6c, 0x81, 0x15, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x6c, + 0x03, 0x41, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x2c, 0x56, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x56, 0x7a, + 0x9e, 0x26, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, + 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x25, 0x06, 0x01, 0x2b, 0x2b, + 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, 0x39, 0x2b, 0x2b, 0x55, + 0x56, 0x56, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x7f, 0x56, 0x56, + 0x81, 0x37, 0x75, 0x5b, 0x7b, 0x5c, 0x2b, 0x2b, 0x4f, 0x56, 0x56, 0x02, + 0xac, 0x04, 0x00, 0x00, 0x39, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x2b, 0x2b, + 0x4f, 0x56, 0x56, 0x2c, 0x2b, 0x2b, 0x56, 0x56, 0x32, 0x13, 0x81, 0x57, + 0x00, 0x6f, 0x81, 0x7e, 0xc9, 0xd7, 0x7e, 0x2d, 0x81, 0x81, 0x0e, 0x7e, + 0x39, 0x7f, 0x6f, 0x57, 0x00, 0x81, 0x81, 0x7e, 0x15, 0x00, 0x7e, 0x03, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x07, 0x2b, 0x24, 0x2b, 0x97, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x80, 0x81, 0x81, 0x81, 0x81, 0x39, 0xbb, 0x2a, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0xc9, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xd0, 0x0d, 0x00, + 0x4e, 0x31, 0x02, 0xb4, 0xc1, 0xc1, 0xd7, 0xd7, 0x24, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0xd7, 0xd7, 0x53, 0xc1, 0x47, 0xd4, + 0xd7, 0xd7, 0xd7, 0x05, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x27, 0x51, 0x6f, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x83, 0x8e, 0x92, 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4e, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, + 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x31, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x79, 0x5c, 0x7b, 0x5c, 0x7b, + 0x4f, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, + 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x7b, 0x5c, 0x2d, 0x2b, 0x2b, + 0x79, 0x14, 0x5c, 0x7b, 0x5c, 0x2d, 0x79, 0x2a, 0x5c, 0x27, 0x5c, 0x7b, + 0x5c, 0x7b, 0x5c, 0x7b, 0xa4, 0x00, 0x0a, 0xb4, 0x5c, 0x7b, 0x5c, 0x7b, + 0x4f, 0x03, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x48, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x07, 0x00, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x55, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x27, 0x51, 0x6f, 0x77, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x8e, + 0x92, 0x97, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb4, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1168,24 +1191,24 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, - 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, + 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1195,42 +1218,85 @@ unsigned char STDLIB_WASM[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, - 0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, - 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, - 0x20, 0x00, 0x00, 0x28, 0x20, 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, - 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x41, 0xe8, 0xc2, 0x04, 0x0b, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x8e, - 0x01, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x02, - 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x01, 0x03, 0x43, - 0x31, 0x31, 0x00, 0x0c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x2d, 0x62, 0x79, 0x01, 0x05, 0x63, 0x6c, 0x61, 0x6e, 0x67, 0x5f, - 0x32, 0x31, 0x2e, 0x31, 0x2e, 0x34, 0x2d, 0x77, 0x61, 0x73, 0x69, 0x2d, - 0x73, 0x64, 0x6b, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6c, 0x6c, 0x76, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x32, 0x32, 0x32, 0x66, 0x63, 0x31, - 0x31, 0x66, 0x32, 0x62, 0x38, 0x66, 0x32, 0x35, 0x66, 0x36, 0x61, 0x30, - 0x66, 0x34, 0x39, 0x37, 0x36, 0x32, 0x37, 0x32, 0x65, 0x66, 0x31, 0x62, - 0x62, 0x37, 0x62, 0x66, 0x34, 0x39, 0x35, 0x32, 0x31, 0x64, 0x29, 0x00, - 0xa4, 0x01, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x09, 0x2b, 0x0f, 0x6d, 0x75, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x2b, 0x13, 0x6e, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x2d, 0x66, 0x70, 0x74, 0x6f, 0x69, 0x6e, 0x74, 0x2b, 0x0b, 0x62, - 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2b, 0x08, - 0x73, 0x69, 0x67, 0x6e, 0x2d, 0x65, 0x78, 0x74, 0x2b, 0x0f, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2d, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2b, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2b, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x2d, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x2b, 0x0f, 0x62, 0x75, 0x6c, 0x6b, 0x2d, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2d, 0x6f, 0x70, 0x74, 0x2b, 0x16, - 0x63, 0x61, 0x6c, 0x6c, 0x2d, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x6e, 0x67 + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x04, 0x20, + 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x08, 0x20, + 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x28, 0x20, + 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x5f, 0x20, 0x00, 0x00, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x05, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x01, 0xc9, 0x04, 0x2c, 0x00, 0x2a, 0x5f, 0x5f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x67, + 0x65, 0x74, 0x01, 0x30, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x31, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x02, 0x2b, 0x5f, 0x5f, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, + 0x74, 0x03, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x04, 0x13, 0x75, 0x6e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x61, 0x6b, + 0x3a, 0x6d, 0x61, 0x69, 0x6e, 0x05, 0x12, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x6d, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x06, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x07, 0x0a, 0x72, + 0x65, 0x73, 0x65, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x08, 0x06, 0x6d, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x09, 0x04, 0x66, 0x72, 0x65, 0x65, 0x0a, + 0x06, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x0b, 0x07, 0x72, 0x65, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x0c, 0x05, 0x5f, 0x45, 0x78, 0x69, 0x74, 0x0d, + 0x0b, 0x5f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x69, 0x64, + 0x0e, 0x0f, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x61, 0x72, 0x67, + 0x73, 0x5f, 0x67, 0x65, 0x74, 0x0f, 0x15, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x69, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, + 0x5f, 0x67, 0x65, 0x74, 0x10, 0x10, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x69, + 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x11, 0x05, + 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x12, 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, + 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x64, 0x74, 0x6f, 0x72, 0x73, + 0x13, 0x06, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x14, 0x06, 0x6d, 0x65, + 0x6d, 0x73, 0x65, 0x74, 0x15, 0x06, 0x73, 0x74, 0x72, 0x6c, 0x65, 0x6e, + 0x16, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x17, 0x06, + 0x6d, 0x65, 0x6d, 0x63, 0x6d, 0x70, 0x18, 0x06, 0x6d, 0x65, 0x6d, 0x63, + 0x68, 0x72, 0x19, 0x06, 0x73, 0x74, 0x72, 0x63, 0x6d, 0x70, 0x1a, 0x08, + 0x74, 0x6f, 0x77, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x1b, 0x07, 0x63, 0x61, + 0x73, 0x65, 0x6d, 0x61, 0x70, 0x1c, 0x08, 0x74, 0x6f, 0x77, 0x75, 0x70, + 0x70, 0x65, 0x72, 0x1d, 0x07, 0x73, 0x74, 0x72, 0x6e, 0x63, 0x6d, 0x70, + 0x1e, 0x08, 0x69, 0x73, 0x77, 0x75, 0x70, 0x70, 0x65, 0x72, 0x1f, 0x07, + 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x08, 0x69, 0x73, 0x77, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x21, 0x07, 0x69, 0x73, 0x62, 0x6c, 0x61, + 0x6e, 0x6b, 0x22, 0x08, 0x69, 0x73, 0x77, 0x62, 0x6c, 0x61, 0x6e, 0x6b, + 0x23, 0x08, 0x69, 0x73, 0x77, 0x64, 0x69, 0x67, 0x69, 0x74, 0x24, 0x07, + 0x73, 0x74, 0x72, 0x6e, 0x63, 0x61, 0x74, 0x25, 0x09, 0x5f, 0x5f, 0x73, + 0x74, 0x70, 0x6e, 0x63, 0x70, 0x79, 0x26, 0x07, 0x73, 0x74, 0x72, 0x6e, + 0x63, 0x70, 0x79, 0x27, 0x09, 0x69, 0x73, 0x77, 0x78, 0x64, 0x69, 0x67, + 0x69, 0x74, 0x28, 0x06, 0x77, 0x63, 0x73, 0x6c, 0x65, 0x6e, 0x29, 0x06, + 0x77, 0x63, 0x73, 0x63, 0x68, 0x72, 0x2a, 0x08, 0x69, 0x73, 0x77, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x2b, 0x08, 0x69, 0x73, 0x77, 0x61, 0x6c, 0x6e, + 0x75, 0x6d, 0x07, 0x33, 0x02, 0x00, 0x0f, 0x5f, 0x5f, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x01, 0x1f, + 0x47, 0x4f, 0x54, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x5f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x09, 0x0a, 0x01, 0x00, 0x07, + 0x2e, 0x72, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x00, 0x76, 0x09, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x73, 0x01, 0x0c, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2d, 0x62, 0x79, 0x01, 0x05, 0x63, + 0x6c, 0x61, 0x6e, 0x67, 0x56, 0x31, 0x37, 0x2e, 0x30, 0x2e, 0x36, 0x20, + 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x6c, 0x76, 0x6d, + 0x2f, 0x6c, 0x6c, 0x76, 0x6d, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x36, 0x30, 0x30, 0x39, 0x37, 0x30, 0x38, 0x62, 0x34, 0x33, + 0x36, 0x37, 0x31, 0x37, 0x31, 0x63, 0x63, 0x64, 0x62, 0x66, 0x34, 0x62, + 0x35, 0x39, 0x30, 0x35, 0x63, 0x62, 0x36, 0x61, 0x38, 0x30, 0x33, 0x37, + 0x35, 0x33, 0x66, 0x65, 0x31, 0x38, 0x29, 0x00, 0x39, 0x0f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x03, 0x2b, 0x0b, 0x62, 0x75, 0x6c, 0x6b, 0x2d, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x2b, 0x0f, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x2b, 0x08, 0x73, 0x69, + 0x67, 0x6e, 0x2d, 0x65, 0x78, 0x74 }; -unsigned int STDLIB_WASM_LEN = 14794; +unsigned int STDLIB_WASM_LEN = 15582; diff --git a/lib/src/wasm_store.c b/lib/src/wasm_store.c index cd94f6a0..fc39c3b3 100644 --- a/lib/src/wasm_store.c +++ b/lib/src/wasm_store.c @@ -16,14 +16,6 @@ #include #include -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4100) -#elif defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - #define array_len(a) (sizeof(a) / sizeof(a[0])) // The following symbols from the C and C++ standard libraries are available @@ -32,7 +24,7 @@ const char *STDLIB_SYMBOLS[] = { #include "./stdlib-symbols.txt" }; -// The contents of the `dylink.0` custom section of a Wasm module, +// The contents of the `dylink.0` custom section of a wasm module, // as specified by the current WebAssembly dynamic linking ABI proposal. typedef struct { uint32_t memory_size; @@ -43,15 +35,15 @@ typedef struct { // WasmLanguageId - A pointer used to identify a language. This language id is // reference-counted, so that its ownership can be shared between the language -// itself and the instances of the language that are held in Wasm stores. +// itself and the instances of the language that are held in wasm stores. typedef struct { volatile uint32_t ref_count; volatile uint32_t is_language_deleted; } WasmLanguageId; -// LanguageWasmModule - Additional data associated with a Wasm-backed +// LanguageWasmModule - Additional data associated with a wasm-backed // `TSLanguage`. This data is read-only and does not reference a particular -// Wasm store, so it can be shared by all users of a `TSLanguage`. A pointer to +// wasm store, so it can be shared by all users of a `TSLanguage`. A pointer to // this is stored on the language itself. typedef struct { volatile uint32_t ref_count; @@ -64,7 +56,7 @@ typedef struct { } LanguageWasmModule; // LanguageWasmInstance - Additional data associated with an instantiation of -// a `TSLanguage` in a particular Wasm store. The Wasm store holds one of +// a `TSLanguage` in a particular wasm store. The wasm store holds one of // these structs for each language that it has instantiated. typedef struct { WasmLanguageId *language_id; @@ -91,7 +83,7 @@ typedef struct { uint32_t args_sizes_get; } BuiltinFunctionIndices; -// TSWasmStore - A struct that allows a given `Parser` to use Wasm-backed +// TSWasmStore - A struct that allows a given `Parser` to use wasm-backed // languages. This struct is mutable, and can only be used by one parser at a // time. struct TSWasmStore { @@ -115,9 +107,9 @@ struct TSWasmStore { typedef Array(char) StringData; // LanguageInWasmMemory - The memory layout of a `TSLanguage` when compiled to -// wasm32. This is used to copy static language data out of the Wasm memory. +// wasm32. This is used to copy static language data out of the wasm memory. typedef struct { - uint32_t abi_version; + uint32_t version; uint32_t symbol_count; uint32_t alias_count; uint32_t token_count; @@ -153,18 +145,10 @@ typedef struct { int32_t deserialize; } external_scanner; int32_t primary_state_ids; - int32_t name; - int32_t reserved_words; - uint16_t max_reserved_word_set_size; - uint32_t supertype_count; - int32_t supertype_symbols; - int32_t supertype_map_slices; - int32_t supertype_map_entries; - TSLanguageMetadata metadata; } LanguageInWasmMemory; // LexerInWasmMemory - The memory layout of a `TSLexer` when compiled to wasm32. -// This is used to copy mutable lexing state in and out of the Wasm memory. +// This is used to copy mutable lexing state in and out of the wasm memory. typedef struct { int32_t lookahead; TSSymbol result_symbol; @@ -175,6 +159,8 @@ typedef struct { int32_t eof; } LexerInWasmMemory; +static volatile uint32_t NEXT_LANGUAGE_ID; + // Linear memory layout: // [ <-- stack | stdlib statics | lexer | language statics --> | serialization_buffer | heap --> ] #define MAX_MEMORY_SIZE (128 * 1024 * 1024 / MEMORY_PAGE_SIZE) @@ -183,7 +169,7 @@ typedef struct { * WasmDylinkMemoryInfo ***********************/ -static uint8_t read_u8(const uint8_t **p) { +static uint8_t read_u8(const uint8_t **p, const uint8_t *end) { return *(*p)++; } @@ -218,7 +204,7 @@ static bool wasm_dylink_info__parse( p += 4; while (p < end) { - uint8_t section_id = read_u8(&p); + uint8_t section_id = read_u8(&p, end); uint32_t section_length = read_uleb128(&p, end); const uint8_t *section_end = p + section_length; if (section_end > end) return false; @@ -231,7 +217,7 @@ static bool wasm_dylink_info__parse( if (name_length == 8 && memcmp(p, "dylink.0", 8) == 0) { p = name_end; while (p < section_end) { - uint8_t subsection_type = read_u8(&p); + uint8_t subsection_type = read_u8(&p, section_end); uint32_t subsection_size = read_uleb128(&p, section_end); const uint8_t *subsection_end = p + subsection_size; if (subsection_end > section_end) return false; @@ -252,7 +238,7 @@ static bool wasm_dylink_info__parse( } /******************************************* - * Native callbacks exposed to Wasm modules + * Native callbacks exposed to wasm modules *******************************************/ static wasm_trap_t *callback__abort( @@ -261,7 +247,7 @@ static bool wasm_dylink_info__parse( wasmtime_val_raw_t *args_and_results, size_t args_and_results_len ) { - return wasmtime_trap_new("Wasm module called abort", 24); + return wasmtime_trap_new("wasm module called abort", 24); } static wasm_trap_t *callback__debug_message( @@ -272,7 +258,7 @@ static wasm_trap_t *callback__debug_message( ) { wasmtime_context_t *context = wasmtime_caller_context(caller); TSWasmStore *store = env; - ts_assert(args_and_results_len == 2); + assert(args_and_results_len == 2); uint32_t string_address = args_and_results[0].i32; uint32_t value = args_and_results[1].i32; uint8_t *memory = wasmtime_memory_data(context, &store->memory); @@ -296,7 +282,7 @@ static wasm_trap_t *callback__lexer_advance( size_t args_and_results_len ) { wasmtime_context_t *context = wasmtime_caller_context(caller); - ts_assert(args_and_results_len == 2); + assert(args_and_results_len == 2); TSWasmStore *store = env; TSLexer *lexer = store->current_lexer; @@ -422,17 +408,6 @@ static void *copy_strings( return result; } -static void *copy_string( - const uint8_t *data, - int32_t address -) { - const char *string = (const char *)&data[address]; - size_t len = strlen(string); - char *result = ts_malloc(len + 1); - memcpy(result, string, len + 1); - return result; -} - static bool name_eq(const wasm_name_t *name, const char *string) { return strncmp(string, name->data, name->size) == 0; } @@ -457,7 +432,7 @@ static inline wasm_functype_t* wasm_functype_new_4_0( snprintf(*output, message_length + 1, __VA_ARGS__); \ } while (0) -WasmLanguageId *language_id_new(void) { +WasmLanguageId *language_id_new() { WasmLanguageId *self = ts_malloc(sizeof(WasmLanguageId)); self->is_language_deleted = false; self->ref_count = 1; @@ -501,13 +476,13 @@ static bool ts_wasm_store__provide_builtin_import( wasmtime_val_t value = WASM_I32_VAL(self->current_memory_offset); wasmtime_global_t global; error = wasmtime_global_new(context, self->const_i32_type, &value, &global); - ts_assert(!error); + assert(!error); *import = (wasmtime_extern_t) {.kind = WASMTIME_EXTERN_GLOBAL, .of.global = global}; } else if (name_eq(import_name, "__table_base")) { wasmtime_val_t value = WASM_I32_VAL(self->current_function_table_offset); wasmtime_global_t global; error = wasmtime_global_new(context, self->const_i32_type, &value, &global); - ts_assert(!error); + assert(!error); *import = (wasmtime_extern_t) {.kind = WASMTIME_EXTERN_GLOBAL, .of.global = global}; } else if (name_eq(import_name, "__stack_pointer")) { *import = (wasmtime_extern_t) {.kind = WASMTIME_EXTERN_GLOBAL, .of.global = self->stack_pointer_global}; @@ -555,7 +530,7 @@ static bool ts_wasm_store__call_module_initializer( wasmtime_context_t *context = wasmtime_store_context(self->store); wasmtime_func_t initialization_func = export->of.func; wasmtime_error_t *error = wasmtime_func_call(context, &initialization_func, NULL, 0, NULL, 0, trap); - ts_assert(!error); + assert(!error); return true; } else { return false; @@ -570,7 +545,6 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_trap_t *trap = NULL; wasm_message_t message = WASM_EMPTY_VEC; wasm_exporttype_vec_t export_types = WASM_EMPTY_VEC; - wasm_importtype_vec_t import_types = WASM_EMPTY_VEC; wasmtime_extern_t *imports = NULL; wasmtime_module_t *stdlib_module = NULL; wasm_memorytype_t *memory_type = NULL; @@ -654,7 +628,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { }, }; - // Create all of the Wasm functions. + // Create all of the wasm functions. unsigned builtin_definitions_len = array_len(builtin_definitions); unsigned lexer_definitions_len = array_len(lexer_definitions); for (unsigned i = 0; i < builtin_definitions_len; i++) { @@ -679,17 +653,18 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindCompile; format( &wasm_error->message, - "failed to compile Wasm stdlib: %.*s", + "failed to compile wasm stdlib: %.*s", (int)message.size, message.data ); goto error; } // Retrieve the stdlib module's imports. + wasm_importtype_vec_t import_types = WASM_EMPTY_VEC; wasmtime_module_imports(stdlib_module, &import_types); // Find the initial number of memory pages needed by the stdlib. - const wasm_memorytype_t *stdlib_memory_type = NULL; + const wasm_memorytype_t *stdlib_memory_type; for (unsigned i = 0; i < import_types.size; i++) { wasm_importtype_t *import_type = import_types.data[i]; const wasm_name_t *import_name = wasm_importtype_name(import_type); @@ -702,7 +677,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindCompile; format( &wasm_error->message, - "Wasm stdlib is missing the 'memory' import" + "wasm stdlib is missing the 'memory' import" ); goto error; } @@ -718,7 +693,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindAllocate; format( &wasm_error->message, - "failed to allocate Wasm memory: %.*s", + "failed to allocate wasm memory: %.*s", (int)message.size, message.data ); goto error; @@ -737,7 +712,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindAllocate; format( &wasm_error->message, - "failed to allocate Wasm table: %.*s", + "failed to allocate wasm table: %.*s", (int)message.size, message.data ); goto error; @@ -754,8 +729,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasmtime_val_t stack_pointer_value = WASM_I32_VAL(0); wasmtime_global_t stack_pointer_global; error = wasmtime_global_new(context, var_i32_type, &stack_pointer_value, &stack_pointer_global); - wasm_globaltype_delete(var_i32_type); - ts_assert(!error); + assert(!error); *self = (TSWasmStore) { .engine = wasmtime_engine_clone(engine), @@ -780,7 +754,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "unexpected import in Wasm stdlib: %.*s\n", + "unexpected import in wasm stdlib: %.*s\n", (int)import_name->size, import_name->data ); goto error; @@ -797,7 +771,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "failed to instantiate Wasm stdlib module: %.*s", + "failed to instantiate wasm stdlib module: %.*s", (int)message.size, message.data ); goto error; @@ -807,7 +781,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "trapped when instantiating Wasm stdlib module: %.*s", + "trapped when instantiating wasm stdlib module: %.*s", (int)message.size, message.data ); goto error; @@ -827,7 +801,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { size_t name_len; wasmtime_extern_t export = {.kind = WASM_EXTERN_GLOBAL}; bool exists = wasmtime_instance_export_nth(context, &instance, i, &export_name, &name_len, &export); - ts_assert(exists); + assert(exists); if (export.kind == WASMTIME_EXTERN_GLOBAL) { if (name_eq(name, "__stack_pointer")) { @@ -868,7 +842,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "missing malloc reset function in Wasm stdlib" + "missing malloc reset function in wasm stdlib" ); goto error; } @@ -878,7 +852,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasm_error->kind = TSWasmErrorKindInstantiate; format( &wasm_error->message, - "missing exported symbol in Wasm stdlib: %s", + "missing exported symbol in wasm stdlib: %s", STDLIB_SYMBOLS[i] ); goto error; @@ -890,14 +864,14 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { // Add all of the lexer callback functions to the function table. Store their function table // indices on the in-memory lexer. - uint64_t table_index; + uint32_t table_index; error = wasmtime_table_grow(context, &function_table, lexer_definitions_len, &initializer, &table_index); if (error) { wasmtime_error_message(error, &message); wasm_error->kind = TSWasmErrorKindAllocate; format( &wasm_error->message, - "failed to grow Wasm table to initial size: %.*s", + "failed to grow wasm table to initial size: %.*s", (int)message.size, message.data ); goto error; @@ -907,7 +881,7 @@ TSWasmStore *ts_wasm_store_new(TSWasmEngine *engine, TSWasmError *wasm_error) { wasmtime_func_t func = {function_table.store_id, *definition->storage_location}; wasmtime_val_t func_val = {.kind = WASMTIME_FUNCREF, .of.funcref = func}; error = wasmtime_table_set(context, &function_table, table_index, &func_val); - ts_assert(!error); + assert(!error); *(int32_t *)(definition->storage_location) = table_index; table_index++; } @@ -947,7 +921,7 @@ void ts_wasm_store_delete(TSWasmStore *self) { wasmtime_store_delete(self->store); wasm_engine_delete(self->engine); for (unsigned i = 0; i < self->language_instances.size; i++) { - LanguageWasmInstance *instance = array_get(&self->language_instances, i); + LanguageWasmInstance *instance = &self->language_instances.contents[i]; language_id_delete(instance->language_id); } array_delete(&self->language_instances); @@ -957,7 +931,7 @@ void ts_wasm_store_delete(TSWasmStore *self) { size_t ts_wasm_store_language_count(const TSWasmStore *self) { size_t result = 0; for (unsigned i = 0; i < self->language_instances.size; i++) { - const WasmLanguageId *id = array_get(&self->language_instances, i)->language_id; + const WasmLanguageId *id = self->language_instances.contents[i].language_id; if (!id->is_language_deleted) { result++; } @@ -991,7 +965,7 @@ static bool ts_wasm_store__instantiate( // Grow the function table to make room for the new functions. wasmtime_val_t initializer = {.kind = WASMTIME_FUNCREF}; - uint64_t prev_table_size; + uint32_t prev_table_size; error = wasmtime_table_grow(context, &self->function_table, dylink_info->table_size, &initializer, &prev_table_size); if (error) { format(error_message, "invalid function table size %u", dylink_info->table_size); @@ -1064,7 +1038,7 @@ static bool ts_wasm_store__instantiate( wasmtime_error_message(error, &message); format( error_message, - "error instantiating Wasm module: %.*s\n", + "error instantiating wasm module: %.*s\n", (int)message.size, message.data ); goto error; @@ -1073,7 +1047,7 @@ static bool ts_wasm_store__instantiate( wasm_trap_message(trap, &message); format( error_message, - "trap when instantiating Wasm module: %.*s\n", + "trap when instantiating wasm module: %.*s\n", (int)message.size, message.data ); goto error; @@ -1095,7 +1069,7 @@ static bool ts_wasm_store__instantiate( char *export_name; wasmtime_extern_t export = {.kind = WASM_EXTERN_GLOBAL}; bool exists = wasmtime_instance_export_nth(context, &instance, i, &export_name, &name_len, &export); - ts_assert(exists); + assert(exists); // If the module exports an initialization or data-relocation function, call it. if (ts_wasm_store__call_module_initializer(self, name, &export, &trap)) { @@ -1131,7 +1105,7 @@ static bool ts_wasm_store__instantiate( wasmtime_func_t language_func = language_extern.of.func; wasmtime_val_t language_address_val; error = wasmtime_func_call(context, &language_func, NULL, 0, &language_address_val, 1, &trap); - ts_assert(!error); + assert(!error); if (trap) { wasm_trap_message(trap, &message); format( @@ -1183,17 +1157,17 @@ const TSLanguage *ts_wasm_store_load_language( if (!wasm_dylink_info__parse((const unsigned char *)wasm, wasm_len, &dylink_info)) { wasm_error->kind = TSWasmErrorKindParse; - format(&wasm_error->message, "failed to parse dylink section of Wasm module"); + format(&wasm_error->message, "failed to parse dylink section of wasm module"); goto error; } - // Compile the Wasm code. + // Compile the wasm code. error = wasmtime_module_new(self->engine, (const uint8_t *)wasm, wasm_len, &module); if (error) { wasm_message_t message; wasmtime_error_message(error, &message); wasm_error->kind = TSWasmErrorKindCompile; - format(&wasm_error->message, "error compiling Wasm module: %.*s", (int)message.size, message.data); + format(&wasm_error->message, "error compiling wasm module: %.*s", (int)message.size, message.data); wasm_byte_vec_delete(&message); goto error; } @@ -1214,39 +1188,38 @@ const TSLanguage *ts_wasm_store_load_language( goto error; } - // Copy all of the static data out of the language object in Wasm memory, + // Copy all of the static data out of the language object in wasm memory, // constructing a native language object. LanguageInWasmMemory wasm_language; wasmtime_context_t *context = wasmtime_store_context(self->store); const uint8_t *memory = wasmtime_memory_data(context, &self->memory); memcpy(&wasm_language, &memory[language_address], sizeof(LanguageInWasmMemory)); - bool has_supertypes = - wasm_language.abi_version > LANGUAGE_VERSION_WITH_RESERVED_WORDS && - wasm_language.supertype_count > 0; + if (wasm_language.version < LANGUAGE_VERSION_USABLE_VIA_WASM) { + wasm_error->kind = TSWasmErrorKindInstantiate; + format(&wasm_error->message, "language version %u is too old for wasm", wasm_language.version); + goto error; + } int32_t addresses[] = { - wasm_language.parse_table, - wasm_language.small_parse_table, - wasm_language.small_parse_table_map, - wasm_language.parse_actions, - wasm_language.symbol_names, - wasm_language.field_names, - wasm_language.field_map_slices, - wasm_language.field_map_entries, - wasm_language.symbol_metadata, - wasm_language.public_symbol_map, wasm_language.alias_map, wasm_language.alias_sequences, - wasm_language.lex_modes, - wasm_language.lex_fn, + wasm_language.field_map_entries, + wasm_language.field_map_slices, + wasm_language.field_names, wasm_language.keyword_lex_fn, + wasm_language.lex_fn, + wasm_language.lex_modes, + wasm_language.parse_actions, + wasm_language.parse_table, wasm_language.primary_state_ids, - wasm_language.name, - wasm_language.reserved_words, - has_supertypes ? wasm_language.supertype_symbols : 0, - has_supertypes ? wasm_language.supertype_map_entries : 0, - has_supertypes ? wasm_language.supertype_map_slices : 0, + wasm_language.primary_state_ids, + wasm_language.public_symbol_map, + wasm_language.small_parse_table, + wasm_language.small_parse_table_map, + wasm_language.symbol_metadata, + wasm_language.symbol_metadata, + wasm_language.symbol_names, wasm_language.external_token_count > 0 ? wasm_language.external_scanner.states : 0, wasm_language.external_token_count > 0 ? wasm_language.external_scanner.symbol_map : 0, wasm_language.external_token_count > 0 ? wasm_language.external_scanner.create : 0, @@ -1264,7 +1237,7 @@ const TSLanguage *ts_wasm_store_load_language( StringData field_name_buffer = array_new(); *language = (TSLanguage) { - .abi_version = wasm_language.abi_version, + .version = wasm_language.version, .symbol_count = wasm_language.symbol_count, .alias_count = wasm_language.alias_count, .token_count = wasm_language.token_count, @@ -1273,10 +1246,8 @@ const TSLanguage *ts_wasm_store_load_language( .large_state_count = wasm_language.large_state_count, .production_id_count = wasm_language.production_id_count, .field_count = wasm_language.field_count, - .supertype_count = wasm_language.supertype_count, .max_alias_sequence_length = wasm_language.max_alias_sequence_length, .keyword_capture_token = wasm_language.keyword_capture_token, - .metadata = wasm_language.metadata, .parse_table = copy( &memory[wasm_language.parse_table], wasm_language.large_state_count * wasm_language.symbol_count * sizeof(uint16_t) @@ -1303,21 +1274,21 @@ const TSLanguage *ts_wasm_store_load_language( ), .lex_modes = copy( &memory[wasm_language.lex_modes], - wasm_language.state_count * sizeof(TSLexerMode) + wasm_language.state_count * sizeof(TSLexMode) ), }; if (language->field_count > 0 && language->production_id_count > 0) { language->field_map_slices = copy( &memory[wasm_language.field_map_slices], - wasm_language.production_id_count * sizeof(TSMapSlice) + wasm_language.production_id_count * sizeof(TSFieldMapSlice) ); // Determine the number of field map entries by finding the greatest index // in any of the slices. uint32_t field_map_entry_count = 0; for (uint32_t i = 0; i < wasm_language.production_id_count; i++) { - TSMapSlice slice = language->field_map_slices[i]; + TSFieldMapSlice slice = language->field_map_slices[i]; uint32_t slice_end = slice.index + slice.length; if (slice_end > field_map_entry_count) { field_map_entry_count = slice_end; @@ -1336,37 +1307,6 @@ const TSLanguage *ts_wasm_store_load_language( ); } - if (has_supertypes) { - language->supertype_symbols = copy( - &memory[wasm_language.supertype_symbols], - wasm_language.supertype_count * sizeof(TSSymbol) - ); - - // Determine the number of supertype map slices by finding the greatest - // supertype ID. - int largest_supertype = 0; - for (unsigned i = 0; i < language->supertype_count; i++) { - TSSymbol supertype = language->supertype_symbols[i]; - if (supertype > largest_supertype) { - largest_supertype = supertype; - } - } - - language->supertype_map_slices = copy( - &memory[wasm_language.supertype_map_slices], - (largest_supertype + 1) * sizeof(TSMapSlice) - ); - - TSSymbol last_supertype = language->supertype_symbols[language->supertype_count - 1]; - TSMapSlice last_slice = language->supertype_map_slices[last_supertype]; - uint32_t supertype_map_entry_count = last_slice.index + last_slice.length; - - language->supertype_map_entries = copy( - &memory[wasm_language.supertype_map_entries], - supertype_map_entry_count * sizeof(char *) - ); - } - if (language->max_alias_sequence_length > 0 && language->production_id_count > 0) { // The alias map contains symbols, alias counts, and aliases, terminated by a null symbol. int32_t alias_map_size = 0; @@ -1377,12 +1317,11 @@ const TSLanguage *ts_wasm_store_load_language( if (symbol == 0) break; uint16_t value_count; memcpy(&value_count, &memory[wasm_language.alias_map + alias_map_size], sizeof(value_count)); - alias_map_size += sizeof(uint16_t); alias_map_size += value_count * sizeof(TSSymbol); } language->alias_map = copy( &memory[wasm_language.alias_map], - alias_map_size + alias_map_size * sizeof(TSSymbol) ); language->alias_sequences = copy( &memory[wasm_language.alias_sequences], @@ -1404,22 +1343,13 @@ const TSLanguage *ts_wasm_store_load_language( ); } - if (language->abi_version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) { + if (language->version >= LANGUAGE_VERSION_WITH_PRIMARY_STATES) { language->primary_state_ids = copy( &memory[wasm_language.primary_state_ids], wasm_language.state_count * sizeof(TSStateId) ); } - if (language->abi_version >= LANGUAGE_VERSION_WITH_RESERVED_WORDS) { - language->name = copy_string(memory, wasm_language.name); - language->reserved_words = copy( - &memory[wasm_language.reserved_words], - wasm_language.max_reserved_word_set_size * sizeof(TSSymbol) - ); - language->max_reserved_word_set_size = wasm_language.max_reserved_word_set_size; - } - if (language->external_token_count > 0) { language->external_scanner.symbol_map = copy( &memory[wasm_language.external_scanner.symbol_map], @@ -1444,15 +1374,15 @@ const TSLanguage *ts_wasm_store_load_language( .ref_count = 1, }; - // The lex functions are not used for Wasm languages. Use those two fields - // to mark this language as Wasm-based and to store the language's - // Wasm-specific data. + // The lex functions are not used for wasm languages. Use those two fields + // to mark this language as WASM-based and to store the language's + // WASM-specific data. language->lex_fn = ts_wasm_store__sentinel_lex_fn; - language->keyword_lex_fn = (bool (*)(TSLexer *, TSStateId))language_module; + language->keyword_lex_fn = (void *)language_module; // Clear out any instances of languages that have been deleted. for (unsigned i = 0; i < self->language_instances.size; i++) { - WasmLanguageId *id = array_get(&self->language_instances, i)->language_id; + WasmLanguageId *id = self->language_instances.contents[i].language_id; if (id->is_language_deleted) { language_id_delete(id); array_erase(&self->language_instances, i); @@ -1493,7 +1423,7 @@ bool ts_wasm_store_add_language( // instances of languages that have been deleted. bool exists = false; for (unsigned i = 0; i < self->language_instances.size; i++) { - WasmLanguageId *id = array_get(&self->language_instances, i)->language_id; + WasmLanguageId *id = self->language_instances.contents[i].language_id; if (id->is_language_deleted) { language_id_delete(id); array_erase(&self->language_instances, i); @@ -1556,15 +1486,15 @@ void ts_wasm_store_reset_heap(TSWasmStore *self) { }; wasmtime_error_t *error = wasmtime_func_call(context, &func, args, 1, NULL, 0, &trap); - ts_assert(!error); - ts_assert(!trap); + assert(!error); + assert(!trap); } bool ts_wasm_store_start(TSWasmStore *self, TSLexer *lexer, const TSLanguage *language) { uint32_t instance_index; if (!ts_wasm_store_add_language(self, language, &instance_index)) return false; self->current_lexer = lexer; - self->current_instance = array_get(&self->language_instances, instance_index); + self->current_instance = &self->language_instances.contents[instance_index]; self->has_error = false; ts_wasm_store_reset_heap(self); return true; @@ -1586,8 +1516,8 @@ static void ts_wasm_store__call( wasmtime_context_t *context = wasmtime_store_context(self->store); wasmtime_val_t value; bool succeeded = wasmtime_table_get(context, &self->function_table, function_index, &value); - ts_assert(succeeded); - ts_assert(value.kind == WASMTIME_FUNCREF); + assert(succeeded); + assert(value.kind == WASMTIME_FUNCREF); wasmtime_func_t func = value.of.funcref; wasm_trap_t *trap = NULL; @@ -1597,7 +1527,7 @@ static void ts_wasm_store__call( // wasmtime_error_message(error, &message); // fprintf( // stderr, - // "error in Wasm module: %.*s\n", + // "error in wasm module: %.*s\n", // (int)message.size, message.data // ); wasmtime_error_delete(error); @@ -1607,7 +1537,7 @@ static void ts_wasm_store__call( // wasm_trap_message(trap, &message); // fprintf( // stderr, - // "trap in Wasm module: %.*s\n", + // "trap in wasm module: %.*s\n", // (int)message.size, message.data // ); wasm_trap_delete(trap); @@ -1615,22 +1545,13 @@ static void ts_wasm_store__call( } } -// The data fields of TSLexer, without the function pointers. -// -// This portion of the struct needs to be copied in and out -// of Wasm memory before and after calling a scan function. -typedef struct { - int32_t lookahead; - TSSymbol result_symbol; -} TSLexerDataPrefix; - static bool ts_wasm_store__call_lex_function(TSWasmStore *self, unsigned function_index, TSStateId state) { wasmtime_context_t *context = wasmtime_store_context(self->store); uint8_t *memory_data = wasmtime_memory_data(context, &self->memory); memcpy( &memory_data[self->lexer_address], - self->current_lexer, - sizeof(TSLexerDataPrefix) + &self->current_lexer->lookahead, + sizeof(self->current_lexer->lookahead) ); wasmtime_val_raw_t args[2] = { @@ -1642,9 +1563,9 @@ static bool ts_wasm_store__call_lex_function(TSWasmStore *self, unsigned functio bool result = args[0].i32; memcpy( - self->current_lexer, + &self->current_lexer->lookahead, &memory_data[self->lexer_address], - sizeof(TSLexerDataPrefix) + sizeof(self->current_lexer->lookahead) + sizeof(self->current_lexer->result_symbol) ); return result; } @@ -1689,8 +1610,8 @@ bool ts_wasm_store_call_scanner_scan( memcpy( &memory_data[self->lexer_address], - self->current_lexer, - sizeof(TSLexerDataPrefix) + &self->current_lexer->lookahead, + sizeof(self->current_lexer->lookahead) ); uint32_t valid_tokens_address = @@ -1705,9 +1626,9 @@ bool ts_wasm_store_call_scanner_scan( if (self->has_error) return false; memcpy( - self->current_lexer, + &self->current_lexer->lookahead, &memory_data[self->lexer_address], - sizeof(TSLexerDataPrefix) + sizeof(self->current_lexer->lookahead) + sizeof(self->current_lexer->result_symbol) ); return args[0].i32; } @@ -1784,16 +1705,16 @@ static inline LanguageWasmModule *ts_language__wasm_module(const TSLanguage *sel void ts_wasm_language_retain(const TSLanguage *self) { LanguageWasmModule *module = ts_language__wasm_module(self); - ts_assert(module->ref_count > 0); + assert(module->ref_count > 0); atomic_inc(&module->ref_count); } void ts_wasm_language_release(const TSLanguage *self) { LanguageWasmModule *module = ts_language__wasm_module(self); - ts_assert(module->ref_count > 0); + assert(module->ref_count > 0); if (atomic_dec(&module->ref_count) == 0) { - // Update the language id to reflect that the language is deleted. This allows any Wasm stores - // that hold Wasm instances for this language to delete those instances. + // Update the language id to reflect that the language is deleted. This allows any wasm stores + // that hold wasm instances for this language to delete those instances. atomic_inc(&module->language_id->is_language_deleted); language_id_delete(module->language_id); @@ -1808,13 +1729,8 @@ void ts_wasm_language_release(const TSLanguage *self) { ts_free((void *)self->external_scanner.symbol_map); ts_free((void *)self->field_map_entries); ts_free((void *)self->field_map_slices); - ts_free((void *)self->supertype_symbols); - ts_free((void *)self->supertype_map_entries); - ts_free((void *)self->supertype_map_slices); ts_free((void *)self->field_names); ts_free((void *)self->lex_modes); - ts_free((void *)self->name); - ts_free((void *)self->reserved_words); ts_free((void *)self->parse_actions); ts_free((void *)self->parse_table); ts_free((void *)self->primary_state_ids); @@ -1827,16 +1743,10 @@ void ts_wasm_language_release(const TSLanguage *self) { } } -#ifdef _MSC_VER -#pragma warning(pop) -#elif defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - #else -// If the Wasm feature is not enabled, define dummy versions of all of the -// Wasm-related functions. +// If the WASM feature is not enabled, define dummy versions of all of the +// wasm-related functions. void ts_wasm_store_delete(TSWasmStore *self) { (void)self; diff --git a/lib/src/wasm_store.h b/lib/src/wasm_store.h index 0fd17e0d..212f30d6 100644 --- a/lib/src/wasm_store.h +++ b/lib/src/wasm_store.h @@ -8,21 +8,21 @@ extern "C" { #include "tree_sitter/api.h" #include "./parser.h" -bool ts_wasm_store_start(TSWasmStore *self, TSLexer *lexer, const TSLanguage *language); -void ts_wasm_store_reset(TSWasmStore *self); -bool ts_wasm_store_has_error(const TSWasmStore *self); +bool ts_wasm_store_start(TSWasmStore *, TSLexer *, const TSLanguage *); +void ts_wasm_store_reset(TSWasmStore *); +bool ts_wasm_store_has_error(const TSWasmStore *); -bool ts_wasm_store_call_lex_main(TSWasmStore *self, TSStateId state); -bool ts_wasm_store_call_lex_keyword(TSWasmStore *self, TSStateId state); +bool ts_wasm_store_call_lex_main(TSWasmStore *, TSStateId); +bool ts_wasm_store_call_lex_keyword(TSWasmStore *, TSStateId); -uint32_t ts_wasm_store_call_scanner_create(TSWasmStore *self); -void ts_wasm_store_call_scanner_destroy(TSWasmStore *self, uint32_t scanner_address); -bool ts_wasm_store_call_scanner_scan(TSWasmStore *self, uint32_t scanner_address, uint32_t valid_tokens_ix); -uint32_t ts_wasm_store_call_scanner_serialize(TSWasmStore *self, uint32_t scanner_address, char *buffer); -void ts_wasm_store_call_scanner_deserialize(TSWasmStore *self, uint32_t scanner, const char *buffer, unsigned length); +uint32_t ts_wasm_store_call_scanner_create(TSWasmStore *); +void ts_wasm_store_call_scanner_destroy(TSWasmStore *, uint32_t); +bool ts_wasm_store_call_scanner_scan(TSWasmStore *, uint32_t, uint32_t); +uint32_t ts_wasm_store_call_scanner_serialize(TSWasmStore *, uint32_t, char *); +void ts_wasm_store_call_scanner_deserialize(TSWasmStore *, uint32_t, const char *, unsigned); -void ts_wasm_language_retain(const TSLanguage *self); -void ts_wasm_language_release(const TSLanguage *self); +void ts_wasm_language_retain(const TSLanguage *); +void ts_wasm_language_release(const TSLanguage *); #ifdef __cplusplus } diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000..4fd08b8e --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,6 @@ +comment_width = 100 +format_code_in_doc_comments = true +format_macro_matchers = true +imports_granularity = "Crate" +group_imports = "StdExternalCrate" +wrap_comments = true diff --git a/script/benchmark b/script/benchmark new file mode 100755 index 00000000..1fd08f28 --- /dev/null +++ b/script/benchmark @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +set -e + +function usage { + cat < /dev/null | + jq -rs 'map(select(.target.name == "benchmark" and .executable))[0].executable' + ) + env | grep TREE_SITTER + echo "$test_binary" +else + exec cargo bench benchmark -p tree-sitter-cli +fi diff --git a/script/benchmark.cmd b/script/benchmark.cmd new file mode 100644 index 00000000..fff4c885 --- /dev/null +++ b/script/benchmark.cmd @@ -0,0 +1,4 @@ +@echo off + +cargo bench benchmark -p tree-sitter-cli +exit /b %errorlevel% diff --git a/script/build-fuzzers b/script/build-fuzzers new file mode 100755 index 00000000..439221bd --- /dev/null +++ b/script/build-fuzzers @@ -0,0 +1,76 @@ +#!/usr/bin/env bash + +# shellcheck disable=SC2086 + +set -e + +if [[ $(uname -s) != Linux ]]; then + printf 'Fuzzing is only supported on Linux\n' >&2 + exit 1 +fi + +CC=${CC:-clang} +CXX=${CXX:-clang++} + +default_fuzz_flags=-fsanitize=fuzzer,address,undefined + +export CFLAGS="$default_fuzz_flags $CFLAGS" +export CXXFLAGS="$default_fuzz_flags $CXXFLAGS" + +make CC="$CC" CXX="$CXX" libtree-sitter.a + +if [[ -z $* ]]; then + mapfile -t languages < <(ls test/fixtures/grammars) +else + languages=("$@") +fi + +mkdir -p test/fuzz/out + +for lang in "${languages[@]}"; do + # skip typescript & php + if [[ $lang == typescript || $lang == php ]]; then + continue + fi + printf 'Building %s fuzzer...\n' "$lang" + lang_dir="test/fixtures/grammars/$lang" + lang_grammar="${lang_dir}/src/grammar.json" + + # The following assumes each language is implemented as src/parser.c plus an + # optional scanner in src/scanner.c + objects=() + + lang_scanner="${lang_dir}/src/scanner" + if [[ -f "${lang_scanner}.c" ]]; then + $CC $CFLAGS -std=c11 -g -O1 -I "${lang_dir}/src" -c "${lang_scanner}.c" -o "${lang_scanner}.o" + objects+=("${lang_scanner}.o") + fi + + # Compiling with -O0 speeds up the build dramatically + $CC $CFLAGS -g -O0 -I "${lang_dir}/src" "${lang_dir}/src/parser.c" -c -o "${lang_dir}/src/parser.o" + objects+=("${lang_dir}/src/parser.o") + + highlights_filename="${lang_dir}/queries/highlights.scm" + if [[ -f "${highlights_filename}" ]]; then + ts_lang_query_filename="${lang}.scm" + cp "${highlights_filename}" "test/fuzz/out/${ts_lang_query_filename}" + else + ts_lang_query_filename="" + fi + + ts_lang="tree_sitter_$(jq -r .name "$lang_grammar")" + $CXX $CXXFLAGS -std=c++11 -Ilib/include \ + -D TS_LANG="$ts_lang" \ + -D TS_LANG_QUERY_FILENAME="\"${ts_lang_query_filename}\"" \ + test/fuzz/fuzzer.cc \ + "${objects[@]}" \ + libtree-sitter.a \ + -o "test/fuzz/out/${lang}_fuzzer" + + jq ' + [ .. + | if .type? == "STRING" or (.type? == "ALIAS" and .named? == false) then .value else empty end + | select(test("\\S") and length == utf8bytelength) + ] | unique | .[] + ' "$lang_grammar" | sort > "test/fuzz/out/${lang}.dict" +done diff --git a/script/build-wasm b/script/build-wasm new file mode 100755 index 00000000..19e22412 --- /dev/null +++ b/script/build-wasm @@ -0,0 +1,145 @@ +#!/usr/bin/env bash + +usage() { + cat < 0)); do + case "$1" in + --debug) + emscripten_flags=(-s ASSERTIONS=1 -s SAFE_HEAP=1 -O0 -g) + ;; + + --help) + usage + exit 0 + ;; + + --docker) + force_docker=1 + ;; + + -v|--verbose) + verbose=1 + ;; + + *) + usage + printf "Unrecognized argument '%s'\n" "$1" >&2 + exit 1 + ;; + esac + shift +done + +if [[ $verbose == 1 ]]; then + emscripten_flags+=(-s VERBOSE=1 -v) +fi + +emcc= +docker= +if [[ $force_docker == 0 ]] && command -v emcc > /dev/null; then + emcc=emcc +elif command -v docker > /dev/null; then + # detect which one to use + docker=docker +elif command -v podman > /dev/null; then + docker=podman +fi + +if [[ -z $emcc ]] && [[ -n $docker ]]; then + if [[ $docker == podman ]]; then + export PODMAN_USERNS=keep-id + fi + emcc="$docker run \ + --rm \ + -v $PWD:/src:Z \ + -u $UID \ + emscripten/emsdk:$EMSCRIPTEN_VERSION \ + emcc" +fi + +if [[ -z $emcc ]]; then + if [[ $force_docker == 1 ]]; then + # shellcheck disable=SC2016 + printf 'You must have `docker` or `podman` in your PATH to run this script with --docker\n' >&2 + else + # shellcheck disable=SC2016 + printf 'You must have either `docker`, `podman`, or `emcc` in your PATH to run this script\n' >&2 + fi + exit 1 +fi + +mkdir -p target/scratch + +runtime_methods=stringToUTF16,AsciiToString + +# Remove quotes, add leading underscores, remove newlines, remove trailing comma. +exported_functions=$( + cat ${SRC_DIR}/wasm/stdlib-symbols.txt ${WEB_DIR}/exports.txt | + sed -e 's/"//g;s/^/_/g' | tr -d '\n' | sed -e 's/,$//' +) + +# Use emscripten to generate `tree-sitter.js` and `tree-sitter.wasm` +# in the `target/scratch` directory +$emcc \ + -s WASM=1 \ + -s INITIAL_MEMORY=33554432 \ + -s ALLOW_MEMORY_GROWTH=1 \ + -s SUPPORT_BIG_ENDIAN=1 \ + -s MAIN_MODULE=2 \ + -s FILESYSTEM=0 \ + -s NODEJS_CATCH_EXIT=0 \ + -s NODEJS_CATCH_REJECTION=0 \ + -s EXPORTED_FUNCTIONS="${exported_functions}" \ + -s EXPORTED_RUNTIME_METHODS=$runtime_methods \ + "${emscripten_flags[@]}" \ + -fno-exceptions \ + -std=c11 \ + -D 'fprintf(...)=' \ + -D NDEBUG= \ + -I ${SRC_DIR} \ + -I lib/include \ + --js-library ${WEB_DIR}/imports.js \ + --pre-js ${WEB_DIR}/prefix.js \ + --post-js ${WEB_DIR}/binding.js \ + --post-js ${WEB_DIR}/suffix.js \ + lib/src/lib.c \ + ${WEB_DIR}/binding.c \ + -o target/scratch/tree-sitter.js + +mv target/scratch/tree-sitter.js ${WEB_DIR}/tree-sitter.js +mv target/scratch/tree-sitter.wasm ${WEB_DIR}/tree-sitter.wasm diff --git a/script/build-wasm-stdlib b/script/build-wasm-stdlib new file mode 100755 index 00000000..9ef904c2 --- /dev/null +++ b/script/build-wasm-stdlib @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +set -e + +declare -a EXPORT_FLAGS +while read -r -d, function; do + EXPORT_FLAGS+=("-Wl,--export=${function:1:-1}") +done < lib/src/wasm/stdlib-symbols.txt + +target/wasi-sdk-21.0/bin/clang-17 \ + -o stdlib.wasm \ + -Os \ + -fPIC \ + -Wl,--no-entry \ + -Wl,--stack-first \ + -Wl,-z -Wl,stack-size=65536 \ + -Wl,--import-undefined \ + -Wl,--import-memory \ + -Wl,--import-table \ + -Wl,--strip-debug \ + -Wl,--export=reset_heap \ + -Wl,--export=__wasm_call_ctors \ + -Wl,--export=__stack_pointer \ + "${EXPORT_FLAGS[@]}" \ + lib/src/wasm/stdlib.c + +xxd -C -i stdlib.wasm > lib/src/wasm/wasm-stdlib.h +mv stdlib.wasm target/ diff --git a/script/check-mallocs b/script/check-mallocs new file mode 100755 index 00000000..cf0aeff5 --- /dev/null +++ b/script/check-mallocs @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +src_dir=lib/src +allocation_functions=(malloc calloc realloc free) + +for function in "${allocation_functions[@]}"; do + usages=$(grep -n -E "\b${function}\(" -r $src_dir --exclude alloc.c --exclude stdlib.c) + if [[ -n $usages ]]; then + printf 'The %s function should not be called directly, but is called here:\n%s\n' "$function" "$usages" >&2 + exit 1 + fi +done diff --git a/.github/cliff.toml b/script/cliff.toml similarity index 92% rename from .github/cliff.toml rename to script/cliff.toml index 5e0bc8e2..95204113 100644 --- a/.github/cliff.toml +++ b/script/cliff.toml @@ -16,13 +16,13 @@ body = """ {% for commit in commits%}\ {% if not commit.scope %}\ - {{ commit.message | upper_first }}\ - {% if commit.remote.pr_number %} (){%- endif %} + {% if commit.github.pr_number %} (){%- endif %} {% endif %}\ {% endfor %}\ {% for group, commits in commits | group_by(attribute="scope") %}\ {% for commit in commits %}\ - **{{commit.scope}}**: {{ commit.message | upper_first }}\ - {% if commit.remote.pr_number %} (){%- endif %} + {% if commit.github.pr_number %} (){%- endif %} {% endfor %}\ {% endfor %} {% endfor %} diff --git a/script/fetch-emscripten b/script/fetch-emscripten new file mode 100755 index 00000000..772c9ec5 --- /dev/null +++ b/script/fetch-emscripten @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -e + +EMSDK_DIR=target/emsdk +EMSCRIPTEN_VERSION=$(< cli/loader/emscripten-version) + +{ + if [[ ! -f $EMSDK_DIR/emsdk ]]; then + printf 'Downloading emscripten SDK...\n' + git clone https://github.com/emscripten-core/emsdk.git $EMSDK_DIR + fi + + cd $EMSDK_DIR + + printf 'Updating emscripten SDK...\n' + git reset --hard + git pull + ./emsdk list + + printf 'Installing emscripten...\n' + ./emsdk install "$EMSCRIPTEN_VERSION" + + printf 'Activating emscripten...\n' + ./emsdk activate "$EMSCRIPTEN_VERSION" +} >&2 diff --git a/script/fetch-fixtures b/script/fetch-fixtures new file mode 100755 index 00000000..14e32759 --- /dev/null +++ b/script/fetch-fixtures @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +set -e + +GRAMMARS_DIR="$PWD/test/fixtures/grammars" + +fetch_grammar() { + local grammar=$1 + local ref=$2 + local grammar_dir="${GRAMMARS_DIR}/${grammar}" + local grammar_url=https://github.com/tree-sitter/tree-sitter-${grammar} + + printf 'Updating %s grammar...\n' "$grammar" + + if [[ ! -d "$grammar_dir" ]]; then + git clone "$grammar_url" "$grammar_dir" --depth=1 + fi + + git -C "$grammar_dir" fetch origin "$ref" --depth=1 + git -C "$grammar_dir" reset --hard FETCH_HEAD +} + +fetch_grammar bash master +fetch_grammar c master +fetch_grammar cpp master +fetch_grammar embedded-template master +fetch_grammar go master +fetch_grammar html master +fetch_grammar java master +fetch_grammar javascript master +fetch_grammar jsdoc master +fetch_grammar json master +fetch_grammar php master +fetch_grammar python master +fetch_grammar ruby master +fetch_grammar rust master +fetch_grammar typescript master diff --git a/script/fetch-fixtures.cmd b/script/fetch-fixtures.cmd new file mode 100644 index 00000000..32727b0c --- /dev/null +++ b/script/fetch-fixtures.cmd @@ -0,0 +1,32 @@ +@echo off + +call:fetch_grammar bash master +call:fetch_grammar c master +call:fetch_grammar cpp master +call:fetch_grammar embedded-template master +call:fetch_grammar go master +call:fetch_grammar html master +call:fetch_grammar java master +call:fetch_grammar javascript master +call:fetch_grammar jsdoc master +call:fetch_grammar json master +call:fetch_grammar php master +call:fetch_grammar python master +call:fetch_grammar ruby master +call:fetch_grammar rust master +call:fetch_grammar typescript master +exit /B 0 + +:fetch_grammar +setlocal +set grammar_dir=test\fixtures\grammars\%~1 +set grammar_url=https://github.com/tree-sitter/tree-sitter-%~1 +set grammar_branch=%~2 +@if not exist %grammar_dir% ( + git clone %grammar_url% %grammar_dir% --depth=1 +) +pushd %grammar_dir% +git fetch origin %2 --depth=1 +git reset --hard FETCH_HEAD +popd +exit /B 0 diff --git a/script/generate-bindings b/script/generate-bindings new file mode 100755 index 00000000..a0022d8f --- /dev/null +++ b/script/generate-bindings @@ -0,0 +1,44 @@ +#!/bin/bash + +output_path=lib/binding_rust/bindings.rs +header_path=lib/include/tree_sitter/api.h +no_derive_copy=( + TSInput + TSLanguage + TSLogger + TSLookaheadIterator + TSParser + TSTree + TSQuery + TSQueryCursor + TSQueryCapture + TSQueryMatch + TSQueryPredicateStep +) +no_copy=$(IFS='|'; echo "${no_derive_copy[*]}") + +file_version=$(head -n1 "$output_path" | cut -d' ' -f6) +tool_version=$(bindgen --version | cut -d' ' -f2) +higher_version=$(printf '%s\n' "$file_version" "$tool_version" | sort -V | tail -n1) + +if [[ "$higher_version" != "$tool_version" ]]; then + printf 'Latest used bindgen version was %s\n' "$file_version" >&2 + printf 'Currently installed bindgen CLI version is %s\n\n' "$tool_version" >&2 + # shellcheck disable=SC2016 + printf 'You must upgrade bindgen CLI first with `cargo install bindgen-cli`\n' >&2 + exit 1 +fi + +bindgen \ + --no-layout-tests \ + --allowlist-type '^TS.*' \ + --allowlist-function '^ts_.*' \ + --allowlist-var '^TREE_SITTER.*' \ + --blocklist-type '^__.*' \ + --no-prepend-enum-name \ + --no-copy "$no_copy" \ + --use-core \ + "$header_path" \ + -- \ + -D TREE_SITTER_FEATURE_WASM \ + > "$output_path" diff --git a/script/generate-fixtures b/script/generate-fixtures new file mode 100755 index 00000000..29cfa2be --- /dev/null +++ b/script/generate-fixtures @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -e + +ROOT_DIR="$PWD" +GRAMMARS_DIR="$ROOT_DIR/test/fixtures/grammars" + +if [[ $CI == true ]]; then + set -x +else + cargo build --release + TREE_SITTER="$ROOT_DIR/target/release/tree-sitter" +fi + +filter_grammar_name="$1" + +while read -r grammar_file; do + grammar_dir="${grammar_file%/*}" + grammar_name="${grammar_dir##*/}" + + if [[ -n $filter_grammar_name && "$filter_grammar_name" != "$grammar_name" ]]; then + continue + fi + + printf 'Regenerating %s parser\n' "$grammar_name" + (cd "$grammar_dir" && "$TREE_SITTER" generate src/grammar.json --no-bindings --abi=latest) +done < <(find "$GRAMMARS_DIR" -name grammar.js -not -path '*/node_modules/*') diff --git a/script/generate-fixtures-wasm b/script/generate-fixtures-wasm new file mode 100755 index 00000000..353594ec --- /dev/null +++ b/script/generate-fixtures-wasm @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -e + +ROOT_DIR="$PWD" +GRAMMARS_DIR="$ROOT_DIR/test/fixtures/grammars" + +if [[ $CI == true ]]; then + set -x +else + cargo build --release + TREE_SITTER="$ROOT_DIR/target/release/tree-sitter" +fi + +build_wasm_args= +if [[ $1 == --docker ]]; then + build_wasm_args=--docker + shift +fi + +filter_grammar_name="$1" + +while read -r grammar_file; do + grammar_dir="${grammar_file%/*}" + grammar_name="${grammar_dir##*/}" + + if [[ -n $filter_grammar_name && "$filter_grammar_name" != "$grammar_name" ]]; then + continue + fi + + printf 'Compiling %s parser to wasm\n' "$grammar_name" + "$TREE_SITTER" build --wasm $build_wasm_args -o "target/release/tree-sitter-${grammar_name}.wasm" "$grammar_dir" +done < <(find "$GRAMMARS_DIR" -name grammar.js -not -path '*/node_modules/*') diff --git a/script/generate-fixtures.cmd b/script/generate-fixtures.cmd new file mode 100644 index 00000000..6d11a3a3 --- /dev/null +++ b/script/generate-fixtures.cmd @@ -0,0 +1,13 @@ +@echo off + +setlocal EnableDelayedExpansion +set tree_sitter="%cd%\target\release\tree-sitter" + +for /f "tokens=*" %%f in ('dir test\fixtures\grammars\grammar.js /b/s') do ( + pushd "%%f\.." + echo Regenerating parser !cd! + %tree_sitter% generate src\grammar.json --no-bindings --abi=latest + popd +) + +exit /B 0 diff --git a/script/generate-unicode-categories-json b/script/generate-unicode-categories-json new file mode 100755 index 00000000..b471709c --- /dev/null +++ b/script/generate-unicode-categories-json @@ -0,0 +1,245 @@ +#!/usr/bin/env node + +// This script generates a JSON file that is used by the CLI to handle unicode property escapes. + +const CATEGORY_OUTPUT_PATH = './cli/src/generate/prepare_grammar/unicode-categories.json' +const PROPERTY_OUTPUT_PATH = './cli/src/generate/prepare_grammar/unicode-properties.json' +const CATEGORY_ALIAS_OUTPUT_PATH = './cli/src/generate/prepare_grammar/unicode-category-aliases.json' +const PROPERTY_ALIAS_OUTPUT_PATH = './cli/src/generate/prepare_grammar/unicode-property-aliases.json' + +const UNICODE_STANDARD_VERSION = '15.1.0'; +const CATEGORY_URL = `https://unicode.org/Public/${UNICODE_STANDARD_VERSION}/ucd/UnicodeData.txt` +const PROPERTY_URL = `https://unicode.org/Public/${UNICODE_STANDARD_VERSION}/ucd/PropList.txt` +const DERIVED_PROPERTY_URL = `https://unicode.org/Public/${UNICODE_STANDARD_VERSION}/ucd/DerivedCoreProperties.txt` +const CATEGORY_ALIAS_URL = `https://unicode.org/Public/${UNICODE_STANDARD_VERSION}/ucd/PropertyValueAliases.txt` +const PROPERTY_ALIAS_URL = `https://unicode.org/Public/${UNICODE_STANDARD_VERSION}/ucd/PropertyAliases.txt` +const EMOJI_DATA_URL = `https://unicode.org/Public/${UNICODE_STANDARD_VERSION}/ucd/emoji/emoji-data.txt` + +const fs = require('fs'); +const path = require('path'); +const { spawnSync } = require('child_process'); + +// Download the unicode data files, caching them inside the 'target' directory. +const categoryData = cachedDownload(CATEGORY_URL); +const propertyData = cachedDownload(PROPERTY_URL); +const derivedPropertyData = cachedDownload(DERIVED_PROPERTY_URL); +const categoryAliasData = cachedDownload(CATEGORY_ALIAS_URL); +const propertyAliasData = cachedDownload(PROPERTY_ALIAS_URL); +const emojiData = cachedDownload(EMOJI_DATA_URL); +function cachedDownload(url) { + console.log(`Downloading ${url}`); + let downloadPath = path.join('.', 'target', path.basename(url) + `.${UNICODE_STANDARD_VERSION}`) + if (fs.existsSync(downloadPath)) { + return fs.readFileSync(downloadPath, 'utf8'); + } else { + const data = spawnSync('curl', [url], { encoding: 'utf8' }).stdout; + fs.writeFileSync(downloadPath, data, 'utf8'); + return data; + } +} + +const categories = {}; +const properties = {}; +const categoryAliases = {}; +const propertyAliases = {} +let data, row, lineStart, lineEnd; + +// Parse the properties +data = propertyData + derivedPropertyData + emojiData; +row = 0; +lineStart = 0; +lineEnd = -1; +const CODE_POINT = /[0-9A-Fa-f]/ +while (lineStart < data.length) { + row++; + lineStart = lineEnd + 1; + lineEnd = data.indexOf('\n', lineStart); + if (lineEnd === -1) break; + + // Skip over blank and comment lines + if (!CODE_POINT.test(data[lineStart])) continue; + + // Parse the first two semicolon fields: + // * code point or code point range + // * property + const codePointEnd = data.indexOf(';', lineStart); + const propertyStart = codePointEnd + 1; + const propertyEnd = data.indexOf('#', propertyStart); + + if ( + codePointEnd === -1 || + propertyEnd === -1 + ) { + throw new Error(`Unexpected format on line ${row}`); + } + + // Process ranges (separated by '..) + const codePoints = data.slice(lineStart, codePointEnd).trim() + .split('..') + .map(p => parseInt(p, 16)); + if (codePoints.length === 1) { + codePoints.push(codePoints[0]); + } + + const property = data.slice(propertyStart, propertyEnd).trim(); + + console.log("Property:", codePoints, property); + + + for (let c = codePoints[0]; c <= codePoints[1]; c++) { + if (!properties[property]) { + properties[property] = []; + } + properties[property].push(c); + } +} + +// Parse the categories. +// Each line represents a code point. +data = categoryData; +row = 0; +lineStart = 0; +lineEnd = -1; +while (lineStart < data.length) { + row++; + lineStart = lineEnd + 1; + lineEnd = data.indexOf('\n', lineStart); + if (lineEnd === -1) break; + + // Parse the first three semicolon-separated fields: + // * code point (hexadecimal) + // * name + // * category + const codePointEnd = data.indexOf(';', lineStart); + const nameStart = codePointEnd + 1; + const nameEnd = data.indexOf(';', nameStart); + const categoryStart = nameEnd + 1; + const categoryEnd = data.indexOf(';', categoryStart) + if ( + nameStart === 0 || + categoryStart == 0 || + categoryEnd === -1 + ) { + throw new Error(`Unexpected format on line ${row}`); + } + + const codePoint = parseInt(data.slice(lineStart, codePointEnd), 16); + const name = data.slice(nameStart, nameEnd); + const category = data.slice(categoryStart, categoryEnd); + + console.log("Category:", codePoint, category, name); + + // Group the code points by their category. + if (!categories[category]) { + categories[category] = []; + } + categories[category].push(codePoint); +} + +// Parse the category aliases +data = categoryAliasData; +row = 0; +lineStart = 0; +lineEnd = -1; +const IGNORE = /[#\s]/ +while (lineStart < data.length) { + row++; + lineStart = lineEnd + 1; + lineEnd = data.indexOf('\n', lineStart); + if (lineEnd === -1) break; + + // Skip over blank and comment lines + if (IGNORE.test(data[lineStart])) continue; + + // Parse the first three semicolon-separated fields: + // * property value type + // * short name + // * long name + // Other aliases may be listed in additional fields + const propertyValueTypeEnd = data.indexOf(';', lineStart); + const shortNameStart = propertyValueTypeEnd + 1; + const shortNameEnd = data.indexOf(';', shortNameStart); + const longNameStart = shortNameEnd + 1; + if ( + shortNameStart === 0 || + longNameStart === 0 + ) { + throw new Error(`Unexpected format on line ${row}`); + } + + const propertyValueType = data.slice(lineStart, propertyValueTypeEnd).trim(); + const shortName = data.slice(shortNameStart, shortNameEnd).trim(); + + // Filter for General_Category lines + if (propertyValueType !== 'gc') continue; + + let aliasStart = longNameStart; + let lineDone = false; + do { + let aliasEnd = data.indexOf(';', aliasStart); + if (aliasEnd === -1 || aliasEnd > lineEnd) { + aliasEnd = data.indexOf('#', aliasStart); + if (aliasEnd === -1 || aliasEnd > lineEnd) { + aliasEnd = lineEnd; + } + lineDone = true; + } + const alias = data.slice(aliasStart, aliasEnd).trim(); + console.log("Category alias:", alias, shortName); + categoryAliases[alias] = shortName; + aliasStart = aliasEnd + 1; + } while (!lineDone); +} + +// Parse the property aliases +data = propertyAliasData; +row = 0; +lineStart = 0; +lineEnd = -1; +while (lineStart < data.length) { + row++; + lineStart = lineEnd + 1; + lineEnd = data.indexOf('\n', lineStart); + if (lineEnd === -1) break; + + // Skip over blank and comment lines + if (IGNORE.test(data[lineStart])) continue; + + // Parse the first two semicolon fields: + // * short name + // * long name + const shortNameEnd = data.indexOf(';', lineStart); + const longNameStart = shortNameEnd + 1; + + if (longNameStart == 0) { + throw new Error(`Unexpected format on line ${row}`); + } + + let alias = data.slice(lineStart, shortNameEnd).trim(); + let longName = null; + let nameStart = longNameStart; + let lineDone = false; + do { + let nameEnd = data.indexOf(';', nameStart); + if (nameEnd === -1 || nameEnd > lineEnd) { + nameEnd = data.indexOf('#', nameStart); + if (nameEnd === -1 || nameEnd > lineEnd) { + nameEnd = lineEnd; + } + lineDone = true; + } + if (longName == null) { + longName = data.slice(nameStart, nameEnd).trim(); + } else { + alias = data.slice(nameStart, nameEnd).trim(); + } + console.log("Property alias:", alias, longName); + propertyAliases[alias] = longName; + nameStart = nameEnd + 1; + } while (!lineDone); +} + +fs.writeFileSync(CATEGORY_OUTPUT_PATH, JSON.stringify(categories), 'utf8'); +fs.writeFileSync(PROPERTY_OUTPUT_PATH, JSON.stringify(properties), 'utf8'); +fs.writeFileSync(CATEGORY_ALIAS_OUTPUT_PATH, JSON.stringify(categoryAliases), 'utf8'); +fs.writeFileSync(PROPERTY_ALIAS_OUTPUT_PATH, JSON.stringify(propertyAliases), 'utf8'); diff --git a/script/generate-wasm-exports-list b/script/generate-wasm-exports-list new file mode 100755 index 00000000..58f4d863 --- /dev/null +++ b/script/generate-wasm-exports-list @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +while read -r wasm_file; do + wasm-objdump --details "$wasm_file" --section Import | \ + sed -n 's/.*.*/\1/p' +done < <(find target -maxdepth 2 -name 'tree-sitter-*.wasm') | sort -u diff --git a/script/heap-profile b/script/heap-profile new file mode 100755 index 00000000..1bedd9cd --- /dev/null +++ b/script/heap-profile @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +# Usage: +# script/heap-profile +# +# Parse an example source file and record memory usage +# +# Dependencies: +# * `pprof` executable: https://github.com/google/pprof +# * `gperftools` package: https://github.com/gperftools/gperftools + +set -e + +GRAMMARS_DIR="$PWD/test/fixtures/grammars" + +# Build the library +make libtree-sitter.a + +# Build the heap-profiling harness +clang++ \ + -Wno-reorder-init-list \ + -Wno-c99-designator \ + -I lib/include \ + -I "$GRAMMARS_DIR" \ + -D GRAMMARS_DIR="\"${GRAMMARS_DIR}/\"" \ + test/profile/heap.cc \ + -l tcmalloc \ + libtree-sitter.a \ + -o target/heap-profile + +# Run the harness with heap profiling enabled. +export HEAPPROFILE="$PWD/profile" +target/heap-profile "$@" + +# Extract statistics using pprof. +pprof -top -cum profile.0001.heap diff --git a/script/reproduce b/script/reproduce new file mode 100755 index 00000000..7caebfbf --- /dev/null +++ b/script/reproduce @@ -0,0 +1,35 @@ +#!/bin/bash + +if (($# < 3)); then + echo "usage: $0 [libFuzzer args...]" >&2 + exit 1 +fi + +set -eu + +export ASAN_OPTIONS=quarantine_size_mb=10:detect_leaks=1:symbolize=1 +export UBSAN=print_stacktrace=1:halt_on_error=1:symbolize=1 + +# check if CI env var exists +if [[ -z ${CI:-} ]]; then + declare -A mode_config=( + [halt]='-timeout=1 -rss_limit_mb=2048' + [recover]='-timeout=10 -rss_limit_mb=2048' + ) +else + declare -A mode_config=( + [halt]='-max_total_time=120 -timeout=1 -rss_limit_mb=2048' + [recover]='-time=120 -timeout=10 -rss_limit_mb=2048' + ) +fi + +lang="$1" +shift +mode="$1" +shift +testcase="$1" +shift +# Treat remainder of arguments as libFuzzer arguments + +# shellcheck disable=SC2086 +test/fuzz/out/${lang}_fuzzer ${mode_config[$mode]} -runs=1 "$testcase" "$@" diff --git a/script/run-fuzzer b/script/run-fuzzer new file mode 100755 index 00000000..42cc1bae --- /dev/null +++ b/script/run-fuzzer @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +if (($# < 2)); then + echo "usage: $0 [libFuzzer args...]" >&2 + exit 1 +fi + +set -eu + +export ASAN_OPTIONS=quarantine_size_mb=10:detect_leaks=1:symbolize=1 +export UBSAN=print_stacktrace=1:halt_on_error=1:symbolize=1 + +# check if CI env var exists +if [[ -z ${CI:-} ]]; then + declare -A mode_config=( + [halt]='-timeout=1 -rss_limit_mb=2048' + [recover]='-timeout=10 -rss_limit_mb=2048' + ) +else + declare -A mode_config=( + [halt]='-max_total_time=120 -timeout=1 -rss_limit_mb=2048' + [recover]='-time=120 -timeout=10 -rss_limit_mb=2048' + ) +fi + +lang="$1" +shift +mode="$1" +shift +# Treat remainder of arguments as libFuzzer arguments + +# Fuzzing logs and testcases are always written to `pwd`, so `cd` there first +results="$PWD/test/fuzz/out/fuzz-results/${lang}" +mkdir -p "${results}" +cd "${results}" + +# Create a corpus directory, so new discoveries are stored on disk. These will +# then be loaded on subsequent fuzzing runs +mkdir -p corpus + +# shellcheck disable=SC2086 +../../${lang}_fuzzer -dict="../../${lang}.dict" -artifact_prefix=${lang}_ -max_len=2048 ${mode_config[$mode]} corpus "$@" diff --git a/script/serve-docs b/script/serve-docs new file mode 100755 index 00000000..9639016e --- /dev/null +++ b/script/serve-docs @@ -0,0 +1,29 @@ +#!/bin/bash + +root=$PWD +cd docs + +bundle exec jekyll serve "$@" & + +bundle exec ruby <`); + process.exit(0) +} + +// Get total file size +const totalSize = statSync(libPath).size + +// Dump symbols with addresses +const output = execFileSync( + 'nm', + ['-t', 'd', libPath], + {encoding: 'utf8'} +); + +// Parse addresses +const addressEntries = []; +for (const line of output.split('\n')) { + const [address, _, name] = line.split(/\s+/); + if (address && name) { + addressEntries.push({name, address: parseInt(address)}) + } +} + +// Compute sizes by subtracting addresses +addressEntries.sort((a, b) => a.address - b.address); +const sizeEntries = addressEntries.map(({name, address}, i) => { + const next = addressEntries[i + 1] ? addressEntries[i + 1].address : totalSize; + const size = next - address; + return {name, size} +}) + +function formatSize(sizeInBytes) { + return sizeInBytes > 1024 + ? `${(sizeInBytes / 1024).toFixed(1)} kb` + : `${sizeInBytes} b` +} + +// Display sizes +sizeEntries.sort((a, b) => b.size - a.size); +console.log('total'.padEnd(64, ' '), '\t', formatSize(totalSize)); +for (const entry of sizeEntries) { + console.log(entry.name.padEnd(64, ' '), '\t', formatSize(entry.size)); +} diff --git a/script/test b/script/test new file mode 100755 index 00000000..3722857e --- /dev/null +++ b/script/test @@ -0,0 +1,101 @@ +#!/usr/bin/env bash + +set -e + +function usage { + cat <&2 + fi + + test_flags+=("--target=$current_target") + ;; + e) + export TREE_SITTER_EXAMPLE=${OPTARG} + ;; + s) + export TREE_SITTER_SEED=${OPTARG} + ;; + i) + export TREE_SITTER_ITERATIONS=${OPTARG} + ;; + d) + export TREE_SITTER_LOG=1 + ;; + D) + export TREE_SITTER_LOG_GRAPHS=1 + ;; + g) + mode=debug + ;; + *) + usage + exit 1 + ;; + esac +done + +shift $((OPTIND - 1)) + +if [[ ${mode} == debug ]]; then + test_binary=$( + cargo test "${test_flags[@]}" --no-run --message-format=json 2> /dev/null | + jq -rs 'map(select(.target.name == "tree-sitter-cli" and .executable))[0].executable' + ) + lldb "${test_binary}" -- "$1" +else + cargo test "${test_flags[@]}" "$1" -- --nocapture +fi diff --git a/script/test-wasm b/script/test-wasm new file mode 100755 index 00000000..6dca2c56 --- /dev/null +++ b/script/test-wasm @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e + +cd lib/binding_web + +if [[ ! -d node_modules/chai ]] || [[ ! -d node_modules/mocha ]]; then + printf 'Installing test dependencies...\n' + npm install +fi + +node_modules/.bin/mocha diff --git a/script/test.cmd b/script/test.cmd new file mode 100644 index 00000000..4dc97ef3 --- /dev/null +++ b/script/test.cmd @@ -0,0 +1,10 @@ +@echo off + +setlocal +set RUST_TEST_THREADS=1 +set RUST_BACKTRACE=full +cargo test "%~1" +if %errorlevel% NEQ 0 ( + exit /b %errorlevel% +) +endlocal diff --git a/script/util/scan-build.sh b/script/util/scan-build.sh new file mode 100755 index 00000000..d19c1744 --- /dev/null +++ b/script/util/scan-build.sh @@ -0,0 +1,24 @@ +function scan_build { + extra_args=() + + # AFAICT, in the trusty travis container the scan-build tool is from the 3.4 + # installation. Therefore, by default it will use clang-3.4 when analysing code + # which doesn't support the '-std=c++14' (it is available via '-std=c++1y'). + # Use the system-wide installed clang instead which is 3.5 and does support + # '-std=c++14'. + extra_args+=("--use-analyzer=$(command -v clang)") + + # scan-build will try to guess which CXX should be used to compile the actual + # code, which is usually g++ but we need g++5 in the CI. Explicitly pass + # $CC/$CXX to scan-build if they are set in the environment. + + if [[ -n $CC ]]; then + extra_args+=("--use-cc=$CC") + fi + + if [[ -n $CXX ]]; then + extra_args+=("--use-c++=$CXX") + fi + + scan-build "${extra_args[@]}" --status-bugs -disable-checker deadcode.DeadStores "$@" +} diff --git a/script/util/valgrind.supp b/script/util/valgrind.supp new file mode 100644 index 00000000..090e58ae --- /dev/null +++ b/script/util/valgrind.supp @@ -0,0 +1,256 @@ +# Errors + +{ + + Memcheck:Cond + fun:_ZN6option6Parser9workhorseEbPKNS_10DescriptorEiPPKcRNS0_6ActionEbbi + fun:_ZN6option6Parser5parseEbPKNS_10DescriptorEiPPKcPNS_6OptionES8_ibi + fun:_ZN6option6ParserC1EPKNS_10DescriptorEiPPcPNS_6OptionES7_ibi + fun:_ZN6bandit6detail7optionsC1EiPPc + fun:_ZN6bandit3runEiPPc + fun:main +} + +{ + + Memcheck:Cond + fun:_ZN6option6Parser9workhorseEbPKNS_10DescriptorEiPPKcRNS0_6ActionEbbi + fun:_ZN6option5Stats3addEbPKNS_10DescriptorEiPPKcib + fun:_ZN6option5StatsC1EPKNS_10DescriptorEiPPcib + fun:_ZN6bandit6detail7optionsC1EiPPc + fun:_ZN6bandit3runEiPPc + fun:main +} + +{ + + Memcheck:Cond + fun:_ZN6option6Parser9workhorseEbPKNS_10DescriptorEiPPKcRNS0_6ActionEbbi + fun:_ZN6bandit6detail7optionsC2EiPPc + fun:_ZN6bandit3runEiPPc + fun:main +} + +{ + + Memcheck:Value8 + fun:_platform_memcmp + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc + fun:_ZN9snowhouse6Assert4ThatIPKcNS_16EqualsConstraintINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEEvRKT_RKT0_S3_i + fun:_ZNSt3__110__function6__funcIZZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE9ts_parserE_clES9_SA_ENKUlvE_clEvEUlvE0_NS7_ISD_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE9ts_parserE_clES9_SA_EUlvE_NS7_ISC_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE +} + +{ + + Memcheck:Addr1 + fun:_platform_memcmp + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc + fun:_ZN9snowhouse6Assert4ThatIPKcNS_16EqualsConstraintINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEEvRKT_RKT0_S3_i + fun:_ZNSt3__110__function6__funcIZZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE9ts_parserE_clES9_SA_ENKUlvE_clEvEUlvE0_NS7_ISD_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE9ts_parserE_clES9_SA_EUlvE_NS7_ISC_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE +} + +{ + + Memcheck:Cond + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc + fun:_ZN9snowhouse6Assert4ThatIPKcNS_16EqualsConstraintINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEEvRKT_RKT0_S3_i + fun:_ZNSt3__110__function6__funcIZZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE9ts_parserE_clES9_SA_ENKUlvE_clEvEUlvE0_NS7_ISD_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE9ts_parserE_clES9_SA_EUlvE_NS7_ISC_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv +} + +{ + + Memcheck:Cond + fun:_ZN9snowhouse6Assert4ThatINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_16EqualsConstraintIS8_EEEEvRKT_RKT0_PKci + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlvE3_clEvEUlvE0_NS_9allocatorIS5_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZNK3$_0clEvENKUlvE_clEvEUlvE3_NS_9allocatorIS4_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE +} + +{ + + Memcheck:Value8 + fun:_platform_memcmp + fun:_ZNK9snowhouse16EqualsConstraintINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEclIS7_EEbRKT_ + fun:_ZN9snowhouse6Assert4ThatINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_16EqualsConstraintIS8_EEEEvRKT_RKT0_PKci + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlvE3_clEvEUlvE0_NS_9allocatorIS5_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZNK3$_0clEvENKUlvE_clEvEUlvE3_NS_9allocatorIS4_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv +} + +{ + + Memcheck:Cond + fun:_ZN9snowhouse6Assert4ThatINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_16EqualsConstraintIS8_EEEEvRKT_RKT0_PKci + fun:_ZNSt3__110__function6__funcIZZNK3$_0clEvENKUlvE_clEvEUlvE1_NS_9allocatorIS4_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcI3$_0NS_9allocatorIS2_EEFvvEEclEv + fun:_ZN6bandit3runERKNS_6detail7optionsERKNSt3__14listINS4_8functionIFvvEEENS4_9allocatorIS8_EEEERNS4_5dequeIPNS0_7contextENS9_ISG_EEEERNS0_8listenerE + fun:_ZN6bandit3runEiPPc +} + +{ + + Memcheck:Value8 + fun:_platform_memcmp + fun:_ZNK9snowhouse16EqualsConstraintINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEclIS7_EEbRKT_ + fun:_ZN9snowhouse6Assert4ThatINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_16EqualsConstraintIS8_EEEEvRKT_RKT0_PKci + fun:_ZNSt3__110__function6__funcIZZNK3$_0clEvENKUlvE_clEvEUlvE1_NS_9allocatorIS4_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcI3$_0NS_9allocatorIS2_EEFvvEEclEv +} + +{ + + Memcheck:Cond + fun:_ZN9snowhouse6Assert4ThatINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_16EqualsConstraintIS8_EEEEvRKT_RKT0_PKci + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlvE4_clEvEUlvE0_NS_9allocatorIS5_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZNK3$_0clEvENKUlvE_clEvEUlvE4_NS_9allocatorIS4_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE +} + +{ + + Memcheck:Value8 + fun:_platform_memcmp + fun:_ZNK9snowhouse16EqualsConstraintINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEclIS7_EEbRKT_ + fun:_ZN9snowhouse6Assert4ThatINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_16EqualsConstraintIS8_EEEEvRKT_RKT0_PKci + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlvE4_clEvEUlvE0_NS_9allocatorIS5_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZNK3$_0clEvENKUlvE_clEvEUlvE4_NS_9allocatorIS4_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv +} + +{ + + Memcheck:Cond + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc + fun:_ZN9snowhouse6Assert4ThatIPKcNS_16EqualsConstraintINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEEvRKT_RKT0_S3_i + fun:_ZNSt3__110__function6__funcIZZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPF9ts_parservEE_clES9_SC_ENKUlvE_clEvEUlvE0_NS7_ISF_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPF9ts_parservEE_clES9_SC_EUlvE_NS7_ISE_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZNK3$_0clEvEUlvE_NS_9allocatorIS3_EEFvvEEclEv +} + +{ + + Memcheck:Addr1 + fun:_platform_memcmp + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc + fun:_ZN9snowhouse6Assert4ThatIPKcNS_16EqualsConstraintINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEEvRKT_RKT0_S3_i + fun:_ZNSt3__110__function6__funcIZZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPF9ts_parservEE_clES9_SC_ENKUlvE_clEvEUlvE0_NS7_ISF_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPF9ts_parservEE_clES9_SC_EUlvE_NS7_ISE_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE +} + +{ + + Memcheck:Value8 + fun:_platform_memcmp + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm + fun:_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc + fun:_ZN9snowhouse6Assert4ThatIPKcNS_16EqualsConstraintINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEEvRKT_RKT0_S3_i + fun:_ZNSt3__110__function6__funcIZZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPF9ts_parservEE_clES9_SC_ENKUlvE_clEvEUlvE0_NS7_ISF_EEFvvEEclEv + fun:_ZNSt3__110__function6__funcIZN6bandit2itEPKcNS_8functionIFvvEEERNS2_6detail8listenerERNS_5dequeIPNS8_7contextENS_9allocatorISD_EEEERNS2_8adapters17assertion_adapterERKNS8_10run_policyEEUlvE1_NSE_ISO_EES6_EclEv + fun:_ZN6bandit8adapters17snowhouse_adapter16adapt_exceptionsENSt3__18functionIFvvEEE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEERNS_8adapters17assertion_adapterERKNS6_10run_policyE + fun:_ZN6bandit2itEPKcNSt3__18functionIFvvEEE + fun:_ZNSt3__110__function6__funcIZZZNK3$_0clEvENKUlvE_clEvENKUlNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPF9ts_parservEE_clES9_SC_EUlvE_NS7_ISE_EEFvvEEclEv + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEERNS_6detail8listenerERNS2_5dequeIPNS6_7contextENS2_9allocatorISB_EEEEb + fun:_ZN6bandit8describeEPKcNSt3__18functionIFvvEEE +} + +# Leaks + +{ + + Memcheck:Leak + match-leak-kinds: possible + fun:malloc_zone_malloc + fun:_objc_copyClassNamesForImage + fun:_ZL9protocolsv + fun:_Z9readClassP10objc_classbb + fun:gc_init + fun:_ZL33objc_initializeClassPair_internalP10objc_classPKcS0_S0_ + fun:layout_string_create + fun:_ZL12realizeClassP10objc_class + fun:_ZL22copySwiftV1MangledNamePKcb + fun:_ZL22copySwiftV1MangledNamePKcb + fun:_ZL22copySwiftV1MangledNamePKcb + fun:_ZL22copySwiftV1MangledNamePKcb +} diff --git a/crates/tags/Cargo.toml b/tags/Cargo.toml similarity index 82% rename from crates/tags/Cargo.toml rename to tags/Cargo.toml index b82647e9..65cf9251 100644 --- a/crates/tags/Cargo.toml +++ b/tags/Cargo.toml @@ -11,22 +11,16 @@ rust-version.workspace = true readme = "README.md" homepage.workspace = true repository.workspace = true -documentation = "https://docs.rs/tree-sitter-tags" license.workspace = true keywords = ["incremental", "parsing", "syntax", "tagging"] categories = ["parsing", "text-editors"] -[lints] -workspace = true - [lib] -path = "src/tags.rs" crate-type = ["lib", "staticlib"] [dependencies] memchr.workspace = true regex.workspace = true -streaming-iterator.workspace = true thiserror.workspace = true tree-sitter.workspace = true diff --git a/crates/tags/README.md b/tags/README.md similarity index 100% rename from crates/tags/README.md rename to tags/README.md diff --git a/crates/tags/include/tree_sitter/tags.h b/tags/include/tree_sitter/tags.h similarity index 100% rename from crates/tags/include/tree_sitter/tags.h rename to tags/include/tree_sitter/tags.h diff --git a/crates/tags/src/c_lib.rs b/tags/src/c_lib.rs similarity index 98% rename from crates/tags/src/c_lib.rs rename to tags/src/c_lib.rs index 63c47a01..6041642d 100644 --- a/crates/tags/src/c_lib.rs +++ b/tags/src/c_lib.rs @@ -40,8 +40,8 @@ pub struct TSTag { pub line_end_byte: u32, pub start_point: TSPoint, pub end_point: TSPoint, - pub utf16_start_column: u32, - pub utf16_end_column: u32, + pub utf16_start_colum: u32, + pub utf16_end_colum: u32, pub docs_start_byte: u32, pub docs_end_byte: u32, pub syntax_type_id: u32, @@ -198,8 +198,8 @@ pub unsafe extern "C" fn ts_tagger_tag( row: tag.span.end.row as u32, column: tag.span.end.column as u32, }, - utf16_start_column: tag.utf16_column_range.start as u32, - utf16_end_column: tag.utf16_column_range.end as u32, + utf16_start_colum: tag.utf16_column_range.start as u32, + utf16_end_colum: tag.utf16_column_range.end as u32, docs_start_byte: prev_docs_len as u32, docs_end_byte: buffer.docs.len() as u32, syntax_type_id: tag.syntax_type_id, diff --git a/crates/tags/src/tags.rs b/tags/src/lib.rs similarity index 94% rename from crates/tags/src/tags.rs rename to tags/src/lib.rs index c6654876..0bc27d20 100644 --- a/crates/tags/src/tags.rs +++ b/tags/src/lib.rs @@ -1,4 +1,4 @@ -#![cfg_attr(not(any(test, doctest)), doc = include_str!("../README.md"))] +#![doc = include_str!("../README.md")] pub mod c_lib; @@ -7,7 +7,7 @@ use std::{ collections::HashMap, ffi::{CStr, CString}, mem, - ops::{ControlFlow, Range}, + ops::Range, os::raw::c_char, str, sync::atomic::{AtomicUsize, Ordering}, @@ -15,11 +15,9 @@ use std::{ use memchr::memchr; use regex::Regex; -use streaming_iterator::StreamingIterator; use thiserror::Error; use tree_sitter::{ - Language, LossyUtf8, ParseOptions, Parser, Point, Query, QueryCursor, QueryError, - QueryPredicateArg, Tree, + Language, LossyUtf8, Parser, Point, Query, QueryCursor, QueryError, QueryPredicateArg, Tree, }; const MAX_LINE_LEN: usize = 180; @@ -43,9 +41,6 @@ pub struct TagsConfiguration { pattern_info: Vec, } -unsafe impl Send for TagsConfiguration {} -unsafe impl Sync for TagsConfiguration {} - #[derive(Debug)] pub struct NamedCapture { pub syntax_type_id: u32, @@ -105,7 +100,7 @@ struct LocalScope<'a> { struct TagsIter<'a, I> where - I: StreamingIterator>, + I: Iterator>, { matches: I, _tree: Tree, @@ -152,7 +147,7 @@ impl TagsConfiguration { "doc" => doc_capture_index = Some(i as u32), "local.scope" => local_scope_capture_index = Some(i as u32), "local.definition" => local_definition_capture_index = Some(i as u32), - "local.reference" | "" => {} + "local.reference" | "" => continue, _ => { let mut is_definition = false; @@ -202,7 +197,7 @@ impl TagsConfiguration { && property .value .as_ref() - .is_some_and(|v| v.as_ref() == "false") + .map_or(false, |v| v.as_ref() == "false") { info.local_scope_inherits = false; } @@ -274,7 +269,7 @@ impl TagsContext { } } - pub const fn parser(&mut self) -> &mut Parser { + pub fn parser(&mut self) -> &mut Parser { &mut self.parser } @@ -288,32 +283,9 @@ impl TagsContext { .set_language(&config.language) .map_err(|_| Error::InvalidLanguage)?; self.parser.reset(); - let tree = self - .parser - .parse_with_options( - &mut |i, _| { - if i < source.len() { - &source[i..] - } else { - &[] - } - }, - None, - Some(ParseOptions::new().progress_callback(&mut |_| { - if let Some(cancellation_flag) = cancellation_flag { - if cancellation_flag.load(Ordering::SeqCst) != 0 { - ControlFlow::Break(()) - } else { - ControlFlow::Continue(()) - } - } else { - ControlFlow::Continue(()) - } - })), - ) - .ok_or(Error::Cancelled)?; + unsafe { self.parser.set_cancellation_flag(cancellation_flag) }; + let tree = self.parser.parse(source, None).ok_or(Error::Cancelled)?; - // SAFETY: // The `matches` iterator borrows the `Tree`, which prevents it from being // moved. But the tree is really just a pointer, so it's actually ok to // move it. @@ -344,7 +316,7 @@ impl TagsContext { impl<'a, I> Iterator for TagsIter<'a, I> where - I: StreamingIterator>, + I: Iterator>, { type Item = Result; diff --git a/test/fixtures/fixtures.json b/test/fixtures/fixtures.json deleted file mode 100644 index c1e2b167..00000000 --- a/test/fixtures/fixtures.json +++ /dev/null @@ -1,17 +0,0 @@ -[ - ["bash","v0.25.0"], - ["c","v0.24.1"], - ["cpp","v0.23.4"], - ["embedded-template","v0.25.0"], - ["go","v0.25.0"], - ["html","v0.23.2"], - ["java","v0.23.5"], - ["javascript","v0.25.0"], - ["jsdoc","v0.23.2"], - ["json","v0.24.8"], - ["php","v0.24.2"], - ["python","v0.23.6"], - ["ruby","v0.23.1"], - ["rust","v0.24.0"], - ["typescript","v0.23.2"] -] \ No newline at end of file diff --git a/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js b/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js index 9d41fef2..2f1091e7 100644 --- a/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js +++ b/test/fixtures/test_grammars/aliased_inlined_rules/grammar.js @@ -2,7 +2,7 @@ // shows that you can alias a rule that would otherwise be anonymous, and it will then appear as a // named node. -export default grammar({ +module.exports = grammar({ name: 'aliased_inlined_rules', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/aliased_rules/grammar.js b/test/fixtures/test_grammars/aliased_rules/grammar.js index df721d5b..a615a90d 100644 --- a/test/fixtures/test_grammars/aliased_rules/grammar.js +++ b/test/fixtures/test_grammars/aliased_rules/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'aliased_rules', extras: $ => [ diff --git a/test/fixtures/test_grammars/aliased_token_rules/grammar.js b/test/fixtures/test_grammars/aliased_token_rules/grammar.js index 2a6f4be3..704a2a34 100644 --- a/test/fixtures/test_grammars/aliased_token_rules/grammar.js +++ b/test/fixtures/test_grammars/aliased_token_rules/grammar.js @@ -1,7 +1,7 @@ // This grammar shows that `ALIAS` rules can be applied directly to `TOKEN` and `IMMEDIATE_TOKEN` // rules. -export default grammar({ +module.exports = grammar({ name: 'aliased_token_rules', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js b/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js index 77186d07..9b39de28 100644 --- a/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js +++ b/test/fixtures/test_grammars/aliased_unit_reductions/grammar.js @@ -5,7 +5,7 @@ // their parent rule. In that situation, eliminating the invisible node could cause the alias to be // incorrectly applied to its child. -export default grammar({ +module.exports = grammar({ name: 'aliased_unit_reductions', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/aliases_in_root/corpus.txt b/test/fixtures/test_grammars/aliases_in_root/corpus.txt deleted file mode 100644 index ed78852b..00000000 --- a/test/fixtures/test_grammars/aliases_in_root/corpus.txt +++ /dev/null @@ -1,13 +0,0 @@ -====================================== -Aliases within the root node -====================================== - -# this is a comment -foo foo - ---- - -(document - (comment) - (bar) - (foo)) diff --git a/test/fixtures/test_grammars/aliases_in_root/grammar.js b/test/fixtures/test_grammars/aliases_in_root/grammar.js deleted file mode 100644 index 9d46af2f..00000000 --- a/test/fixtures/test_grammars/aliases_in_root/grammar.js +++ /dev/null @@ -1,19 +0,0 @@ -export default grammar({ - name: 'aliases_in_root', - - extras: $ => [ - /\s/, - $.comment, - ], - - rules: { - document: $ => seq( - alias($.foo, $.bar), - $.foo, - ), - - foo: $ => "foo", - - comment: $ => /#.*/ - } -}); diff --git a/test/fixtures/test_grammars/anonymous_error/corpus.txt b/test/fixtures/test_grammars/anonymous_error/corpus.txt deleted file mode 100644 index f1dd3d34..00000000 --- a/test/fixtures/test_grammars/anonymous_error/corpus.txt +++ /dev/null @@ -1,9 +0,0 @@ -====================== -A simple error literal -====================== - -ERROR - ---- - -(document) diff --git a/test/fixtures/test_grammars/anonymous_error/grammar.js b/test/fixtures/test_grammars/anonymous_error/grammar.js deleted file mode 100644 index 72870612..00000000 --- a/test/fixtures/test_grammars/anonymous_error/grammar.js +++ /dev/null @@ -1,6 +0,0 @@ -export default grammar({ - name: 'anonymous_error', - rules: { - document: $ => repeat(choice('ok', 'ERROR')), - } -}); diff --git a/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/corpus.txt b/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/corpus.txt index c69d0484..749264c6 100644 --- a/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/corpus.txt +++ b/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/corpus.txt @@ -19,7 +19,7 @@ anonymous tokens defined with LF escape sequence anonymous tokens defined with CR escape sequence ================================================= - + --- (first_rule) diff --git a/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js b/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js index cffe374d..3e7e294b 100644 --- a/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js +++ b/test/fixtures/test_grammars/anonymous_tokens_with_escaped_chars/grammar.js @@ -4,7 +4,7 @@ // characters. This grammar tests that this escaping works. The test is basically that the generated // parser compiles successfully. -export default grammar({ +module.exports = grammar({ name: "anonymous_tokens_with_escaped_chars", rules: { first_rule: $ => choice( diff --git a/test/fixtures/test_grammars/associativity_left/grammar.js b/test/fixtures/test_grammars/associativity_left/grammar.js index 3b0b8e54..6dbc4671 100644 --- a/test/fixtures/test_grammars/associativity_left/grammar.js +++ b/test/fixtures/test_grammars/associativity_left/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'associativity_left', rules: { diff --git a/test/fixtures/test_grammars/associativity_missing/grammar.js b/test/fixtures/test_grammars/associativity_missing/grammar.js index c540d132..9c1ed980 100644 --- a/test/fixtures/test_grammars/associativity_missing/grammar.js +++ b/test/fixtures/test_grammars/associativity_missing/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'associativity_missing', rules: { diff --git a/test/fixtures/test_grammars/associativity_right/grammar.js b/test/fixtures/test_grammars/associativity_right/grammar.js index a45a02fd..69bfd065 100644 --- a/test/fixtures/test_grammars/associativity_right/grammar.js +++ b/test/fixtures/test_grammars/associativity_right/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'associativity_right', rules: { diff --git a/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js b/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js index e3d4b2d8..c23e8a7c 100644 --- a/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js +++ b/test/fixtures/test_grammars/conflict_in_repeat_rule/grammar.js @@ -2,7 +2,7 @@ // parser generator in order to implement repetition. There is no way of referring to these rules in // the grammar DSL, so these conflicts must be resolved by referring to their parent rules. -export default grammar({ +module.exports = grammar({ name: 'conflict_in_repeat_rule', rules: { diff --git a/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js b/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js index 85145f7f..27364b22 100644 --- a/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js +++ b/test/fixtures/test_grammars/conflict_in_repeat_rule_after_external_token/grammar.js @@ -2,7 +2,7 @@ // after an external token is consumed. This tests that the logic for determining the repeat rule's // "parent" rule works in the presence of external tokens. -export default grammar({ +module.exports = grammar({ name: 'conflict_in_repeat_rule_after_external_token', externals: $ => [ @@ -29,4 +29,4 @@ export default grammar({ identifier: $ => /[a-z]+/ } -}); +}); \ No newline at end of file diff --git a/test/fixtures/test_grammars/conflicting_precedence/grammar.js b/test/fixtures/test_grammars/conflicting_precedence/grammar.js index 98b41def..8092f8e9 100644 --- a/test/fixtures/test_grammars/conflicting_precedence/grammar.js +++ b/test/fixtures/test_grammars/conflicting_precedence/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'conflicting_precedence', rules: { diff --git a/test/fixtures/test_grammars/depends_on_column/corpus.txt b/test/fixtures/test_grammars/depends_on_column/corpus.txt deleted file mode 100644 index 5c8dbbe6..00000000 --- a/test/fixtures/test_grammars/depends_on_column/corpus.txt +++ /dev/null @@ -1,21 +0,0 @@ -================== -X is at odd column -================== - - x - ---- - -(x_is_at - (odd_column)) - -=================== -X is at even column -=================== - - x - ---- - -(x_is_at - (even_column)) diff --git a/test/fixtures/test_grammars/depends_on_column/grammar.js b/test/fixtures/test_grammars/depends_on_column/grammar.js deleted file mode 100644 index 95646d86..00000000 --- a/test/fixtures/test_grammars/depends_on_column/grammar.js +++ /dev/null @@ -1,7 +0,0 @@ -export default grammar({ - name: "depends_on_column", - rules: { - x_is_at: ($) => seq(/[ \r\n]*/, choice($.odd_column, $.even_column), "x"), - }, - externals: ($) => [$.odd_column, $.even_column], -}); diff --git a/test/fixtures/test_grammars/depends_on_column/scanner.c b/test/fixtures/test_grammars/depends_on_column/scanner.c deleted file mode 100644 index 29c2eb1b..00000000 --- a/test/fixtures/test_grammars/depends_on_column/scanner.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "tree_sitter/parser.h" - -enum TokenType { ODD_COLUMN, EVEN_COLUMN }; - -// The scanner is stateless - -void *tree_sitter_depends_on_column_external_scanner_create() { - return NULL; -} - -void tree_sitter_depends_on_column_external_scanner_destroy( - void *payload -) { - // no-op -} - -unsigned tree_sitter_depends_on_column_external_scanner_serialize( - void *payload, - char *buffer -) { - return 0; -} - -void tree_sitter_depends_on_column_external_scanner_deserialize( - void *payload, - const char *buffer, - unsigned length -) { - // no-op -} - -bool tree_sitter_depends_on_column_external_scanner_scan( - void *payload, - TSLexer *lexer, - const bool *valid_symbols -) { - lexer->result_symbol = - lexer->get_column(lexer) % 2 ? ODD_COLUMN : EVEN_COLUMN; - return true; -} diff --git a/test/fixtures/test_grammars/dynamic_precedence/grammar.js b/test/fixtures/test_grammars/dynamic_precedence/grammar.js index e4ad3a8e..321f1139 100644 --- a/test/fixtures/test_grammars/dynamic_precedence/grammar.js +++ b/test/fixtures/test_grammars/dynamic_precedence/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'dynamic_precedence', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/epsilon_external_extra_tokens/corpus.txt b/test/fixtures/test_grammars/epsilon_external_extra_tokens/corpus.txt deleted file mode 100644 index 776db2ec..00000000 --- a/test/fixtures/test_grammars/epsilon_external_extra_tokens/corpus.txt +++ /dev/null @@ -1,9 +0,0 @@ -========================== -A document -========================== - -a b - ---- - -(document) diff --git a/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js b/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js deleted file mode 100644 index aefa4e0f..00000000 --- a/test/fixtures/test_grammars/epsilon_external_extra_tokens/grammar.js +++ /dev/null @@ -1,11 +0,0 @@ -export default grammar({ - name: 'epsilon_external_extra_tokens', - - extras: $ => [/\s/, $.comment], - - externals: $ => [$.comment], - - rules: { - document: $ => seq('a', 'b'), - } -}); diff --git a/test/fixtures/test_grammars/epsilon_external_extra_tokens/scanner.c b/test/fixtures/test_grammars/epsilon_external_extra_tokens/scanner.c deleted file mode 100644 index c8949d1d..00000000 --- a/test/fixtures/test_grammars/epsilon_external_extra_tokens/scanner.c +++ /dev/null @@ -1,33 +0,0 @@ -#include "tree_sitter/parser.h" - -enum TokenType { - COMMENT -}; - -void *tree_sitter_epsilon_external_extra_tokens_external_scanner_create(void) { - return NULL; -} - -bool tree_sitter_epsilon_external_extra_tokens_external_scanner_scan( - void *payload, - TSLexer *lexer, - const bool *valid_symbols -) { - lexer->result_symbol = COMMENT; - return true; -} - -unsigned tree_sitter_epsilon_external_extra_tokens_external_scanner_serialize( - void *payload, - char *buffer -) { - return 0; -} - -void tree_sitter_epsilon_external_extra_tokens_external_scanner_deserialize( - void *payload, - const char *buffer, - unsigned length -) {} - -void tree_sitter_epsilon_external_extra_tokens_external_scanner_destroy(void *payload) {} diff --git a/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js b/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js index 14163d80..27deef47 100644 --- a/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js +++ b/test/fixtures/test_grammars/epsilon_external_tokens/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'epsilon_external_tokens', extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/epsilon_rules/grammar.js b/test/fixtures/test_grammars/epsilon_rules/grammar.js index 159ccd9f..8cba729b 100644 --- a/test/fixtures/test_grammars/epsilon_rules/grammar.js +++ b/test/fixtures/test_grammars/epsilon_rules/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'epsilon_rules', rules: { diff --git a/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js b/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js index 6e74b9d3..e289f5ad 100644 --- a/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_and_internal_anonymous_tokens/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'external_and_internal_anonymous_tokens', externals: $ => [ diff --git a/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js b/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js index 370a5723..6b70c98a 100644 --- a/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_and_internal_tokens/grammar.js @@ -2,7 +2,7 @@ // validity of an *internal* token. This is done by including the names of that internal token // (`line_break`) in the grammar's `externals` field. -export default grammar({ +module.exports = grammar({ name: 'external_and_internal_tokens', externals: $ => [ diff --git a/test/fixtures/test_grammars/external_extra_tokens/grammar.js b/test/fixtures/test_grammars/external_extra_tokens/grammar.js index c64ecdc1..a5390c8a 100644 --- a/test/fixtures/test_grammars/external_extra_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_extra_tokens/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: "external_extra_tokens", externals: $ => [ diff --git a/test/fixtures/test_grammars/external_tokens/grammar.js b/test/fixtures/test_grammars/external_tokens/grammar.js index c4ff6cb7..457eee94 100644 --- a/test/fixtures/test_grammars/external_tokens/grammar.js +++ b/test/fixtures/test_grammars/external_tokens/grammar.js @@ -2,7 +2,7 @@ // that track the nesting depth of parentheses, similar to Ruby's percent // string literals. -export default grammar({ +module.exports = grammar({ name: "external_tokens", externals: $ => [ diff --git a/test/fixtures/test_grammars/external_tokens/scanner.c b/test/fixtures/test_grammars/external_tokens/scanner.c index da40c485..6d80827e 100644 --- a/test/fixtures/test_grammars/external_tokens/scanner.c +++ b/test/fixtures/test_grammars/external_tokens/scanner.c @@ -30,7 +30,7 @@ void tree_sitter_external_tokens_external_scanner_destroy(void *payload) { unsigned tree_sitter_external_tokens_external_scanner_serialize( void *payload, char *buffer -) { return 0; } +) { return true; } void tree_sitter_external_tokens_external_scanner_deserialize( void *payload, diff --git a/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js b/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js index e578920c..3016b31d 100644 --- a/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js +++ b/test/fixtures/test_grammars/external_unicode_column_alignment/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: "external_unicode_column_alignment", externals: $ => [ diff --git a/test/fixtures/test_grammars/extra_non_terminals/corpus.txt b/test/fixtures/test_grammars/extra_non_terminals/corpus.txt index b58fa68b..52b7d864 100644 --- a/test/fixtures/test_grammars/extra_non_terminals/corpus.txt +++ b/test/fixtures/test_grammars/extra_non_terminals/corpus.txt @@ -12,12 +12,11 @@ a b c d Extras ============== -a (one) b (two) (three) c d // e +a (one) b (two) (three) c d --- (module - (comment (paren_comment)) - (comment (paren_comment)) - (comment (paren_comment)) - (comment (line_comment))) + (comment) + (comment) + (comment)) diff --git a/test/fixtures/test_grammars/extra_non_terminals/grammar.js b/test/fixtures/test_grammars/extra_non_terminals/grammar.js index 116cb0a6..d13cd68a 100644 --- a/test/fixtures/test_grammars/extra_non_terminals/grammar.js +++ b/test/fixtures/test_grammars/extra_non_terminals/grammar.js @@ -1,6 +1,6 @@ // This grammar has an "extra" rule, `comment`, that is a non-terminal. -export default grammar({ +module.exports = grammar({ name: "extra_non_terminals", extras: $ => [ @@ -9,12 +9,7 @@ export default grammar({ ], rules: { - module: _ => seq('a', 'b', 'c', 'd'), - - comment: $ => choice($.paren_comment, $.line_comment), - - paren_comment: _ => token(seq('(', repeat(/[a-z]+/), ')')), - - line_comment: _ => token(seq('//', /.*/)), + module: $ => seq('a', 'b', 'c', 'd'), + comment: $ => seq('(', repeat(/[a-z]+/), ')'), } }) diff --git a/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js b/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js index 993e89b4..28539871 100644 --- a/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js +++ b/test/fixtures/test_grammars/extra_non_terminals_with_shared_rules/grammar.js @@ -1,7 +1,7 @@ // This grammar has a non-terminal extra rule `macro_statement` that contains // child rules that are also used elsewhere in the grammar. -export default grammar({ +module.exports = grammar({ name: "extra_non_terminals_with_shared_rules", extras: $ => [/\s+/, $.macro_statement], diff --git a/test/fixtures/test_grammars/get_col_eof/corpus.txt b/test/fixtures/test_grammars/get_col_eof/corpus.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/test_grammars/get_col_eof/grammar.js b/test/fixtures/test_grammars/get_col_eof/grammar.js deleted file mode 100644 index a2cf6ef4..00000000 --- a/test/fixtures/test_grammars/get_col_eof/grammar.js +++ /dev/null @@ -1,11 +0,0 @@ -export default grammar({ - name: "get_col_eof", - - externals: $ => [ - $.char - ], - - rules: { - source_file: $ => repeat($.char), - } -}); diff --git a/test/fixtures/test_grammars/get_col_eof/scanner.c b/test/fixtures/test_grammars/get_col_eof/scanner.c deleted file mode 100644 index 1d262cf9..00000000 --- a/test/fixtures/test_grammars/get_col_eof/scanner.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "tree_sitter/parser.h" - -enum TokenType { CHAR }; - -void *tree_sitter_get_col_eof_external_scanner_create(void) { return NULL; } - -void tree_sitter_get_col_eof_external_scanner_destroy(void *scanner) {} - -unsigned tree_sitter_get_col_eof_external_scanner_serialize(void *scanner, - char *buffer) { - return 0; -} - -void tree_sitter_get_col_eof_external_scanner_deserialize(void *scanner, - const char *buffer, - unsigned length) {} - -bool tree_sitter_get_col_eof_external_scanner_scan(void *scanner, - TSLexer *lexer, - const bool *valid_symbols) { - if (lexer->eof(lexer)) { - return false; - } - - if (valid_symbols[CHAR]) { - lexer->advance(lexer, false); - lexer->get_column(lexer); - lexer->result_symbol = CHAR; - lexer->mark_end(lexer); - return true; - } - - return false; -} diff --git a/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js b/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js index d45ea967..83d57d2c 100644 --- a/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js +++ b/test/fixtures/test_grammars/get_col_should_hang_not_crash/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'get_col_should_hang_not_crash', externals: $ => [ diff --git a/test/fixtures/test_grammars/immediate_tokens/grammar.js b/test/fixtures/test_grammars/immediate_tokens/grammar.js index 223de3d3..7505a811 100644 --- a/test/fixtures/test_grammars/immediate_tokens/grammar.js +++ b/test/fixtures/test_grammars/immediate_tokens/grammar.js @@ -3,7 +3,7 @@ // When there are *no* leading `extras`, an immediate token is preferred over a normal token which // would otherwise match. -export default grammar({ +module.exports = grammar({ name: "immediate_tokens", extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt b/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt deleted file mode 100644 index 4f244a6c..00000000 --- a/test/fixtures/test_grammars/indirect_recursion_in_transitions/expected_error.txt +++ /dev/null @@ -1 +0,0 @@ -Grammar contains an indirectly recursive rule: type_expression -> _expression -> identifier_expression -> type_expression \ No newline at end of file diff --git a/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js b/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js deleted file mode 100644 index 23ce2b24..00000000 --- a/test/fixtures/test_grammars/indirect_recursion_in_transitions/grammar.js +++ /dev/null @@ -1,16 +0,0 @@ -export default grammar({ - name: 'indirect_recursive_in_single_symbol_transitions', - rules: { - source_file: $ => repeat($._statement), - - _statement: $ => seq($.initialization_part, $.type_expression), - - type_expression: $ => choice('int', $._expression), - - initialization_part: $ => seq('=', $._expression), - - _expression: $ => choice($.identifier_expression, $.type_expression), - - identifier_expression: $ => choice(/[a-zA-Z_][a-zA-Z0-9_]*/, $.type_expression), - } -}); diff --git a/test/fixtures/test_grammars/inline_rules/grammar.js b/test/fixtures/test_grammars/inline_rules/grammar.js index c8f3275c..4477097d 100644 --- a/test/fixtures/test_grammars/inline_rules/grammar.js +++ b/test/fixtures/test_grammars/inline_rules/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: "inline_rules", extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js b/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js index 84612330..8578659b 100644 --- a/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js +++ b/test/fixtures/test_grammars/inlined_aliased_rules/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: "inlined_aliased_rules", extras: $ => [/\s/], diff --git a/test/fixtures/test_grammars/inverted_external_token/grammar.js b/test/fixtures/test_grammars/inverted_external_token/grammar.js index e1d78b89..3530d0db 100644 --- a/test/fixtures/test_grammars/inverted_external_token/grammar.js +++ b/test/fixtures/test_grammars/inverted_external_token/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: "inverted_external_token", externals: $ => [$.line_break], diff --git a/test/fixtures/test_grammars/invisible_start_rule/grammar.js b/test/fixtures/test_grammars/invisible_start_rule/grammar.js index d9fdf6f5..4afa4d66 100644 --- a/test/fixtures/test_grammars/invisible_start_rule/grammar.js +++ b/test/fixtures/test_grammars/invisible_start_rule/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: "invisible_start_rule", rules: { _value: $ => choice($.a, $.b), diff --git a/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js b/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js index 2dc3639b..4868dc81 100644 --- a/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js +++ b/test/fixtures/test_grammars/lexical_conflicts_due_to_state_merging/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'lexical_conflicts_due_to_state_merging', rules: { diff --git a/test/fixtures/test_grammars/named_precedences/grammar.js b/test/fixtures/test_grammars/named_precedences/grammar.js index 52c767c5..2132385b 100644 --- a/test/fixtures/test_grammars/named_precedences/grammar.js +++ b/test/fixtures/test_grammars/named_precedences/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'named_precedences', conflicts: $ => [ diff --git a/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js b/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js index 6bc56822..3f30de56 100644 --- a/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js +++ b/test/fixtures/test_grammars/named_rule_aliased_as_anonymous/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'named_rule_aliased_as_anonymous', rules: { diff --git a/test/fixtures/test_grammars/nested_inlined_rules/grammar.js b/test/fixtures/test_grammars/nested_inlined_rules/grammar.js index 3ca4d264..7aaf601b 100644 --- a/test/fixtures/test_grammars/nested_inlined_rules/grammar.js +++ b/test/fixtures/test_grammars/nested_inlined_rules/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'nested_inlined_rules', inline: $ => [ diff --git a/test/fixtures/test_grammars/next_sibling_from_zwt/corpus.txt b/test/fixtures/test_grammars/next_sibling_from_zwt/corpus.txt deleted file mode 100644 index 61c67140..00000000 --- a/test/fixtures/test_grammars/next_sibling_from_zwt/corpus.txt +++ /dev/null @@ -1,10 +0,0 @@ -=========================== -missing c node -=========================== - -abdef - ---- - -(source - (MISSING "c")) diff --git a/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js b/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js deleted file mode 100644 index f9a31c44..00000000 --- a/test/fixtures/test_grammars/next_sibling_from_zwt/grammar.js +++ /dev/null @@ -1,21 +0,0 @@ -export default grammar({ - name: "next_sibling_from_zwt", - extras: $ => [ - /\s|\\\r?\n/, - ], - - rules: { - source: $ => seq( - 'a', - $._bc, - 'd', - 'e', - 'f', - ), - - _bc: $ => seq( - 'b', - 'c', - ), - } -}); diff --git a/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js b/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js index 23b11167..cd0d1d65 100644 --- a/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js +++ b/test/fixtures/test_grammars/partially_resolved_conflict/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'partially_resolved_conflict', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js b/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js index 0c9c1b45..fbdb450f 100644 --- a/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_single_child_missing/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'precedence_on_single_child_missing', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js b/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js index 6d9ea114..798075db 100644 --- a/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_single_child_negative/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'precedence_on_single_child_negative', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js b/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js index 0492f0ac..d2e57c30 100644 --- a/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_single_child_positive/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'precedence_on_single_child_positive', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js b/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js index f6caad5e..3a5bdefb 100644 --- a/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_subsequence/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'precedence_on_subsequence', rules: { diff --git a/test/fixtures/test_grammars/precedence_on_token/grammar.js b/test/fixtures/test_grammars/precedence_on_token/grammar.js index 67a0b9bf..e56f2d81 100644 --- a/test/fixtures/test_grammars/precedence_on_token/grammar.js +++ b/test/fixtures/test_grammars/precedence_on_token/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'precedence_on_token', extras: $ => [ diff --git a/test/fixtures/test_grammars/readme_grammar/grammar.js b/test/fixtures/test_grammars/readme_grammar/grammar.js index 0547df4c..9f3ce6dd 100644 --- a/test/fixtures/test_grammars/readme_grammar/grammar.js +++ b/test/fixtures/test_grammars/readme_grammar/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'readme_grammar', // Things that can appear anywhere in the language, like comments @@ -31,6 +31,6 @@ export default grammar({ comment: _ => /#.*/, - variable: _ => new RustRegex('(?i:[a-z])\\w*'), + variable: _ => /[a-zA-Z]\w*/, }, }); diff --git a/test/fixtures/test_grammars/reserved_words/corpus.txt b/test/fixtures/test_grammars/reserved_words/corpus.txt deleted file mode 100644 index 607efe40..00000000 --- a/test/fixtures/test_grammars/reserved_words/corpus.txt +++ /dev/null @@ -1,101 +0,0 @@ -============== -Valid Code -============== - -if (a) { - var b = { - c: d, - e: f, - }; - while (g) { - h(); - } -} - ---- - -(program - (if_statement - (parenthesized_expression (identifier)) - (block - (var_declaration - (identifier) - (object - (pair (identifier) (identifier)) - (pair (identifier) (identifier)))) - (while_statement - (parenthesized_expression (identifier)) - (block (expression_statement (call_expression (identifier)))))))) - -================================================ -Error detected at globally-reserved word -================================================ - -var a = - -if (something) { - c(); -} - ---- - -(program - (ERROR (identifier)) - (if_statement - (parenthesized_expression (identifier)) - (block - (expression_statement (call_expression (identifier)))))) - -================================================ -Object keys that are reserved in other contexts -================================================ - -var x = { - if: a, - while: b, -}; - ---- - -(program - (var_declaration - (identifier) - (object - (pair (identifier) (identifier)) - (pair (identifier) (identifier))))) - -================================================ -Error detected at context-specific reserved word -================================================ - -var x = { -var y = z; - ---- - -(program - (ERROR (identifier)) - - ; Important - var declaration is still recognized, - ; because in this example grammar, `var` is a keyword - ; even within object literals. - (var_declaration - (identifier) - (identifier))) - -============================================= -Other tokens that overlap with keyword tokens -============================================= - -var a = /reserved-words-should-not-affect-this/; -var d = /if/; - ---- - -(program - (var_declaration - (identifier) - (regex (regex_pattern))) - (var_declaration - (identifier) - (regex (regex_pattern)))) diff --git a/test/fixtures/test_grammars/reserved_words/grammar.js b/test/fixtures/test_grammars/reserved_words/grammar.js deleted file mode 100644 index 74c88eea..00000000 --- a/test/fixtures/test_grammars/reserved_words/grammar.js +++ /dev/null @@ -1,67 +0,0 @@ -const RESERVED_NAMES = ["if", "while", "var"]; -const RESERVED_PROPERTY_NAMES = ["var"]; - -export default grammar({ - name: "reserved_words", - - reserved: { - global: $ => RESERVED_NAMES, - property: $ => RESERVED_PROPERTY_NAMES, - }, - - word: $ => $.identifier, - - rules: { - program: $ => repeat($._statement), - - block: $ => seq("{", repeat($._statement), "}"), - - _statement: $ => choice( - $.var_declaration, - $.if_statement, - $.while_statement, - $.expression_statement, - ), - - var_declaration: $ => seq("var", $.identifier, "=", $._expression, ";"), - - if_statement: $ => seq("if", $.parenthesized_expression, $.block), - - while_statement: $ => seq("while", $.parenthesized_expression, $.block), - - expression_statement: $ => seq($._expression, ";"), - - _expression: $ => choice( - $.identifier, - $.parenthesized_expression, - $.call_expression, - $.member_expression, - $.object, - $.regex, - ), - - parenthesized_expression: $ => seq("(", $._expression, ")"), - - member_expression: $ => seq($._expression, ".", $.identifier), - - call_expression: $ => seq($._expression, "(", repeat(seq($._expression, ",")), ")"), - - object: $ => seq("{", repeat(seq(choice($.pair, $.getter), ",")), "}"), - - regex: $ => seq('/', $.regex_pattern, '/'), - - regex_pattern: $ => token(prec(-1, /[^/\n]+/)), - - pair: $ => seq(reserved('property', $.identifier), ":", $._expression), - - getter: $ => seq( - "get", - reserved('property', $.identifier), - "(", - ")", - $.block, - ), - - identifier: $ => /[a-z_]\w*/, - }, -}); diff --git a/test/fixtures/test_grammars/start_rule_is_blank/grammar.js b/test/fixtures/test_grammars/start_rule_is_blank/grammar.js index 6fa28ae5..b38e0de0 100644 --- a/test/fixtures/test_grammars/start_rule_is_blank/grammar.js +++ b/test/fixtures/test_grammars/start_rule_is_blank/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'start_rule_is_blank', rules: { diff --git a/test/fixtures/test_grammars/start_rule_is_token/grammar.js b/test/fixtures/test_grammars/start_rule_is_token/grammar.js index 05742687..f00433ea 100644 --- a/test/fixtures/test_grammars/start_rule_is_token/grammar.js +++ b/test/fixtures/test_grammars/start_rule_is_token/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'start_rule_is_token', rules: { diff --git a/test/fixtures/test_grammars/unicode_classes/grammar.js b/test/fixtures/test_grammars/unicode_classes/grammar.js index 2aafdea4..25dcf13d 100644 --- a/test/fixtures/test_grammars/unicode_classes/grammar.js +++ b/test/fixtures/test_grammars/unicode_classes/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'unicode_classes', rules: { diff --git a/test/fixtures/test_grammars/unused_rules/grammar.js b/test/fixtures/test_grammars/unused_rules/grammar.js index 78020419..462243c8 100644 --- a/test/fixtures/test_grammars/unused_rules/grammar.js +++ b/test/fixtures/test_grammars/unused_rules/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'unused_rules', rules: { diff --git a/test/fixtures/test_grammars/uses_current_column/grammar.js b/test/fixtures/test_grammars/uses_current_column/grammar.js index 1e93f06b..795ad597 100644 --- a/test/fixtures/test_grammars/uses_current_column/grammar.js +++ b/test/fixtures/test_grammars/uses_current_column/grammar.js @@ -1,4 +1,4 @@ -export default grammar({ +module.exports = grammar({ name: 'uses_current_column', externals: $ => [ diff --git a/test/fuzz/README.md b/test/fuzz/README.md new file mode 100644 index 00000000..5adc1b04 --- /dev/null +++ b/test/fuzz/README.md @@ -0,0 +1,43 @@ +# Fuzzing tree-sitter + +The tree-sitter fuzzing support requires 1) the `libFuzzer` runtime library and 2) a recent version of clang + +## libFuzzer + +The main fuzzing logic is implemented by `libFuzzer` which is part of the compiler-rt project but is not shipped by distros. `libFuzzer` will need to be built from source, e.g.: + +``` +cd ~/src +git clone https://github.com/llvm-mirror/compiler-rt +cd compiler-rt/lib/fuzzer +./build.sh +``` + +## clang + +Using libFuzzer requires at least version 7 of `clang` and may _not_ work with your system-installed version. If your system-installed version is too old, the easiest way to get started is to use the version provided by the Chromium team. Instructions are available at [libFuzzer.info](http://libfuzzer.info). + +The fuzzers can then be built with: +``` +export CLANG_DIR=$HOME/src/third_party/llvm-build/Release+Asserts/bin +CC="$CLANG_DIR/clang" CXX="$CLANG_DIR/clang++" LINK="$CLANG_DIR/clang++" \ + LIB_FUZZER_PATH=$HOME/src/compiler-rt/lib/fuzzer/libFuzzer.a \ + ./script/build-fuzzers +``` + +This will generate a separate fuzzer for each grammar defined in `test/fixtures/grammars` and will be instrumented with [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html) and [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html). Individual fuzzers can be built with, for example, `./script/build-fuzzers python ruby`. + +The `run-fuzzer` script handles running an individual fuzzer with a sensible default set of arguments: +``` +./script/run-fuzzer (halt|recover) +``` + +which will log information to stdout. Failing testcases and a fuzz corpus will be saved to `fuzz-results/`. The most important extra `libFuzzer` options are `-jobs` and `-workers` which allow parallel fuzzing. This is can done with, e.g.: +``` +./script/run-fuzzer halt -jobs=32 -workers=32 +``` + +The testcase can be used to reproduce the crash by running: +``` +./script/reproduce (halt|recover) +``` diff --git a/test/fuzz/fuzzer.cc b/test/fuzz/fuzzer.cc new file mode 100644 index 00000000..3b933746 --- /dev/null +++ b/test/fuzz/fuzzer.cc @@ -0,0 +1,79 @@ +#include +#include +#include "tree_sitter/api.h" + +extern "C" const TSLanguage *TS_LANG(); + +static TSQuery *lang_query; + +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { + if(TS_LANG_QUERY_FILENAME[0]) { + // The query filename is relative to the fuzzing binary. Convert it + // to an absolute path first + auto binary_filename = std::string((*argv)[0]); + auto binary_directory = binary_filename.substr(0, binary_filename.find_last_of("\\/")); + auto lang_query_filename = binary_directory + "/" + TS_LANG_QUERY_FILENAME; + + auto f = std::ifstream(lang_query_filename); + assert(f.good()); + std::string lang_query_source((std::istreambuf_iterator(f)), std::istreambuf_iterator()); + + uint32_t error_offset = 0; + TSQueryError error_type = TSQueryErrorNone; + + lang_query = ts_query_new( + TS_LANG(), + lang_query_source.c_str(), + lang_query_source.size(), + &error_offset, + &error_type + ); + + assert(lang_query); + } + + return 0; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + const char *str = reinterpret_cast(data); + + TSParser *parser = ts_parser_new(); + + // This can fail if the language version doesn't match the runtime version + bool language_ok = ts_parser_set_language(parser, TS_LANG()); + assert(language_ok); + + TSTree *tree = ts_parser_parse_string(parser, NULL, str, size); + TSNode root_node = ts_tree_root_node(tree); + + if (lang_query != nullptr) { + { + TSQueryCursor *cursor = ts_query_cursor_new(); + + ts_query_cursor_exec(cursor, lang_query, root_node); + TSQueryMatch match; + while (ts_query_cursor_next_match(cursor, &match)) { + } + + ts_query_cursor_delete(cursor); + } + + { + TSQueryCursor *cursor = ts_query_cursor_new(); + + ts_query_cursor_exec(cursor, lang_query, root_node); + TSQueryMatch match; + uint32_t capture_index; + while (ts_query_cursor_next_capture(cursor, &match, &capture_index)) { + } + + ts_query_cursor_delete(cursor); + } + } + + ts_tree_delete(tree); + ts_parser_delete(parser); + + return 0; +} diff --git a/test/profile/heap.cc b/test/profile/heap.cc new file mode 100644 index 00000000..6c0027e8 --- /dev/null +++ b/test/profile/heap.cc @@ -0,0 +1,42 @@ +#include +#include +#include +#include + +extern "C" { +#include "javascript/src/parser.c" +#include "javascript/src/scanner.c" +} + +#define LANGUAGE tree_sitter_javascript +#define SOURCE_PATH "javascript/examples/jquery.js" + +int main() { + TSParser *parser = ts_parser_new(); + if (!ts_parser_set_language(parser, LANGUAGE())) { + fprintf(stderr, "Invalid language\n"); + exit(1); + } + + const char *source_path = GRAMMARS_DIR SOURCE_PATH; + + printf("Parsing %s\n", source_path); + + std::ifstream source_file(source_path); + if (!source_file.good()) { + fprintf(stderr, "Invalid source path %s\n", source_path); + exit(1); + } + + std::string source_code( + (std::istreambuf_iterator(source_file)), + std::istreambuf_iterator() + ); + + TSTree *tree = ts_parser_parse_string( + parser, + NULL, + source_code.c_str(), + source_code.size() + ); +} diff --git a/crates/xtask/Cargo.toml b/xtask/Cargo.toml similarity index 51% rename from crates/xtask/Cargo.toml rename to xtask/Cargo.toml index 17972317..4f270db2 100644 --- a/crates/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -11,21 +11,10 @@ keywords.workspace = true categories.workspace = true publish = false -[lints] -workspace = true - [dependencies] -anstyle.workspace = true -anyhow.workspace = true -bindgen = { version = "0.72.0" } -clap.workspace = true -etcetera.workspace = true +git2.workspace = true indoc.workspace = true -regex.workspace = true -schemars.workspace = true +toml.workspace = true semver.workspace = true +serde.workspace = true serde_json.workspace = true -tree-sitter-cli = { path = "../cli/" } -tree-sitter-loader = { path = "../loader/" } -notify = "8.2.0" -notify-debouncer-full = "0.6.0" diff --git a/xtask/src/bump.rs b/xtask/src/bump.rs new file mode 100644 index 00000000..02cda499 --- /dev/null +++ b/xtask/src/bump.rs @@ -0,0 +1,282 @@ +use std::{cmp::Ordering, path::Path}; + +use git2::{DiffOptions, Repository}; +use indoc::indoc; +use semver::{BuildMetadata, Prerelease, Version}; +use toml::Value; + +pub fn get_latest_tag(repo: &Repository) -> Result> { + let mut tags = repo + .tag_names(None)? + .into_iter() + .filter_map(|tag| tag.map(String::from)) + .filter_map(|tag| Version::parse(tag.strip_prefix('v').unwrap_or(&tag)).ok()) + .collect::>(); + + tags.sort_by( + |a, b| match (a.pre != Prerelease::EMPTY, b.pre != Prerelease::EMPTY) { + (true, true) | (false, false) => a.cmp(b), + (true, false) => Ordering::Less, + (false, true) => Ordering::Greater, + }, + ); + + tags.last() + .map(std::string::ToString::to_string) + .ok_or_else(|| "No tags found".into()) +} + +pub fn bump_versions() -> Result<(), Box> { + let repo = Repository::open(".")?; + let latest_tag = get_latest_tag(&repo)?; + let latest_tag_sha = repo.revparse_single(&format!("v{latest_tag}"))?.id(); + + let workspace_toml_version = fetch_workspace_version()?; + + if latest_tag != workspace_toml_version { + eprintln!( + indoc! {" + Seems like the workspace Cargo.toml ({}) version does not match up with the latest git tag ({}). + Please ensure you don't change that yourself, this subcommand will handle this for you. + "}, + workspace_toml_version, latest_tag + ); + return Ok(()); + } + + let mut revwalk = repo.revwalk()?; + revwalk.push_range(format!("{latest_tag_sha}..HEAD").as_str())?; + let mut diff_options = DiffOptions::new(); + + let current_version = Version::parse(&latest_tag)?; + let mut should_increment_patch = false; + let mut should_increment_minor = false; + + for oid in revwalk { + let oid = oid?; + let commit = repo.find_commit(oid)?; + let message = commit.message().unwrap(); + let message = message.trim(); + + let diff = { + let parent = commit.parent(0).unwrap(); + let parent_tree = parent.tree().unwrap(); + let commit_tree = commit.tree().unwrap(); + repo.diff_tree_to_tree( + Some(&parent_tree), + Some(&commit_tree), + Some(&mut diff_options), + )? + }; + + let mut source_code_changed = false; + diff.foreach( + &mut |delta, _| { + let path = delta.new_file().path().unwrap().to_str().unwrap(); + if path.ends_with("rs") || path.ends_with("js") || path.ends_with('c') { + source_code_changed = true; + } + true + }, + None, + None, + None, + )?; + + if source_code_changed { + should_increment_patch = true; + + let Some((prefix, _)) = message.split_once(':') else { + continue; + }; + + let convention = if prefix.contains('(') { + prefix.split_once('(').unwrap().0 + } else { + prefix + }; + + if ["feat", "feat!"].contains(&convention) || prefix.ends_with('!') { + should_increment_minor = true; + } + } + } + + let mut version = current_version.clone(); + if should_increment_minor { + version.minor += 1; + version.patch = 0; + version.pre = Prerelease::EMPTY; + version.build = BuildMetadata::EMPTY; + } else if should_increment_patch { + version.patch += 1; + version.pre = Prerelease::EMPTY; + version.build = BuildMetadata::EMPTY; + } else { + return Err(format!("No source code changed since {current_version}").into()); + } + + println!("Bumping from {current_version} to {version}"); + update_crates(¤t_version, &version)?; + update_makefile(&version)?; + update_npm(&version)?; + update_zig(&version)?; + tag_next_version(&repo, &version)?; + + Ok(()) +} + +fn tag_next_version( + repo: &Repository, + next_version: &Version, +) -> Result<(), Box> { + // first add the manifests + + let mut index = repo.index()?; + + for file in [ + "Cargo.toml", + "Cargo.lock", + "cli/Cargo.toml", + "cli/config/Cargo.toml", + "cli/loader/Cargo.toml", + "lib/Cargo.toml", + "highlight/Cargo.toml", + "tags/Cargo.toml", + "cli/npm/package.json", + "lib/binding_web/package.json", + "Makefile", + "build.zig.zon", + ] { + index.add_path(Path::new(file))?; + } + + index.write()?; + + let tree_id = index.write_tree()?; + let tree = repo.find_tree(tree_id)?; + let signature = repo.signature()?; + let parent_commit = repo.revparse_single("HEAD")?.peel_to_commit()?; + + let commit_id = repo.commit( + Some("HEAD"), + &signature, + &signature, + &format!("{next_version}"), + &tree, + &[&parent_commit], + )?; + + let tag = repo.tag( + &format!("v{next_version}"), + &repo.find_object(commit_id, None)?, + &signature, + &format!("v{next_version}"), + false, + )?; + + println!("Tagged commit {commit_id} with tag {tag}"); + + Ok(()) +} + +fn update_makefile(next_version: &Version) -> Result<(), Box> { + let makefile = std::fs::read_to_string("Makefile")?; + let makefile = makefile + .lines() + .map(|line| { + if line.starts_with("VERSION") { + format!("VERSION := {next_version}") + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n"; + + std::fs::write("Makefile", makefile)?; + + Ok(()) +} + +fn update_crates( + current_version: &Version, + next_version: &Version, +) -> Result<(), Box> { + let mut cmd = std::process::Command::new("cargo"); + cmd.arg("workspaces").arg("version"); + + if next_version.minor > current_version.minor { + cmd.arg("minor"); + } else { + cmd.arg("patch"); + } + + cmd.arg("--no-git-commit") + .arg("--yes") + .arg("--force") + .arg("*"); + + let status = cmd.status()?; + + if !status.success() { + return Err("Failed to update crates".into()); + } + + Ok(()) +} + +fn update_npm(next_version: &Version) -> Result<(), Box> { + for path in ["lib/binding_web/package.json", "cli/npm/package.json"] { + let package_json = + serde_json::from_str::(&std::fs::read_to_string(path)?)?; + + let mut package_json = package_json + .as_object() + .ok_or("Invalid package.json")? + .clone(); + package_json.insert( + "version".to_string(), + serde_json::Value::String(next_version.to_string()), + ); + + let package_json = serde_json::to_string_pretty(&package_json)? + "\n"; + + std::fs::write(path, package_json)?; + } + + Ok(()) +} + +fn update_zig(next_version: &Version) -> Result<(), Box> { + let zig = std::fs::read_to_string("build.zig.zon")?; + + let zig = zig + .lines() + .map(|line| { + if line.starts_with(" .version") { + format!(" .version = \"{next_version}\",") + } else { + line.to_string() + } + }) + .collect::>() + .join("\n") + + "\n"; + + std::fs::write("build.zig.zon", zig)?; + + Ok(()) +} + +/// read Cargo.toml and get the version +fn fetch_workspace_version() -> Result> { + let cargo_toml = toml::from_str::(&std::fs::read_to_string("Cargo.toml")?)?; + + Ok(cargo_toml["workspace"]["package"]["version"] + .as_str() + .unwrap() + .trim_matches('"') + .to_string()) +} diff --git a/xtask/src/main.rs b/xtask/src/main.rs new file mode 100644 index 00000000..80bbbdd5 --- /dev/null +++ b/xtask/src/main.rs @@ -0,0 +1,35 @@ +mod bump; + +use bump::bump_versions; + +fn print_help() { + println!( + " +xtask must specify a task to run. + +Usage: `cargo xtask ` + +Tasks: + bump-version +" + ); +} + +fn main() -> Result<(), Box> { + let Some(task) = std::env::args().nth(1) else { + print_help(); + std::process::exit(0); + }; + + match task.as_str() { + "bump-version" => { + bump_versions()?; + } + _ => { + println!("invalid task: {task}"); + std::process::exit(1); + } + } + + Ok(()) +}